ansible的playbook采用yaml语法,它简单地实现了json格式的事件描述。yaml之于json就像markdown之于html一样,极度简化了json的书写。在学习ansible playbook之前,很有必要把yaml的语法格式、引用方式做个梳理。

1.1 初步说明

以一个简单的playbook为例,说明yaml的基本语法。

---
- hosts: 192.168.100.59,192.168.100.65
remote_user: root
pre_tasks:
- name: set epel repo for Centos
yum_repository:
name: epel7
description: epel7 on CentOS
baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
gpgcheck: no
enabled: True
tasks:
# install nginx and run it
- name: install nginx
yum: name=nginx state=installed update_cache=yes
- name: start nginx
service: name=nginx state=started
post_tasks:
- shell: echo "deploy nginx over"
register: ok_var
- debug: msg="{{ ok_var.stdout }}"

1、yaml文件以---开头,以表明这是一个yaml文件,就像xml文件在开头使用<?xml version="1.0" encoding="utf-8"?>宣称它是xml文件一样。但即使没有使用---开头,也不会有什么影响。

2、yaml中使用"#"作为注释符,可以注释整行,也可以注释行内从"#"开始的内容。

3、yaml中的字符串通常不用加任何引号,即使它包含了某些特殊字符。但有些情况下,必须加引号,最常见的是在引用变量的时候。具体见后文。

4、关于布尔值的书写格式,即true/false的表达方式。其实playbook中的布尔值类型非常灵活,可分为两种情况:

5、模块的参数: 这时布尔值作为字符串被ansible解析。接受yes/on/1/true/no/off/0/false,这时被ansible解析。例如上面示例中的update_cache=yes。

6、非模块的参数: 这时布尔值被yaml解释器解析,完全遵循yaml语法。接受不区分大小写的true/yes/on/y/false/no/off/n。例如上面的gpgcheck=no和enabled=True。

建议遵循ansible的官方规范,模块的布尔参数采用yes/no,非模块的布尔参数采用True/False。

1.2 列表

使用"- "(减号加一个或多个空格)作为列表项,也就是json中的数组。yaml的列表在playbook中极重要,必须得搞清楚它的写法。

例如:

- zhangsan

- lisi

- wangwu

还支持内联写法:使用中括号。

[zhangsan,lisi,wangwu]

它们等价于json格式的:

[

"zhangsan",

"lisi",

"wangwu"

]

再例如:

- 班名: 初中1班

人数: 35

班主任: 隔壁老张

今天的任务: 扫操场

- 班名: 初中2班

人数: 38

班主任: 隔壁老王

今天的任务: 搬桌子

具体在ansible playbook中,列表所描述的是局部环境,它不一定要有名称,不一定要从同一个属性开始,只要使用"- ",它就表示圈定一个范围,范围内的项都属于该列表。例如:

---
- name: list1 # 列表1,同时给了个名称
hosts: localhost # 指出了hosts是列表1的一个对象
remote_user: root # 列表1的属性
tasks: # 还是列表1的属性
- hosts: 192.168.100.65 # 列表2,但是没有为列表命名,而是直入主题
remote_user: root
sudo: yes
tasks:

唯一要注意的是,每一个playbook中必须包含"hosts"和"tasks"项。更严格地说,是每个play的顶级列表必须包含这两项。就像上面的例子中,就表示该playbook中包含了两个play,每个play的顶级列表都包含了hosts和tasks。其实绝大多数情况下,一个playbook中都只定义一个play,所以只有一个顶级列表项。顶级列表的各项,其实可以将其看作是ansible-playbook运行时的选项。

另外,playbook中某项是一个动作、一个对象或一个实体时,一般都定义成列表的形式。见下文。

1.3 字典

官方手册上这么称呼,其实就是key=value的另一种写法。使用"冒号+空格"分隔,即key: value。它一般当作列表项的属性。

例如:

- 班名: 初中1班

人数:

总数: 35

男: 19

女: 16

班主任:

大名: 隔壁老张

这厮多大: 39

这厮任教多少年: 15

今天的任务: 扫操场

- 班名: 初中2班

人数:

总数: 38

男: 19

女: 19

班主任:

大名: 隔壁老王

这厮多大: 30

喜调戏女老师: True

今天的任务: 搬桌子

未完成任务怎么办:

