# Ansible Variables
# 1. Ansible Variables
# 1.1 什么是变量
变量提供了便捷的方式来管理 ansible 项目中的动态值。 比如 nginx-1.12,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便。
# 1.2 变量定义的方式
在 Ansible 中定义变量分为如下三种方式:
1. 通过命令行传递变量参数定义
2. 在 play 文件中进行定义变量
2.1) 通过 vars 定义变量
2.2) 通过 vars_files 定义变量
3. 通过 inventory 在主机组或单个主机中设置变量
3.1) 通过 host_vars 对主机进行定义
3.2) 通过 group_vars 对主机组进行定义
问题:如果定义的变量出现重复,造成冲突,如何解决?
# 1.3 在 Playbook 中定义变量
# 1.3.1 vars 方式定义变量
在 playbook 的文件中开头通过 vars 关键字进行变量定义
[root@manager ~]# cat var1.yml | |
- hosts: webservers | |
vars: | |
- web_packages: httpd_2 | |
- ftp_packages: vsftpd_2 | |
tasks: | |
- name: Output Vaiables | |
debug: | |
msg: | |
- "" | |
- "" |
# 1.3.2 vars_files 方式定义变量
在 playbook 中使用 vars_files 指定文件作为变量文件,好处就是其他的 playbook 也可以调用;

