文章目录

  • 一、Ansible delegate
    • 1.1 什么是Task委派
    • 1.2 TASK委派实践
    • 1.3 创建普通用户管理ansible
    • 1.4 ansible + haproxy实现代码滚动发布
  • 二、Ansible Vault 加密
    • 2.1 ansible vault 介绍
    • 2.2 ansible cault 应用
  • 三、Ansible jinjar2
    • 3.1 什么是jinja2
    • 3.2 Ansible如何使用jinja2
    • 3.3 jinja模板基本语法
    • 3.4 jinja模板逻辑关系
    • 3.5 jinjar2生成nginx配置文件
    • 3.6 Jinja2生成haproxy配置文件
    • 3.7 jinjar2 生成不同的keepalived配置文件
  • 四、Ansible Roles
    • 4.1 Roles基本概述
    • 4.2 Roles目录结构
    • 4.3 Roles依赖关系
    • 4.4 Roles编写思路
    • 4.5 Roles部署NFS
    • 4.6 Roles部署 rsync

一、Ansible delegate

1.1 什么是Task委派

简单来说,就是本来需要在当前 “被控制端主机” 执行的操作,被委派给其他主机执行。

1.2 TASK委派实践

场景说明:
1.为 172.16.1.7 服务器添加一条 hosts 记录: 1.1.1.1 aaa.com
2.同时要把这个 hosts 记录写一份至到 172.16.1.8 节点
3.除此任务以外 172.16.1.7 的其他任务都不会委派给 172.16.1.8 执行。

[root@web_62 delegate]# cat delegate1.yml
- hosts: 172.16.1.7tasks:- name: add webserver dnsshell: echo 1.1.1.1 aaa.com >> /etc/hosts- name: delegate to host 172.16.1.8shell: echo 1.1.1.1 aaa.com >> /etc/hostsdelegate_to: 172.16.1.8- name: add webserver dnsshell: echo 2.2.2.2 bbb.com >> /etc/hosts

1.3 创建普通用户管理ansible

管理端:
1.创建用户;
2.创建公钥和私钥:

被控端:
1.创建用户;
2.接受控制端发来的公钥信息;
3.添加sudo权限;

[root@web_62 delegate]# cat delegate_user.yml
- hosts: webserversvars:- user_admin: xiaoming- password: $6$f6CFBj5d4J/QLCzj$SJb.acD0wJG/tQUL.sgR6eSPQ8y6h/wUF3wIzKlemXZ32v6RIp7C1i7R.9P4uuAesz1ETvN2mpVJvx7R/MI5x.tasks:- name: create useruser:name: "{{ user_admin}}"password: "{{ password }}"generate_ssh_key: yesssh_key_bits: 2048ssh_key_file: .ssh/id_rsaregister: user_messagedelegate_to: localhost # 委派本机执行run_once: true  # 执行一次- name: output user_messagedebug:msg: "{{user_message.ssh_public_key}}" # 查看公钥- name: create remote useruser:name: "{{ user_admin}}"password: "{{ password }}"- name: create directoryfile: path: "/home/{{user_admin}}/.ssh"owner: "{{user_admin}}"group: "{{user_admin}}"mode: "0700"state: directoryrecurse: yes- name: write pub_key to remotecopy:dest: "/home/{{user_admin}}/.ssh/authorized_keys"content: "{{user_message.ssh_public_key}}"owner: "{{user_admin}}"group: "{{user_admin}}"mode: "0600"- name: add sudolineinfile:dest: /etc/sudoersline: "{{ user_admin }} ALL=(ALL) NOPASSWD:ALL"

如果想为不同的用户创建账号,只需要参数后带上名称即可。

[root@web_62 delegate]# ansible-playbook delegate_user.yml -e "user_admin=jiaruohan"

1.4 ansible + haproxy实现代码滚动发布

步骤:

1.首先搭建 Haproxy + web_cluster 集群环境。
2.当 web 节点代码需要更新时,需要下线节点,这个时候需要将下线节点的任务委派给Haproxy
3.操作 web_cluster 集群,将新的代码替换上
4.当 web 节点代码更新成功后,需要上线节点,这个时候需要将上线节点的任务委派给Haproxy
5.然后依次循环,直到完成所有节点的代码更新与替换

目录结构:

[root@web_62 haproxy]# tree -L 1
.
├── ansible.cfg
├── haproxy.cfg.j2
├── haproxy.yml
├── hosts
├── install_haproxy.yml
├── nginx.yml
└── test.conf.j2
  1. nginx.yml文件