- 继续搬,直到完成

- 写检讨

具体到playbook中,一般"虚拟性"的内容都可以通过字典的方式书写,而实体化的、动作性的、对象性的内容则应该定义为列表形式。

---
- hosts: localhost # 列表1
remote_user: root
tasks:
- name: test1 # 子列表,下面是shell模块,是一个动作,所以定义为列表,只不过加了个name
shell: echo /tmp/a.txt
register: hi_var
- debug: var=hi_var.stdout # 调用模块,这是动作,所以也是列表
- include: /tmp/nginx.yml # 同样是动作,包含文件
- include: /tmp/mysql.yml
- copy: # 调用模块,定义为列表。但模块参数是虚拟性内容,应定义为字典而非列表
src: /etc/resolv.conf # 模块参数1
dest: /tmp # 模块参数2 - hosts: 192.168.100.65 # 列表2
remote_user: root
vars:
nginx_port: # 定义变量,是虚拟性的内容,应定义为字典而非列表
mysql_port:
vars_files:
- nginx_port.yml # 无法写成key/value格式,且是实体文件,因此定义为列表
tasks:
- name: test2
shell: echo /tmp/a.txt
register: hi_var # register是和最近一个动作绑定的
- debug: var=hi_var.stdout

从上面示例的copy模块可以得出,模块的参数是虚拟性内容,也能使用字典的方式定义。

字典格式的key/value,也支持内联格式写法:使用大括号。

{大名: 隔壁老王,这厮多大: 30,喜调戏女老师: True}

{nginx_port: 80,mysql_port: 3306}

这等价于json格式的:

{

"大名": "隔壁老王",

"这厮多大": 30,

"喜调戏女老师": "True"

}

{

"nginx_port": 80,

"mysql_port": 3306

}

再结合其父项,于是转换成json格式的内容:

"班主任": {

"大名": "隔壁老王",

"这厮多大": 30,

"喜调戏女老师": "True"

}

"vars": {

"nginx_port": 80,

"mysql_port": 3306

}

再加上列表项(使用中括号),于是:

[

{

"hosts": "192.168.100.65",

"remote_user": "root",

"vars": {

"nginx_port": 80,

"mysql_port": 3306

},

"vars_files": [

"nginx_port.yml"

],

"tasks": [

{

"name": "test2",

"shell": "echo /tmp/a.txt",

"register": "hi_var"

},

{

"debug": "var=hi_var.stdout"

}

]

}

]

1.4 分行写

playbook中有3种方式进行续行。

  • 在"key: "的后面使用大于号。
  • 在"key: "的后面使用竖线。这种方式可以像脚本一样写很多行语句。
  • 多层缩进。

例如,下面的3中方法。

---
- hosts: localhost
tasks:
- shell: echo >>/tmp/test.txt
creates=/tmp/haha.txt # 比模块shell缩进更多
- shell: > # 在"key: "后使用大于号
echo >>/tmp/test.txt
creates=/tmp/haha.txt
- shell: | # 指定多行命令
echo >>/tmp/test.txt
echo >>/tmp/test.txt
args:
creates: /tmp/haha.txt

1.5 向模块传递参数

模块的参数一般来说是key=value格式的,有3种传递的方式:

  • 直接写在模块后,此时要求使用"key=value"格式。这是让ansible内部去解析字符串。因为可分行写,所以有多种写法。
  • 写成字典型,即"key: value"。此时要求多层缩进。这是让yaml去解析字典。
  • 使用内置属性args,然后多层缩进定义参数列表。这是让ansible明确指定用yaml来解析。

例如:

---
- hosts: localhost
tasks:
- yum: name=unix2dos state=installed # key=value直接传递
- yum:
name: unxi2dos
state: installed # "key: value"字典格式传递
- yum:
args: # 使用args传递
name: unix2dos
state:installed

但要注意,当模块的参数是free_form时,即格式不定,例如shell和command模块指定要执行的命令,它无法写成key/value格式,此时不能使用上面的第二种方式。也就是说,下面第一个模块是正确的,第二个模块是错误的,因为shell模块的命令"echo haha"是自由格式的,无法写成key/value格式。

---
- hosts: localhost
tasks:
- yum:
name: unxi2dos
state: installed
- shell:
echo haha
creates: /tmp/haha.txt