1. 准备一个用于存储变量的文件,后缀为 .yml 文件内容:vars_name: value
[root@manager ~]# cat var.yml | |
ansible_cfg: /etc/ansible/ansible.cfg | |
ansible_exe: /usr/bin/ansible/sbin/ansible | |
ansible_vars: playbook_vars_files |
2. 使用 Playbook 调用变量文件
[root@manager ~]# cat var1.yml | |
- hosts: webservers | |
vars: | |
- web_packages: httpd_2 | |
- ftp_packages: vsftpd_2 | |
vars_files: | |
- ./var.yml | |
tasks: | |
- name: Output Vaiables | |
debug: | |
msg: | |
- "" | |
- "" | |
- "" | |
- "" | |
- "" |
# 1.4 在 Inventory 中定义变量
# 1.4.1 Inventory 文件中定义变量
1. 设定主机变量和组变量
[root@manager ~]# cat /etc/ansible/hosts | |
[webservers] | |
192.168.1.7 priority=100 state=master | |
192.168.1.8 priority=50 state=backup | |
[webservers:vars] | |
port=80 # 组变量 |
2.playbook 调用变量
[root@manager ~]# cat var3.yml | |
- hosts: webservers | |
tasks: | |
- name: Output Vaiables | |
debug: | |
msg: | |
- " " |
3.playbook 执行结果
[root@manager ~]# ansible-playbook var3.yml | |
PLAY [webservers] ******************************************************************************************************************** | |
TASK [Gathering Facts] *************************************************************************************************************** | |
ok: [192.168.1.7] | |
ok: [192.168.1.8] | |
TASK [Output Vaiables] *************************************************************************************************************** | |
ok: [192.168.1.7] => { | |
"msg": [ | |
"100 master 80" | |
] | |
} | |
ok: [192.168.1.8] => { | |
"msg": [ | |
"50 backup 80" | |
] | |
} | |
PLAY RECAP *************************************************************************************************************************** | |
192.168.1.7 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | |
192.168.1.8 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
# 1.4.2 使用 host_vars 定义变量
1. 在项目目录中创建 host_vars 目录,然后在创建一个文件,文件的文件名称要与 inventory 清单中的主机名称要保持完全一致,如果是 ip 地址,则创建相同 ip 地址的文件即可。
[root@manager project]# cat /etc/ansible/hosts | |
[webservers] | |
192.168.1.7 | |
192.168.1.8 | |
[root@manager project]# mkdir host_vars |
2. 在 host_vars 目录中创建文件,给 192.168.1.7、 192.168.1.8 主机定义变量
[root@manager project]# cat host_vars/192.168.1.7 | |
state: MASTER | |
priority: 200 | |
[root@manager project]# cat host_vars/192.168.1.8 | |
state: BACKUP | |
priority: 100 |
3. 准备一个 playbook 文件调用 host_vars 目录中定义的主机变量
[root@manager project]# cat var4.yml | |
- hosts: webservers | |
tasks: | |
- name: Copy Keeplaived Configure | |
template: | |
src: ./keepalived.conf.j2 | |
dest: /tmp/keepalived.conf |
4. 准备 playbook 中配置文件 keepalived.conf.j2
[root@manager project]# cat keepalived.conf.j2 | |
vrrp_instance VI_1 { | |
state <!--swig10--> | |
interface eth0 eth1 # 绑定当前虚拟路由使用的物理接口; | |
virtual_router_id 50 # 当前虚拟路由标识,VRID; | |
priority <!--swig11--> | |
advert_int 3 # vrrp 通告时间间隔,默认 1s; | |
authentication { | |
auth_type PASS # 密码类型,简单密码; | |
auth_pass 1111 # 密码不超过 8 位字符; | |
} |
5. 执行 playbook 结果
[root@manager project]# ansible-playbook var4.yml | |
# web01 执行结果 | |
[root@web01 ~]# cat /tmp/keepalived.conf | |
vrrp_instance VI_1 { | |
state MASTER | |
interface eth0 eth1 # 绑定当前虚拟路由使用的物理接口; | |
virtual_router_id 50 # 当前虚拟路由标识,VRID; | |
priority 200 | |
advert_int 3 # vrrp 通告时间间隔,默认 1s; | |
authentication { | |
auth_type PASS # 密码类型,简单密码; | |
auth_pass 1111 # 密码不超过 8 位字符; | |
} | |
# web02 执行结果 | |
[root@web02 ~]# cat /tmp/keepalived.conf | |
vrrp_instance VI_1 { | |
state BACKUP | |
interface eth0 eth1 # 绑定当前虚拟路由使用的物理接口; | |
virtual_router_id 50 # 当前虚拟路由标识,VRID; | |
priority 100 | |
advert_int 3 # vrrp 通告时间间隔,默认 1s; | |
authentication { | |
auth_type PASS # 密码类型,简单密码; | |
auth_pass 1111 # 密码不超过 8 位字符; | |
} |
# 1.4.3 使用 group_vars 定义变量
1. 在项目目录中创建 group_vars 目录,然后在创建一个文件,文件的文件名称要与 inventory 清单中的组名称保持完全一致;
[root@manager project]# cat /etc/ansible/hosts | |
[webservers] | |
192.168.1.7 | |
192.168.1.8 | |
[root@manager project]# mkdir group_vars |
2. 在 group_vars 目录中创建 webservers 文件,为 webservers 主机组设定变量;
[root@manager project]# cat group_vars/webservers | |
virtual_router_id: 100 |
3. 编写 playbook,只需在 playbook 文件中使用变量即可;
[root@manager project]# cat var4.yml | |
- hosts: webservers | |
tasks: | |
- name: Copy Keeplaived Configure | |
template: | |
src: ./keepalived.conf.j2 | |
dest: /tmp/keepalived.conf |
4. 准备 playbook 中配置文件 keepalived.conf.j2
[root@manager project]# cat keepalived.conf.j2 | |
vrrp_instance VI_1 { | |
state <!--swig12--> | |
interface eth0 eth1 # 绑定当前虚拟路由使用的物理接口; | |
virtual_router_id <!--swig13--> # 当前虚拟路由标识,VRID; | |
priority <!--swig14--> | |
advert_int 3 # vrrp 通告时间间隔,默认 1s; | |
authentication { | |
auth_type PASS # 密码类型,简单密码; | |
auth_pass 1111 # 密码不超过 8 位字符; | |
} |
5. 执行 playbook 结果
[root@manager project]# ansible-playbook var4.yml | |
# web01 执行结果 | |
[root@web01 ~]# cat /tmp/keepalived.conf | |
vrrp_instance VI_1 { | |
state MASTER | |
interface eth0 eth1 # 绑定当前虚拟路由使用的物理接口; | |
virtual_router_id 100 # 当前虚拟路由标识,VRID; | |
priority 200 | |
advert_int 3 # vrrp 通告时间间隔,默认 1s; | |
authentication { | |
auth_type PASS # 密码类型,简单密码; | |
auth_pass 1111 # 密码不超过 8 位字符; | |
} | |
# web02 执行结果 | |
[root@web02 ~]# cat /tmp/keepalived.conf | |
vrrp_instance VI_1 { | |
state BACKUP | |
interface eth0 eth1 # 绑定当前虚拟路由使用的物理接口; | |
virtual_router_id 100 # 当前虚拟路由标识,VRID; | |
priority 100 | |
advert_int 3 # vrrp 通告时间间隔,默认 1s; | |
authentication { | |
auth_type PASS # 密码类型,简单密码; | |
auth_pass 1111 # 密码不超过 8 位字符; | |
} |
6. 测试其他组能否使用 webservers 组中定义的变量;测试后会发现无法调用;
[root@manager project]# cat var4.yml | |
- hosts: lbservers | |
tasks: | |
- name: Copy Keeplaived Configure | |
template: | |
src: ./keepalived.conf.j2 | |
dest: /tmp/keepalived.conf |
7. 但是系统提供了特殊的 all 组,也就说在 group_vars 目录下创建一个 all 文件,定义变量对所有的主机组都生效;
#1. 在 group_vars 目录下创建一个 all 文件 | |
[root@manager project]# cat group_vars/all | |
web_packages: wget | |
ftp_packages: tree | |
#2. 编写 playbook 文件 | |
[root@manager project]# cat var6.yml | |
- hosts: webservers | |
tasks: | |
- name: debug | |
debug: | |
msg: " " | |
#3. 执行 playbook | |
[root@manager project]# ansible-playbook var6.yml |
# 1.5 执行 Playbook 传递变量
在执行 Playbook 时,可以通过命令行 --extra-vars 或 -e 外置传参设定变量;
1. 准备 playbook 文件
[root@manager project]# cat var5.yml | |
- hosts: webserver | |
tasks: | |
- name: Output Vaiables | |
debug: | |
msg: | |
- "" | |
- "" |
2. 执行 playbook 时进行变量的传递
[root@manager var]# ansible-playbook var5.yml -e "web_packages=GeoIP" |
3. 传递多个外置变量的方式
[root@manager var]# ansible-playbook var5.yml -e "web_packages=GeoIP" -e "ftp_packages=ftpIP" |
# 1.6 变量优先级测试
定义相同的变量不同的值,来测试变量的优先级。操作步骤如下
- 1)在 plabook 中定义 vars 变量
- 2)在 playbook 中定义 vars_files 变量
- 3)在 Inventory_host 中定义变量
- 4)在 group_vars 中定义变量
- 5)通过执行命令传递变量
结果: 1️⃣命令行传参 -->2️⃣playbook 中的 vars_files-->3️⃣playbook 中的 vars-->4️⃣ Inventory_host 变量 -->5️⃣group_vars-->6️⃣group_vars/all -->7️⃣ Inventory_group
# 1.7 项目实战将 NFS 项目改造为变量方式
1. 准备 playbook 文件
[root@manager var]# cat nfs_server_variables.yml | |
- hosts: webservers | |
vars_files: ./nfs_variables.yml | |
tasks: | |
- name: 1.Installed NFS Server | |
yum: | |
name: nfs-utils | |
state: present | |
- name: 2.Configure NFS Server | |
template: | |
src: ./exports.j2 | |
dest: /etc/exports | |
notify: Restart NFS Server | |
- name: 3.Init Group | |
group: | |
name: "" | |
gid: "" | |
- name: 4.Init User | |
user: | |
name: "" | |
uid: "" | |
group: "" | |
shell: /sbin/nologin | |
create_home: no | |
- name: 5.Init Create Directory | |
file: | |
path: "" | |
state: directory | |
owner: "" | |
group: "" | |
mode: "0755" | |
- name: 6.Started NFS Server | |
systemd: | |
name: nfs | |
state: started | |
enabled: yes | |
handlers: | |
- name: Restart NFS Server | |
systemd: | |
name: nfs | |
state: restarted | |
- hosts: localhost | |
vars_files: ./nfs_variables.yml | |
tasks: | |
- name: Mount | |
mount: | |
src: ":" | |
path: /mnt | |
fstype: nfs | |
opts: defaults | |
state: mounted |
2. 准备 NFS 配置文件 exports.j2
[root@manager var]# cat exports.j2 | |
<!--swig29--> 172.16.1.0/24(rw,all_squash,anonuid=<!--swig30-->,anongid=<!--swig31-->) |
3. 准备 playbook 变量文件
[root@manager var]# cat nfs_variables.yml | |
nfs_share_data: /data | |
nfs_uid: 666 | |
nfs_gid: 666 | |
nfs_user: www | |
nfs_group: www | |
nfs_server: 172.16.1.7 |
4. 执行 playbook 并测试
[root@manager var]# ansible-playbook nfs_server_variables.yml | |
[root@manager var]# df -h |grep mnt | |
172.16.1.7:/data 17G 11G 6.5G 62% /mnt |
# 2.Ansible Register
# 2.1 什么是 Register
register 可以将 task 执行的任务结果存储至某个变量中,便于后续的引用;
# 2.2 Register 场景示例 1
需求:使用 Register 获取被控节点的端口信息
1. 准备 playbook 文件
[root@manager var]# cat register_1.yml | |
- hosts: webservers | |
tasks: | |
- name: Get Network Port | |
shell: netstat -lntp | |
register: System_Port | |
- name: debug | |
debug: | |
msg: | |
- "执行了 命令" | |
- "" |
2.playbook 执行结果
[root@manager var]# ansible-playbook register_1.yml |


# 2.3 Register 场景示例 2
需求:批量修改 200 台主机名称
1. 准备 playbook 文件
[root@manager var]# cat register_2.yml | |
- hosts: webservers | |
tasks: | |
- name: String | |
shell: echo $RANDOM |md5sum | cut -c 2-10 | |
# shell: echo $((RANDOM%200)) | |
register: systemd_sj | |
- name: debug | |
debug: | |
msg: "" | |
- name: Chanage Hostname | |
hostname: | |
name: "web_" |
2. 执行 playbook 并测试
[root@manager var]# ansible-playbook register_2.yml | |
[root@web01 ~]# hostnamectl | |
Static hostname: web_8ccbbb7ce | |
Icon name: computer-vm | |
Chassis: vm | |
Machine ID: bd353f63eda44afab936db8ef2974eb1 | |
Boot ID: 63559abc84684641ac245ad94e9c8e55 | |
Virtualization: vmware | |
Operating System: CentOS Linux 7 (Core) | |
CPE OS Name: cpe:/o:centos:centos:7 | |
Kernel: Linux 3.10.0-957.el7.x86_64 | |
Architecture: x86-64 |
2.4 Register 场景示例 3
需求:使用 register 关键字完成 jumpserver key 的创建
1. 准备 playbook 文件
[root@web01 ~]# cat register_3.yml | |
- hosts: webservers | |
tasks: | |
- name: BOOTSTRAP_TOKEN | |
shell: 'if grep "BOOTSTRAP_TOKEN" ~/.bashrc ;then | |
echo $BOOTSTRAP_TOKEN; | |
else | |
BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 24`; | |
echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc; | |
echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN"; | |
fi' | |
register: JMS_BOOTSTRAP_TOKEN | |
- name: SECRET_KEY | |
shell: 'if grep "SECRET_KEY" ~/.bashrc ;then | |
echo $SECRET_KEY; | |
else | |
SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`; | |
echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc; | |
echo "SECRET_KEY=$SECRET_KEY"; | |
fi' | |
register: JMS_SECRET_KEY | |
- name: Copy JMS Config.yml | |
template: | |
src: ./jms.yml | |
dest: /tmp/jms.yml | |
- name: Copy KoKo Config.yml | |
template: | |
src: ./koko.yml | |
dest: /tmp/koko.yml |
2. 准备 playbook 文件配置文件 jms.yml 、koko.yml
#1. 模拟 jms 配置文件 | |
[root@manager var]# cat jms.yml | |
SECRET_KEY: <!--swig36--> | |
BOOTSTRAP_TOKEN: <!--swig37--> | |
#2. 模拟 koko 配置文件 | |
[root@manager var]# cat koko.yml | |
# Jumpserver 项目的 url, api 请求注册会使用 | |
# CORE_HOST: http://127.0.0.1:8080 | |
BOOTSTRAP_TOKEN: <!--swig38--> |
3. 执行 playbook 并测试
#1. 执行 playbook | |
[root@manager var]# ansible-playbook register_3.yml | |
#2. 验证测试 | |
[root@web01 ~]# cat /tmp/jms.yml | |
SECRET_KEY: tuw13bJFHddReo33qHE36xm9dqp8WNlsoScrCyaIiD894kjhIu | |
BOOTSTRAP_TOKEN: pmEcXW2q7KwVOPUkcbAXoDdu | |
[root@web01 ~]# cat /tmp/koko.yml | |
# Jumpserver 项目的 url, api 请求注册会使用 | |
# CORE_HOST: http://127.0.0.1:8080 | |
BOOTSTRAP_TOKEN: pmEcXW2q7KwVOPUkcbAXoDdu |
# 3. Ansible Facts Variables
# 3.1 什么是 facts
Ansible facts 变量主要用来自动采集,” 被控端主机 “自身的状态信息。
比如:被动端的,主机名、IP 地址、系统版本、CPU 数量、内存状态、磁盘状态等。
# 3.2 facts 使用场景
1. 通过 facts 变量检查被控端硬件 CPU 信息,从而生成不同的 Nginx 配置文件。
2. 通过 facts 变量检查被控端内存状态信息,从而生成不同的 memcached 的配置文件。
3. 通过 facts 变量检查被控端主机名称信息,从而生成不同的 Zabbix 配置文件。
4. 通过 facts 变量检查被控端主机 IP 地址信息,从而生成不同的 redis 配置文件。
5. 通过 facts 变量........
# 3.3 facts 语法示例
1. 查看所有 facts 变量
[root@manager ~]# ansible localhost -m setup |
2. 通过 facts 获取被控端的主机名与 IP 地址,然后通过 debug 输出
[root@manager ~]# cat facts_1.yml | |
- hosts: webservers | |
#gather_facts: no | |
tasks: | |
- name: Print IP | |
debug: | |
msg: " " |
3. 获取 facts 变量,可以使用 filter 过滤特定的关键项
[root@manager ~]# ansible localhost -m setup -a "filter="ansible_fqdn"" | |
localhost | SUCCESS => { | |
"ansible_facts": { | |
"ansible_fqdn": "manager" | |
}, | |
"changed": false | |
} |
4. 如果没有使用 facts 变量需求,可以关闭其功能,加速 ansible 执行性能;
[root@manager ~]# cat facts_1.yml | |
- hosts: webservers | |
gather_facts: no | |
tasks: | |
- name: Print IP | |
debug: | |
msg: " " |
# 3.4 案例 1 - 根据主机 IP 地址生成 Redis 配置
1. 编写安装配置 redis 服务的 playbook 文件
[root@manager ~]# cat facts_redis.yml | |
- hosts: webservers | |
tasks: | |
- name: Installed Redis Server | |
yum: | |
name: redis | |
state: present | |
- name: Configure Redis Server | |
template: | |
src: ./redis.conf.j2 | |
dest: /etc/redis.conf | |
notify: Restart Redis Server | |
- name: Started Redis Server | |
systemd: | |
name: redis | |
state: started | |
enabled: yes | |
handlers: | |
- name: Restart Redis Server | |
systemd: | |
name: redis | |
state: restarted |
2. 准备 playbook 依赖的 redis.conf.j2 文件
[root@manager web_cluster]# cp /etc/redis.conf /root/web_cluster/files/redis.conf.j2 | |
[root@manager files]# sed -i "/^bind 127.0.0.1/c bind 127.0.0.1 " redis.conf.j2 |
3. 验证测试
[root@web01 ~]# netstat -lntp|grep 6379 | |
tcp 0 0 192.168.1.7:6379 0.0.0.0:* LISTEN 15391/redis-server | |
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 15391/redis-server |
# 3.5 案例 2 - 根据主机 CPU 生成 Nginx 配置
1. 编写安装配置 Nginx 服务的 playbook 文件
[root@manager ~]# cat facts_nginx.yml | |
- hosts: webservers | |
tasks: | |
- name: Installed Nginx Server | |
yum: | |
name: nginx | |
state: present | |
- name: Configure Nginx nginx.conf | |
template: | |
src: ./nginx.conf.j2 | |
dest: /etc/nginx/nginx.conf | |
owner: root | |
group: root | |
mode: 0644 | |
notify: Restart Nginx Server | |
- name: Started Nginx Server | |
systemd: | |
name: nginx | |
state: started | |
enabled: yes | |
handlers: | |
- name: Restart Nginx Server | |
systemd: | |
name: nginx | |
state: restarted |
2. 准备 playbook 依赖的 nginx.conf.j2 文件
[root@manager ~]# cat nginx.conf.j2 | |
user www; | |
worker_processes <!--swig46-->; | |
error_log /var/log/nginx/error.log notice; | |
pid /var/run/nginx.pid; | |
events { | |
worker_connections 1024; | |
} | |
http { | |
include /etc/nginx/mime.types; | |
default_type application/octet-stream; | |
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' | |
'$status $body_bytes_sent "$http_referer" ' | |
'"$http_user_agent" "$http_x_forwarded_for" "$http_x_via"'; | |
access_log /var/log/nginx/access.log main; | |
sendfile on; | |
keepalive_timeout 65; | |
include /etc/nginx/conf.d/*.conf; | |
} |
3. 验证测试
[root@manager ~]# ansible-playbook facts_nginx.yml | |
[root@web01 ~]# cat /etc/nginx/nginx.conf | grep worker_processes | |
worker_processes 8; |
# 3.6 案例 3 - 根据主机内存生成 Memcached 配置
1. 编写安装配置 memcached 服务的 playbook 文件
[root@manager var]# cat facts_memcached.yml | |
- hosts: webservers | |
tasks: | |
- name: Installed Memcached | |
yum: | |
name: memcached | |
state: present | |
- name: Configre Memcached | |
template: | |
src: ./memcached.j2 | |
dest: /etc/sysconfig/memcached | |
notify: Restart Memcache Server | |
- name: Started Memcached | |
systemd: | |
name: memcached | |
state: started | |
handlers: | |
- name: Restart Memcache Server | |
systemd: | |
name: memcached | |
state: restarted |
2. 准备 playbook 依赖的 memcached.j2 文件
[root@manager var]# cat memcached.j2 | |
PORT="11211" | |
USER="memcached" | |
MAXCONN="1024" | |
CACHESIZE="NaN" | |
OPTIONS="" |
3. 验证测试
[root@manager var]# ansible-playbook facts_memcached.yml | |
[root@web_8ccbbb7ce ~]# free -m | |
total used free shared buff/cache available | |
Mem: 1819 351 1029 27 439 1300 | |
Swap: 2047 0 2047 | |
[root@web_8ccbbb7ce ~]# cat /etc/sysconfig/memcached | |
PORT="11211" | |
USER="memcached" | |
MAXCONN="1024" | |
CACHESIZE="909.5" | |
OPTIONS="" |
# 3.7 案例 6 - 使用 facts 批量修改主机名
[root@manager var]# cat facts_hostname.yml
- hosts: webservers
tasks:
- name: Print IP
debug:
# 获取facts变量,然后提取IP地址,以.结尾的最后一列
msg: "{{ ansible_eth0.ipv4.address.split('.')[-1] }}"
- name: Change Hostname
hostname:
name: web_{{ ansible_eth0.ipv4.address.split('.')[-1] }}
# 3.8 facts 变量性能优化
# 3.8.1 关闭 facts 采集加速执行 - 方式 1
1. 编写 TASK 任务 sleep10 秒,针对 15 台机器同时执行,需要消耗的时间大概是 1m56.980s
[root@manager var]# cat facts_sleep.yml | |
- hosts: all | |
#gather_facts: no | |
tasks: | |
- name: sleep 10 | |
command: sleep 10 |
2. 使用 gather_facts: no 关闭 facts 信息采集,发现仅花费了 0m38.164s ,整个速度提升了 3 倍;
[root@manager var]# cat facts_sleep.yml | |
- hosts: all | |
gather_facts: no | |
tasks: | |
- name: sleep 10 | |
command: sleep 10 |
# 3.8.2 缓存 facts 变量加速执行 - 方式 2
1. 当我们使用 gather_facts: no 关闭 facts,确实能加速 Ansible 执行,但是有时候又需要使用 facts 中的内容,还希望执行的速度快一点,这时候可以设置 facts 的缓存;
[root@manager var]# yum install python-pip -y | |
[root@manager var]# pip install redis | |
[root@m01 ~]# cat /etc/ansible/ansible.cfg | |
[defaults] | |
# smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts | |
# implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts: False; | |
# explicit 则表示默认不收集,要显式收集,必须使用 gather_facts: Ture。 | |
gathering = smart #在使用 facts 缓存时设置为 smart | |
fact_caching_timeout = 86400 | |
fact_caching = redis | |
fact_caching_connection = 172.16.1.41:6379 | |
# 若 redis 设置了密码,1 表示 redis1 号库 | |
# fact_caching_connection = 172.16.1.41:6379:1:passwd |
2. 编写 Playbook 测试;
[root@manager var]# cat facts_sleep.yml | |
- hosts: all | |
gather_facts: no | |
tasks: | |
- name: sleep 10 | |
command: sleep 10 |
3. 测试结果如下:
- 执行第一次花费了 1m49.881s 因为第一次需要将 facts 信息缓存至 Redis
- 执行第二次花费了 0m38.130s 可以看出使用 Redis 缓存 facts 变量,整体执行时间提高了 3 倍