[root@web_62 haproxy]# cat nginx.yml
- hosts: webserverstasks: - name: web_sit_codecopy:content: "App version {{ ansible_eth1.ipv4.address.split('.')[-1]}}"dest: /opt/index.html- name: configure nginxcopy:src: ./test.conf.j2dest: /etc/nginx/conf.d/test.confnotify: Restart nginx server- name: start nginxsystemd:name: nginxstate: startedhandlers:- name: Restart nginx server systemd:name: nginxstate: restarted

test.conf.j2

root@web_62 haproxy]# cat test.conf.j2
server {listen 5555;server_name ansible.bertwu.net;root /opt;location / {index index.html;}}
  1. install_haproxy.yml文件:
[root@web_62 haproxy]# cat install_haproxy.yml
- hosts: testtasks:- name: configure haproxy_cfgcopy:src: ./haproxy.cfg.j2dest: /etc/haproxy/haproxy.cfgnotify: Restart haproxy- name: start haproxysystemd:name: haproxystate: startedhandlers:- name: Restart haproxysystemd:name: haproxystate: restarted

haproxy.cfg.j2

[root@web_62 haproxy]# cat haproxy.cfg.j2 globallog         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemonstats socket /var/lib/haproxy/stats level adminnbthread 8
defaultsmode                    httplog                     globaloption                  httplogoption                  dontlognulloption http-server-close#option forwardfor       except 127.0.0.0/8option                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000listen haproxy-statsmode httpbind *:7777stats enablestats refresh 1s stats hide-versionstats uri /haproxy?statsstats realm "HAProxy stats"stats auth admin:123456stats admin if TRUEfrontend webbind *:80mode httpacl ansible_domain hdr_reg(host) -i ansible.bertwu.netuse_backend web_cluster if ansible_domainbackend web_clusterbalance roundrobinserver 172.16.1.7 172.16.1.7:5555 check server 172.16.1.8 172.16.1.8:5555 check server 172.16.1.9 172.16.1.9:5555 check

3.haproxy.yml文件:

[root@web_62 haproxy]# cat haproxy.yml
- hosts: webserversserial: 1tasks:- name: printdebug:msg: "{{inventory_hostname}}"- name: download {{inventory_hostname}}haproxy:state: disabledhost: '{{ inventory_hostname }}'socket: /var/lib/haproxy/statsbackend: wwwdelegate_to: 172.16.1.99- name: sleepshell: sleep 5- name: Update nginx codecopy:content: "New version {{ansible_eth1.ipv4.address.split('.')[-1]}}"dest: /opt/index.html- name: upload {{inventory_hostname}}haproxy:state: enabledhost: '{{ inventory_hostname }}'socket: /var/lib/haproxy/statsbackend: web_clusterwait: yesdelegate_to: 172.16.1.99

4.测试。略

二、Ansible Vault 加密

2.1 ansible vault 介绍

Ansible Vault可以将敏感的数据文件进行加密,而非存放在明文的 playbooks中;比如:部分playbook内容中有明文密码信息,可以对其进行加密操作;后期只有输入对应的密码才可以查看、编辑或执行该文件,如没有密码则无法正常运行;

2.2 ansible cault 应用

1.使用 ansible-vault-2 encrypt 对haproxy.yml文件进行加密文件

[root@web_62 haproxy]# ansible-vault
ansible-vault      ansible-vault-2    ansible-vault-2.7
[root@web_62 haproxy]# ansible-vault-2 encrypt haproxy.yml
New Vault password:
Confirm New Vault password:
Encryption successful# 无权限执行
[root@web_62 haproxy]# ansible-playbook haproxy.yml
ERROR! Attempting to decrypt but no vault secrets found

2.使用 ansible-vault view 查看加密的文件

[root@web_62 haproxy]# ansible-vault view haproxy.yml
Vault password: 

3.使用 ansible-vault edit 编辑加密的文件

[root@web_62 haproxy]# ansible-vault edit haproxy.yml
Vault password:

4.使用 ansible-vault rekey 改变加密的文件

[root@web_62 haproxy]# ansible-vault rekey haproxy.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful

5.执行加密的yml

[root@web_62 haproxy]# ansible-playbook haproxy.yml --ask-vault-pass

6.可以指定密码文件,避免重复输入密码