所以,调用一个模块的方式就有了多种形式。例如:

---
- hosts: localhost
tasks:
- shell: echo >/tmp/test.txt creates=/tmp/haha.txt
- shell: echo >>/tmp/test.txt
creates=/tmp/haha.txt
- shell: echo >>/tmp/test.txt
args:
creates: /tmp/haha.txt
- shell: >
echo >>/tmp/test.txt
creates=/tmp/haha.txt
- shell: |
echo 5.1 >>/tmp/test.txt
echo 5.2 >>/tmp/test.txt
args:
creates: /tmp/haha.txt
- yum:
name: dos2unix
state: installed

1.6 playbookplay的关系

一个playbook中可以包含多个play。每个play都至少包含有tasks和hosts这两项,还可以包含其他非必须项,如vars,vars_files,remote_user等。tasks中可以通过模块调用定义一系列的action。只不过,绝大多数时候,一个playbook都只定义一个play。

所以,大致关系为:

  • playbook: [play1,play2,play3]
  • play: [hosts,tasks,vars,remote_user...]
  • tasks: [module1,module2,...]

也就是说,每个顶级列表都是一个play。例如,下面的playbook中包含了两个play。

---
- name: list1
hosts: localhost
remote_user: root
tasks: - hosts: 192.168.100.65
remote_user: root
sudo: yes
tasks:

需要注意,有些时候play中使用了role,可能看上去没有tasks,这是因为role本身就是整合playbook的,所以没有也没关系。但没有使用role的时候,必须得包含hosts和tasks。例如:

---
- hosts: centos
remote_user: root
pre_tasks:
- name: config the yum repo for centos
yum_repository:
name: epel
description: epel
baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
gpgcheck: no
when: ansible_distribution_major_version == "" - name: config the yum repo for centos
yum_repository:
name: epel
description: epel
baseurl: http://mirrors.aliyun.com/epel/6/$basearch/
gpgcheck: no
when: ansible_distribution_major_version == "" roles:
- nginx
post_tasks:
- shell: echo 'deploy nginx/mysql over'
register: ok_var
- debug: msg='{{ ok_var.stdout }}'

1.7 playbook中什么时候使用引号

playbook中定义的都是些列表和字典。绝大多数时候,都不需要使用引号,但有两个特殊情况需要考虑使用引号。

  • 出现大括号"{}"。
  • 出现冒号加空格时": "。

大括号要使用引号包围,是因为不使用引号时会被yaml解析成内联字典。例如要使用大括号引用变量的时候,以及想输出大括号符号的时候。

---
- hosts: localhost
tasks:
- shell: echo "{{inventory_hostname}}:haha"

冒号尾随空格时要使用引号包围,是因为它会被解析为"key: value"的形式。而且包围冒号的引号还更严格。例如下面的debug模块中即使使用了引号也是错误的。

---
- hosts: localhost
tasks:
- shell: echo "{{inventory_hostname}}:haha"
register: hello
- debug: msg="{{hello.stdout}}: heihei"

因为它把{{...}}当成key,heihei当成value了。因此,必须将整个debug模块的参数都包围起来,显式指定这一段是模块的参数。但这样会和原来的双引号冲突,因此使用单引号。

---
- hosts: localhost
tasks:
- shell: echo "{{inventory_hostname}}:haha"
register: hello
- debug: 'msg="{{hello.stdout}}: heihei"'

但是,如果将shell模块中的冒号后也尾随上空格,即写成echo "{{inventory_hostname}}: haha",那么shell模块也会报错。因此也要使用多个引号,正确的如下:

---
- hosts: localhost
tasks:
- shell: 'echo "{{inventory_hostname}}: haha"'
register: hello
- debug: 'msg="{{hello.stdout}}: heihei"'

1.8 Ansible Playbook应用

如上使用Ad-hoc方式点对点命令执行,可以管理远程主机,如果服务器数量很多,配置信息比较多,还可以利用Ansible Playbook编写剧本、从而以非常简便的方式实现任务处理的自动化与流程化。

Playbook由一个或多个"play"组成的列表,play的主要功能Ansible中的Task定义好的角色,指定剧本对应的服务器组。

从根本上说,Task是一个任务,Task调用Ansible各种模块module,将多个paly组织在一个playbook剧本中,然后组成一个非常完整的流程控制集合。