[root@web_62 haproxy]# echo "123" >> passwd.txt
[root@web_62 haproxy]# ansible-vault edit haproxy.yml --vault-password=passwd.txt

7.执行加密的 playbook 方法如下

[root@web_62 haproxy]# ansible-playbook haproxy.yml --vault-password=passwd.txt

8.可以在在 ansible.cfg 里新增 vault_password_file 参数,并指定密码文件路径。

[root@web_62 haproxy]# vim ansible.cf
vault_password_file= ./passwd.txt

9 使用ansible-vault decrypt 取消密码

[root@web_62 haproxy]# ansible-vault decrypt haproxy.yml

三、Ansible jinjar2

3.1 什么是jinja2

  • Jinja2 是 Python 的模板引擎
  • Ansible 需要使用 Jinja2 模板来修改被管理主机的配置文件。

例如:给10台主机装上Nginx服务,但是要求每台主机的端口都不一样,如何解决?

3.2 Ansible如何使用jinja2

ansible 使用 jinja2 模板需要借助 template 模块实现,那 template 模块是用来做什么的?
template 模块和 copy 模块完全一样,都是拷贝文件至远程主机,区别在于template 模块会解析要拷贝的文件中变量的值,而 copy 则是原封不动的将文件拷贝至被控端。

3.3 jinja模板基本语法

  1. 要想在配置文件中使用jinja2,playbook中的tasks必须使用template模块。
  2. 配置文件里面使用变量,比如 {{ port }} 或使用 {{ facts 变量 }}

3.4 jinja模板逻辑关系

1.循环表达式—生成nginx负载均衡,haproxy负载均衡等;

{% for i in EXPR %}...
{% endfor %}

2.判断表达式 --keepalived配置文件

{% if EXPR %}...
{% elif EXPR %}...
{% endif%}

3.注释