基于Ansible Playbook还可以收集命令、可以创建任务集,这样能够大大降低管理工作的复杂程度,Playbook采用YAML语法结构,易于阅读、方便配置。

YAML(Yet Another Markup Language),是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。它参考了其它多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822,是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。

YAML使用空白字符和分行来分隔资料,适合用 grep、Python、Perl、Ruby 操作。

(1)     YAML语言特性如下:

  • 可读性强;
  • 和脚本语言的交互性好;
  • 使用实现语言的数据类型;
  • 一致的信息模型;
  • 易于实现;
  • 可以基于流来处理;
  • 可扩展性强。

(2)     Playbooks组件包括如下:

Target                     定义playbook的远程主机组;

Variable                       定义playbook使用的变量;

Task                       定义远程主机上执行的任务列表;

Handler                        定义task执行完成以后需要调用的任务,例如配置文件被改动,则启动handler任务重启相关联的服务。

(3)     Target常用参数如下:

hosts                          定义远程主机组;

user                       执行该任务的用户;

sudo                          设置为yes的时候,执行任务的时候使用root权限;

sudo_user                  指定sudo普通用户;

connection                 默认基于SSH连接客户端;

gather_facks                   获取远程主机facts基础信息。

(4)     Variable常用参数如下:

vars                       定义格式,变量名:变量值;

vars_files                     指定变量文件;

vars_prompt                用户交互模式自定义变量;

setup                      模块去远程主机的值;

(5)     Task常用参数如下:

name                       任务显示名称也即屏幕显示信息;

action                     定义执行的动作;

copy                       复制本地文件到远程主机;

template                       复制本地文件到远程主机,可以引用本地变量;

service                        定义服务的状态。

Ansible playbook案例演示如下:

(1)     远程主机安装Nginx WEB服务,playbook代码如下,执行结果如图21-33所示:

- hosts: all

remote_user: root

tasks:

- name: Jfedu Pcre-devel and Zlib LIB Install.

yum:  name=pcre-devel,pcre,zlib-devel state=installed

- name: Jfedu  Nginx WEB  Server Install Process.

shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

图21-33 Ansible Playbook远程Nginx安装

(2)     检测远程主机Nginx目录是否存在,不存在则安装Nginx WEB服务,安装完并启动Nginx,playbook代码如下,执行结果如图21-34所示:

- hosts: all

remote_user: root

tasks:

- name: Nginx server Install 2017

file: path=/usr/local/nginx/ state=directory

notify:

- nginx install

- nginx start

handlers:

- name: nginx install

shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0

.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

- name: nginx start

shell: /usr/local/nginx/sbin/nginx

图21-34 Ansible Playbook Nginx触发安装

(3)     检测远程主机内核参数配置文件是否更新,如果更新则执行命令sysctl –p使内核参数生效,playbook代码如下,执行结果如图21-35所示:

- hosts: all

remote_user: root

tasks:

- name: Linux kernel config 2017

copy: src=/data/sh/sysctl.conf dest=/etc/

notify:

- source sysctl

handlers:

- name: source sysctl

shell: sysctl -p

图21-35 Ansible Playbook 内核参数优化

(4)     基于列表items多个值创建用户,通过{{}}定义列表变量,with_items选项传入变量的值,执行结果如图21-36(a)、21-36(b)所示:

- hosts: all

remote_user: root

tasks:

- name: Linux system Add User list.

user: name={{ item }} state=present

with_items:

- jfedu1

- jfedu2

- jfedu3

- jfedu4

图21-36(a) Ansible Playbook item变量创建用户

图21-36(b) Ansible Playbook item变量创建用户

(5)     Ansible Playbook可以自定义template模板文件,模板文件主要用于服务器需求不一致的情况,需要独立定义的,例如两台服务器安装了Nginx,安装完毕之后将服务器A的HTTP端口改成80,服务器B的HTTP端口改成81,基于tempalte模块轻松实现,方法步骤如下:

  1. Ansible hosts文件指定不同服务器不同httpd_port端口,代码如下:

[web]

192.168.149.128 httpd_port=80

192.168.149.129 httpd_port=81

  1. Ansible 创建nginx.conf jinja2模板文件,cp nginx.conf nginx.conf.j2,并修改listen 80为listen {{httpd_port}},Nginx其他配置项不变,代码如下:

cp nginx.conf nginx.conf.j2

listen  {{httpd_port}};

  1. Ansible playbook剧本yaml文件创建,代码如下:

- hosts: all

remote_user: root

tasks:

- name: Nginx server Install 2017

file: path=/usr/local/nginx/ state=directory

notify:

- nginx install

- nginx config

handlers:

- name: nginx install

shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0

.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

- name: nginx config

template: src=/data/sh/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf

  1. Ansible playbook执行剧本文件,如图21-37(a)、21-37(b)、21-37(c)所示:

图21-37(a) Ansible Playbook 执行模板yaml

图21-37(b) 149.128服务器Nginx HTTP Port 80

图21-37(c) 149.129服务器Nginx HTTP Port 81

1.9 Ansible配置文件详解

Ansible默认配置文件为/etc/ansible/ansible.cfg,配置文件中可以对ansible进行各项参数的调整,包括并发线程、用户、模块路径、配置优化等,如下为Ansible.cfg常用参数详解:

[defaults]                                 通用默认配置段;

inventory      = /etc/ansible/hosts            被控端IP或者DNS列表;

library        = /usr/share/my_modules/        Ansible默认搜寻模块的位置;

remote_tmp     = $HOME/.ansible/tmp       Ansible远程执行临时文件;

pattern        = *                     对所有主机通信;

forks          = 5                     并行进程数;

poll_interval  = 15                        回频率或轮训间隔时间;

sudo_user      = root                      sudo远程执行用户名;

ask_sudo_pass = True                   使用sudo,是否需要输入密码;

ask_pass      = True                       是否需要输入密码;

transport      = smart                     通信机制;

remote_port    = 22                    远程SSH端口;

module_lang    = C                     模块和系统之间通信的语言;

gathering = implicit                       控制默认facts收集(远程系统变量);

roles_path= /etc/ansible/roles             用于playbook搜索Ansible roles;

host_key_checking = False                  检查远程主机密钥;

#sudo_exe = sudo                           sudo远程执行命令;

#sudo_flags = -H                           传递sudo之外的参数;

timeout = 10                               SSH超时时间;

remote_user = root                         远程登陆用户名;

log_path = /var/log/ansible.log                日志文件存放路径;

module_name = command                  Ansible命令执行默认的模块;

#executable = /bin/sh                      执行的Shell环境,用户Shell模块;

#hash_behaviour = replace                  特定的优先级覆盖变量;

#jinja2_extensions                        允许开启Jinja2拓展模块;

#private_key_file = /path/to/file              私钥文件存储位置;

#display_skipped_hosts = True              显示任何跳过任务的状态;

#system_warnings = True                禁用系统运行ansible潜在问题警告;

#deprecation_warnings = True               Playbook输出禁用“不建议使用”警告;

#command_warnings = False                  command模块Ansible默认发出警告;

#nocolor = 1                           输出带上颜色区别,开启/关闭:0/1;

pipelining = False                         开启pipe SSH通道优化;

[accelerate]                               accelerate缓存加速。

accelerate_port = 5099

accelerate_timeout = 30

accelerate_connect_timeout = 5.0

accelerate_daemon_timeout = 30

accelerate_multi_key = yes

1.10 Ansible性能调优

Ansible企业实战环境中,如果管理的服务器越来越多,Ansibe执行效率会变得比较慢,可以通过优化Ansible提供工作效率,由于Ansible基于SSH协议通信,SSH连接慢会导致整个基于Ansible执行变得缓慢,也需要对Openssh进行优化,具体优化的方法如下:

(1)     Ansible SSH 关闭秘钥检测

默认以SSH登录远程客户端服务器,会检查远程主机的公钥(public key),并将该主机的公钥记录在~/.ssh/known_hosts文件中。下次访问相同主机时,OpenSSH会核对公钥,如果公钥不同,OpenSSH会发出警告,如果公钥相同,则提示输入密码。

SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来设定的,StrictHostKeyChecking检查级别包括:no(不检查)、ask(询问)、yes(每次都检查)、False(关闭检查)。

Ansible配置文件中加入如下代码,即可关闭StrictHostKeyChecking检查:

host_key_checking = False

(2)     OpenSSH连接优化