{# COMMENT #}

3.5 jinjar2生成nginx配置文件

1.模板配置文件如下:

[root@web_62 jinjar2]# cat nginx_lb.conf.j2
upstream webservers {{% for host in groups["webservers"] %}  # webservers组中的hostserver {{ host }}:{{web_port}}{% endfor %}
}server {listen {{ http_port }};server_name {{server_name}};location / {proxy_pass http://webservers;proxy_set_header Host $http_host;}
}

2.nginx.yml文件如下:

[root@web_62 jinjar2]# cat nginx.yml
- hosts: webserversvars:- web_port: 80- http_port: 80- server_name: jinjar2.comtasks:- name: copy nginx configuretemplate:src: ./nginx_lb.conf.j2dest: /tmp/nginx.conf

3.推送到目标端的配置文件渲染如下:符合预期

upstream webservers {server 172.16.1.7:80server 172.16.1.8:80server 172.16.1.9:80}server {listen 80;server_name jinjar2.com;location / {proxy_pass http://webservers;proxy_set_header Host $http_host;}
}

3.6 Jinja2生成haproxy配置文件

1.配置模板文件如下:

[root@web_62 jinjar2]# cat haproxy.cfg.j2
globallog         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemon# turn on stats unix socketstats socket /var/lib/haproxy/stats level adminnbthread 8
defaultsmode                    httplog                     globaloption                  httplogoption                  dontlognulloption http-server-close#option forwardfor       except 127.0.0.0/8option                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000listen haproxy-statsmode httpbind *:7777stats enablestats refresh 1s stats hide-versionstats uri /haproxy?statsstats realm "HAProxy stats"stats auth admin:123456stats admin if TRUEfrontend webbind *: {{http_port}}mode httpacl ansible_domain hdr_reg(host) -i {{ server_domain }}use_backend web_cluster if ansible_domainbackend web_clusterbalance roundrobin{% for host in groups['webservers'] %}server {{ host}} {{ host }}:{{web_cluster_port}} check{% endfor %}

2.haproxy.yml 文件如下:

root@web_62 jinjar2]# cat haproxy.yml
- hosts: lbserversvars:- http_port: 80- web_cluster_port: 8787- server_domain: ansible.bertwu.nettasks:- name: copy haproxy configuretemplate:src: ./haproxy.cfg.j2 dest: /tmp

3.目标端渲染结果如下:

[root@proxy01 tmp]# vim haproxy.cfg.j2 option http-server-close#option forwardfor       except 127.0.0.0/8option                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000listen haproxy-statsmode httpbind *:7777stats enablestats refresh 1sstats hide-versionstats uri /haproxy?statsstats realm "HAProxy stats"stats auth admin:123456stats admin if TRUEfrontend webbind *: 80mode httpacl ansible_domain hdr_reg(host) -i ansible.bertwu.netuse_backend web_cluster if ansible_domainbackend web_clusterbalance roundrobinserver 172.16.1.7 172.16.1.7:8787 checkserver 172.16.1.8 172.16.1.8:8787 checkserver 172.16.1.9 172.16.1.9:8787 check

3.7 jinjar2 生成不同的keepalived配置文件

方式1: 准备两个配置文件,然后为不同的主机推送不同的配置文件

判断:keepalived.confA:Master;B:Slave;1.准备两个配置文件 keepalived-master.conf   keepalived-backup.conf;- name: copy:src: keepalived-master.confdest: /etc/keepalived.confwhen: ( ansible_hostname is match ("proxy01") )- name: copy:src: keepalived-backup.confdest: /etc/keepalived.confwhen: ( ansible_hostname is match ("proxy02") )

方式2: 准备一个配置文件,为每个主机设定相同的变量,不同的值;

[lbservers]172.16.1.5 state=MASTER 172.16.1.6 state=BACKUPkeepalived.confstate {{ state }}

3.通过jinja判断来实现,不需要设定任何的变量;

[root@proxy01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {     router_id {{ ansible_hostname }}                  # 当前物理设备的标识名称
}vrrp_instance VI_1 {{% if ansible_hostname == "proxy01" %}state MASTER                    # 角色状态;priority 200                    # 当前物理节点在虚拟路由中的优先级;{% elif ansible_hostname == "proxy02" %}state BACKUP                    # 角色状态;priority 100                    # 当前物理节点在虚拟路由中的优先级;{% endif %}interface eth0 eth1             # 绑定当前虚拟路由使用的物理接口;virtual_router_id 50            # 当前虚拟路由标识,VRID;advert_int 3                    # vrrp通告时间间隔,默认1s;authentication {auth_type PASS              # 密码类型,简单密码;auth_pass 1111              # 密码不超过8位字符;}virtual_ipaddress {10.0.0.100  dev eth0 lable eth0:0      # VIP地址}
}

四、Ansible Roles

4.1 Roles基本概述

Roles是组织playbook最好的一种方式,它基于一个已知的文件结构,去自动的加载 vars,tasks 以及handlers, 以便 playbook 更好的调用。roles 相比playbook 的结构更加的清晰有层次,但 roles 要比playbook 稍微麻烦一些;

比如:安装任何软件都需要先安装时间同步服务,那么每个 playbook 都要编写时间同步服务的task,会显得整个配置比较臃肿,且难以维护;
如果使用Roles我们则可以将时间同步服务 task 任务编写好,等到需要使用的时候进行调用就行了,减少重复编写task带来的文件臃肿;

4.2 Roles目录结构

roles 官方目录结构,必须按如下方式定义。在每个目录中必须有 main.yml 文件

[root@web_62 roles]# mkdir web/{vars,tasks,templates,handlers,files,meta} -p
[root@web_62 roles]# tree
.
└── web             # 角色名称├── files       # 文件存放目录├── handlers    # 触发任务├── meta        # 依赖关系├── tasks       # 任务├── templates   # 模板文件└── vars        # 变量

4.3 Roles依赖关系

roles 允许在使用时自动引入其他 role,role依赖关系存储在 meta/main.yml 文件中。

例如: 安装 wordpress 项目时:
1.需要先确保 nginx 与 php-fpm 的 role都能正常运行
2.然后在 wordpress 的 role 中定义,依赖关系
3.依赖的 role 有 nginx 以及 php-fpm

#wordpress依赖nginx与php-fpm的role
[root@m01 playbook]# cat
/root/roles/wordpress/meta/main.yml
---
dependencies:
- { role: nginx }
- { role: php-fpm }

wordpress 的 role 会先执行 nginx、php-fpm 的role,最后在执行wordpress 本身

4.4 Roles编写思路

1.创建 roles 目录结构,手动创建或使用 ansible-galaxy role init test
2.编写 roles 的功能,也就是 tasks
3.最后 playbook 引用 roles 编写好的 tasks

4.5 Roles部署NFS

1.创建nfs-server角色

root@manager roles]# mkdir nfs-server/{tasks,templates,handlers,files} -p
[root@manager roles]# mkdir group_vars
[root@manager roles]# touch group_vars/all# 文件目录结构
[root@manager roles]# tree
.
├── group_vars
│   └── all
└── nfs-server├── files├── handlers├── tasks└── templates

2.编写任务

[root@manager roles]# tree
.
├── ansible.cfg
├── group_vars  # 变量
│   └── all
├── hosts
├── nfs-server  # 角色
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── tasks
│   │   └── main.yml
│   └── templates
│       └── exports.j2
└── top.yml

各个文件内容如下:

# 可以为不同集群写多个hosts
[root@manager roles]# cat top.yml
- hosts: testroles:- role: nfs-server[root@manager roles]# cat nfs-server/tasks/main.yml
- name: install nfs serveryum:name: nfs-utilsstate: present- name: create groupgroup:name: "{{nfs_group}}"gid: "{{nfs_gid}}"state: present- name: create useruser:name: "{{nfs_user}}"uid: "{{nfs_uid}}"state: presentshell: /sbin/nologincreate_home: no- name: create nfs share dirfile:path: "{{nfs_share_dir}}"owner: "{{nfs_user}}"group: "{{nfs_group}}"state: directoryrecurse: yes- name: configure nfs servertemplate:src: exports.j2dest: /etc/exportsnotify: restat nfs server- name: start nfs serversystemd:name: nfsstate: startedenabled: yes[root@manager roles]# cat nfs-server/handlers/main.yml
- name: restat nfs serversystemd:name: nfsstate: restarted[root@manager roles]# cat nfs-server/templates/exports.j2
# /ansible_data 172.16.1.0/24(rw,sync,all_squash,anonuid=6666,anongid=666){{nfs_share_dir}} {{nfs_allow_ip_range}}(rw,sync,all_squash,anonuid={{nfs_uid}},anongid={{nfs_gid}})[root@manager roles]# cat group_vars/all
nfs_share_dir: /nfs_share_data
nfs_allow_ip_range: 172.16.1.0/24
nfs_uid: 6666
nfs_gid: 6666
nfs_user: www
nfs_group: www

4.6 Roles部署 rsync

1.创建rsync-server 角色

root@manager roles]# mkdir rsync-server/{tasks,templates,handlers,files} -p
目录结构如下:
[root@manager roles]# tree
.
├── ansible.cfg
├── group_vars
│   └── all
├── hosts
├── rsync-server
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── tasks
│   │   └── main.yml
│   └── templates
│       └── rsyncd.conf.j2
└── top.yml

各个目录文件内容如下:

[root@manager roles]# cat top.yml
- hosts: testroles:#- role: nfs-server- role: rsync-server[root@manager roles]# cat rsync-server/tasks/main.yml
- name: install rsync serveryum:name: rsyncstate: present- name: create groupgroup: name: "{{rsync_group}}"state: presentsystem: yes- name: create rsync useruser:name: "{{rsync_user}}"group: "{{rsync_group}}"system: yes- name: copy vartual_user passwd filecopy:content: "{{rsync_virtual_user}}:123"dest: "{{rsync_virtual_path}}"mode: 0600
- name: create rsync_module_name dirfile:path: "/{{rsync_module_name}}"owner: "{{rsync_user}}"group: "{{rsync_group}}"state: directoryrecurse: yes- name: configure rsynctemplate:src: rsyncd.conf.j2dest: /etc/rsyncd.confnotify: restart rsyncd server- name: start rsyncd serversystemd:name: rsyncdstate: startedenabled: yes[root@manager roles]# cat rsync-server/templates/rsyncd.conf.j2
uid = {{rsync_user}}
gid = {{rsync_group}}
port = {{rsync_port}}
fake super = yes
use chroot = no
max connections = {{rsync_max_conn}}
timeout = 600
ignore errors
read only = false
list = true
log file = /var/log/rsyncd.log
auth users = {{rsync_virtual_user}}
secrets file = {{ rsync_virtual_path}}
[{{rsync_module_name}}]
path = /{{rsync_module_name}}[root@manager roles]# cat rsync-server/handlers/main.yml
- name: restart rsyncd serversystemd:name: rsyncdstate: restarted[root@manager roles]# cat group_vars/all # nfs
nfs_share_dir: /nfs_share_data
nfs_allow_ip_range: 172.16.1.0/24
nfs_uid: 6666
nfs_gid: 6666
nfs_user: www
nfs_group: www# rsync
rsync_user: rsync
rsync_group: rsync
rsync_port: 873
rsync_max_conn: 200
rsync_virtual_user: rsync_backup
rsync_virtual_path: /etc/rsync.passwd
rsync_module_name: backup

ansible jinjia模板、委派与角色相关推荐

  1. 【ansible4】Ansible中的变量及加密(jinjia模板使用等,图文详解)

    Ansible中的变量及加密 一.变量的设定 一.变量命名规则 二.变量级别 三.变量设定和使用方式 二.JINJIA2模板 一.简介 二.使用方法 三.jinjia2模板的for循环,if用法 一. ...

  2. scvmm2008R2创建委派管理员角色

    System Center Virtual Machine Manager (VMM) 2008 R2采用基于角色的用户管理,以便更好地控制虚拟化环境中各帐户所能执行的操作.角色定义了其包含的用户,可 ...

  3. Flask入门之Jinjia模板的一些语法

    原文:https://www.cnblogs.com/wongbingming/p/6807771.html Flask入门之Jinjia模板的一些语法 1. 变量表示 {{ argv }} 2. 赋 ...

  4. ansible 的任务委派功能(delegate_to)

    今天遇到这样一个需求:在对A服务器执行一个操作任务的时候,同时也要把该操作任务在B服务器执行,如在A服务器添加一条hosts 记录: 1.1.1.1 abc.com .这个必须是要在一个 playbo ...

  5. python 根据jinjia模板写excle

    python 更具jinjia 模板写excel文件,需要安装python 的一个包. pip install xlsxtpl 写excle 模板,jinjia 语法. 代码如下: import os ...

  6. ansible的安装和ansible的模板

    文章目录 一:Ansible概述 二: ansible 的环境安装部署 2.1 管理端安装ansible 2.2 ansible的目录结构 2.3 配置主机清单 2.4 配置密钥对验证 三 ansib ...

  7. Ansible Jinja2 模板

    1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的? jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? t ...

  8. Linux-saltstack-4 jinjia模板得基本使用

    文章目录 一.简介 二.jinja2语法 1.jinja2变量 1.1 配置文件中使用jinja变量 1.2在脚本中定义jinja变量 1.3在脚本中设置grains变量 例子1:单值 例子2:多值 ...

  9. ansible j2模板配置示例

    <!-- 指定namenodes的名称 --> <property> <name>dfs.ha.namenodes.{{ dfs_cluster_name }}&l ...

最新文章

  1. python mysql gcc_MySQL-python “error: command 'gcc' failed with exit status 1”错误
  2. Oracle Execute Plan原理分析与实例分享之一
  3. 字段定义_逐浪CMS对用户注册字段正则的自由定义(注册字段必填)
  4. BZOJ1018 | SHOI2008-堵塞的交通traffic——线段树维护区间连通性+细节
  5. 线程加入 java 1615477815
  6. pika集群水平扩展——让性能容量不再受限
  7. 微信又双叒更新7.0.10,除了黑暗模式,还有这些实用功能!
  8. Hyper-V 2016 系列教程29 主流品牌服务器的BIOS的虚拟化相关设定
  9. uvm 形式验证_6.小白学uvm验证 - 寄存器模型
  10. ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件
  11. ChartControl控件绘制折线图
  12. [AHK]--显示器输入源快速切换
  13. vue + echarts 省份地图 以及打包后地图加载不出来(比较详细)
  14. 我用python实现了一个量化选股程序
  15. 太厉害了!我用 Nginx 提升系统10倍性能
  16. 【seq2seq】深入浅出讲解seq2seq神经网络模型
  17. 终于有人把3D打印讲明白了
  18. [Mongodb 5.0]将副本集中的Secondary节点变为Arbiter节点
  19. 企业信息化整体解决方案
  20. 老子《道德经》第六十二章

热门文章

  1. 为什么要认定科技型中小企业,认定后有什么优势
  2. python代码调试模式运行
  3. 关于mac下iterm2无权访问桌面的解决方案(ls .: Operation not permitted)
  4. 几种常见的路由负载均衡算法
  5. 对路径“”的访问被拒绝
  6. linux必知必会-du命令
  7. 《原创lightroom 4中文视频教程【高清包】》(lightroom4 video tutorials)更新至22集[MP4]
  8. CSS列表中list-style-position inside 和outside 的区别?
  9. PS制作德罗斯特效应效果
  10. K8S从私有仓库拉取镜像