使用OpenSSH服务时,默认服务器端配置文件UseDNS=YES状态,该选项会导致服务器根据客户端的IP地址进行DNS PTR反向解析,得到客户端的主机名,然后根据获取到的主机名进行DNS正向A记录查询,并验证该IP是否与原始IP一致。关闭DNS解析代码如下:

sed  -i  '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no' /etc/ssh/sshd_config

/etc/init.d/sshd restart

(3)     SSH pipelining加速Ansible

SSH pipelining是一个加速 Ansible 执行速度的简单方法,SSH pipelining 默认是关闭的,关闭是为了兼容不同的 sudo 配置,主要是requiretty 选项。

如果不使用Sudo建议开启该选项,打开此选项可以减少Ansible 执行没有文件传输时,SSH在被控机器上执行任务的连接数。使用Sudo操作的时候, 必须在所有被管理的主机上将配置文件/etc/sudoers中requiretty选项禁用。

sed    -i    '/^pipelining/s/False/True/g'    /etc/ansible/ansible.cfg

(4)     Ansible Facts缓存优化

Ansible-playbook 在执行过程中,默认会执行Gather facts,如果不需要获取客户端的fact数据的话,可以关闭获取fact数据功能,关闭之后可以加快ansible-playbook的执行效率。如需关闭fact功能,在playbook yaml文件中加入如下代码即可:

gather_facts: nogather_facts: no

Ansible facts组件主要用于收集客户端设备的基础静态信息,这些信息可以在做配置管理的时候方便引用。Facts信息直接当做Ansible Playbook变量信息进行引用,通过定制facts以便收集我们想要的信息,同时可以通过Facter和Ohai来拓展facts信息,也可以将facts信息存入Redis缓存中,如下为Facts使用Redis缓存的步骤。

  1. 部署Redis服务

wget    http://download.redis.io/releases/redis-2.8.13.tar.gz

tar         zxf            redis-2.8.13.tar.gz

cd      redis-2.8.13

make    PREFIX=/usr/local/redis  install

cp     redis.conf     /usr/local/redis/

将/usr/local/redis/bin/目录加入至环境变量配置文件/etc/profile末尾,然后Shell终端执行source /etc/profile让环境变量生效。

export PATH=/usr/local/redis/bin:$PATH

启动及停止Redis服务命令:

nohup /usr/local/redis/bin/redis-server  /usr/local/redis/redis.conf  &

  1. 安装Python Redis模块

easy_install pip

pip install redis

  1. Ansible整合Redis配置

在配置文件/etc/ansible/ansible.cfg中defaluts段中加入代码,如果redis密码为admin,则开启admin密码行:

gathering = smart

fact_caching = redis

fact_caching_timeout = 86400

fact_caching_connection = localhost:6379

#fact_caching_connection = localhost:6379:0:admin

  1. 测试Redis缓存

Ansible-playbook执行nginx_wget.yaml剧本文件,如图21-38所示:

ansible-playbook    nginx_wget.yaml

图21-38 ansible playbook执行yaml

检查Redis服务器,facts key已存入Redis中,如图21-39所示:

图21-39 Redis缓存服务器缓存facts主机信息

(5)     ControlPersist SSH优化

ControlPersist 特性需要高版本的SSH支持,CentOS6默认是不支持的,如果需要使用,需要自行升级Openssh。

ControlPersist 即持久化的Socket,一次验证多次通信。并且只需要修改SSH客户端配置,也即Ansible被管理主机。

可使用YUM或者源码编译升级OpenSSH服务,升级完毕ControlPersist的设置办法如下,在其用户的家目录创建config文件,如果ansible以root用户登录客户端,至需要在客户端的/root/.ssh/config目录中添加如下代码即可:

Host *

Compression yes

ServerAliveInterval 60

ServerAliveCountMax 5

ControlMaster auto

ControlPath ~/.ssh/sockets/%r@%h-%p

ControlPersist 4h

开启ControlPersist 特性后,SSH 在建立sockets后,节省了每次验证和创建的时间,对Ansible执行速度提升是非常明显的。

1.11核心组件

  • tasks:任务
  • variables:变量
  • templates:模板
  • handlers:处理器
  • roles:角色

1.12 playbook实例

ansible核心模块playbook介绍的更多相关文章

  1. Ansible第一篇:介绍及安装

    Ansible介绍 Ansible是个什么东西呢?官方的title是"Ansible is Simple IT Automation"--简单的自动化IT工具.ansible基于P ...

  2. 嵌入式系统图形库GUI核心模块介绍

    本文转载自:http://blog.csdn.net/xteda/article/details/6575278 (作者 冯青华 信庭嵌入式工作室(www.xteda.com)- CEO Blog:h ...

  3. Ansible常用模块介绍及使用(week5_day1_part2)--技术流ken

    Ansible模块 在上一篇博客<Ansible基础认识及安装使用详解(一)--技术流ken>中以及简单的介绍了一下ansible的模块.ansible是基于模块工作的,所以我们必须掌握几 ...

  4. Ansible 常见模块介绍

    目录 Ansible 常见模块介绍 ping 模块 command 模块 cron 模块 user 模块 group 模块 copy 模块 file 模块 service 模块 shell 模块 sc ...

  5. SSH与ansible 部署方法与核心模块简介

    SSH与ansible 部署方法 部署环境 管理服务器 172.16.1.61 NFS服务器 172.16.1.31 备份服务器 172.16.1.41 1检查SSH服务是否运行并开启服务 netst ...

  6. Ansible常用模块介绍及使用(2)

    Ansible模块 在上一篇博客<Ansible基础认识及安装使用详解(一)–技术流ken>中以及简单的介绍了一下ansible的模块.ansible是基于模块工作的,所以我们必须掌握几个 ...

  7. Ansible 常用模块(一)

    一.Ansible简介 Ansible是新出现的自动化运维工具,基于python开发,集合了众多运维工具(puppet(ruby).cfengine.chef.func.fabric.)的优点,实现了 ...

  8. Nodejs进阶:核心模块net入门与实例讲解

    模块概览 net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net. ...

  9. Tengine 常用模块使用介绍

    Tengine 和 Nginx Tengine简介 从2011年12月开始:Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能 和特性. ...

随机推荐

  1. MUI - myStorage在ios safari无痕浏览模式下的解决方案

    myStorage在ios safari无痕浏览模式下的解决方案 今天看到了这个帖子LocalStorage 在 Private Browsing 下的一个限制, 吓尿了,如果用户开启了无痕浏览,ap ...

  2. nodeJs学习-10 模板引擎 ejs语法案例

    ejs语法案例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  3. vmware中配置CentOS

    一.下载 http://mirrors.aliyun.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso 这里选择的是阿里云镜像 ...

  4. 《spring boot》8.2章学习时无法正常启动,报“ORA-00942: 表或视图不存在 ”

    在学习<spring boot>一书的过程中,由于原书作者难免有一些遗漏的的地方,或者系统.软件版本不一致.框架更新等各种因素,完全安装书中源码页不能实现项目的正常启动 在8.2章节,演示 ...

  5. Win10系统使用Docker安装oracle并通过Navicat for oracle进行登录

    一.安装Docker Linux系统可以直接采用命令进行Docker安装: Win7系统安装Dokcer实际通过Boot2Docker在Windows下安装一个VirtualBox来实现: Boot2 ...

  6. Python中的TCP三次握手和四次挥手过程

    tcp三次握手和四次挥手 首先先介绍什么是传输层: 1.三次握手 1) 三次握手的详述 首先Client(客户)端发送连接请求报文,Server(服务器)段接受连接后回复ACK报文,并为这次连接分配资 ...

  7. Java练习 SDUT-1255_小明A+B

    小明A+B Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小明今年3岁了, 现在他已经能够认识100以内的非负整数, ...

  8. @atcoder - AGC040C@ Neither AB nor BA

    目录 @description@ @solution@ @accepted code@ @detail@ @description@ 给定偶数 N,求由 'A', 'B', 'C' 三种字符组成的字符 ...

  9. ORACLE学习笔记-ORACLE(基本命令)

    --查看VGA信息: show sga; select * from v$sgastat;--可以通过以下几个动态性能视图查看信息: V$sysstat                系统统计信息 V ...

  10. vue-router2.0的用法

    随着vue越来越火,而vue-router却是一个项目不可或缺的,所以在这里结合实例总结一下router的用法,也是给自己的一个总结. 1.首先第一步当然是安装vue-router依赖,当然也可直接s ...