变量通过便捷的方式来管理ansible项目中的动态值。
比如:version=ngix-1.16
在使用中只需要调用version
这个变量名即可,方便管理及后期升级修改等操作。
目录
- 🍔变量定义的方式:
- 🍔Register Variables
- 示例:批量修改主机名
- 🍔Facts Variables
- 示例:基于IP生成redis配置文件
- facts优化:
🍔变量定义的方式:
通过命令行传递变量参数定义
在playbook中定义变量
- 通过vars定义变量
cat test.yaml
---
- hosts: node
vars:
- web_packages: nginx
tasks:
- name: Installed web
yum: "{{ web_packages }}"
- 通过var_files定义变量,创建一个yml文件专门创建变量,属于公用变量
cat test.yaml
---
- hosts: node
vars_file:
- ./var.yml
tasks:
- name: Installed web
yum: "{{ web_packages }}"
通过inventory在主机组或单个主机中设置变量
- 通过host_vars对主机进行定义
- 通过group_vars对主机组进行定义
cat /etc/ansible/hosts
# 主机变量
[web]
192.168.10.2 myid=1 state=master
192.168.10.3 myid=2 state=backup
# 组变量
[web:vars]
port=80
- 为主机单独创建变量
mkdir host_vars
vim host_vars/192.168.10.2
state: master
- 为主机组创建变量,方式类似,文件名要与主机组名一致
mkdir host_vars
vim host_vars/web
- 外置传递变量,可以在执行playbook时定义变量
ansible-playbook test.yml -e "route_id=8888"
ansible变量优先级:
外置传参——>playbook(vars_file——>vars)——>主机变量——>group_vars——>inventory_group
🍔Register Variables
Ansible的register变量是一种变量类型,用于在运行任务时存储命令、模块或脚本的输出。它们通常用于条件语句或后续任务中,以根据输出结果采取特定的操作。
注册变量可在任务执行完成后访问,以检查命令、模块或脚本执行的输出或结果。您可以使用register变量来存储远程主机上测试的结果,或者正则表达式的匹配结果,甚至是命令的输出。
Register可以将task
执行的任务结果存储至某个变量中,便于后续引用
---
- hosts: all
tasks:
- name: Get network port
shell: netstat -lntp
register: System_port
- name: Debug
debug:
msg: "{{ System_port }}"
这段代码的含义是将netstat -lntp
的执行结果注入到System_port
变量中。
ok: [192.168.10.2] => {
"msg": {
"changed": true,
"cmd": "netstat -lntp",
"delta": "0:00:00.033419",
"end": "2023-03-12 08:44:38.655001",
"failed": false,
"rc": 0,
"start": "2023-03-12 08:44:38.621582",
"stderr": "",
"stderr_lines": [],
"stdout": "Active Internet connections (only servers)\nProto Recv-Q Send-Q Local Address Foreign Address State PID/Program name \ntcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1055/sshd \ntcp 0 0 127.0.0.1:40663 0.0.0.0:* LISTEN 11868/containerd \ntcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1166/master \ntcp6 0 0 :::9100 :::* LISTEN 1053/node_exporter \ntcp6 0 0 :::22 :::* LISTEN 1055/sshd \ntcp6 0 0 :::3000 :::* LISTEN 1054/grafana-server \ntcp6 0 0 ::1:25 :::* LISTEN 1166/master \ntcp6 0 0 :::9090 :::* LISTEN 1058/prometheus ",
"stdout_lines": [
"Active Internet connections (only servers)",
"Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ",
"tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1055/sshd ",
"tcp 0 0 127.0.0.1:40663 0.0.0.0:* LISTEN 11868/containerd ",
"tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1166/master ",
"tcp6 0 0 :::9100 :::* LISTEN 1053/node_exporter ",
"tcp6 0 0 :::22 :::* LISTEN 1055/sshd ",
"tcp6 0 0 :::3000 :::* LISTEN 1054/grafana-server ",
"tcp6 0 0 ::1:25 :::* LISTEN 1166/master ",
"tcp6 0 0 :::9090 :::* LISTEN 1058/prometheus "
]
}
}
如果要选用其中的某个参数,只需要在变量名后加入即可:
- name: Debug
debug:
msg: "{{ System_port.stdout_lines }}"
示例:批量修改主机名
将192.168.10.2-3两台主机名修改为指定格式:
---
- hosts: all
tasks:
- name: String
shell: echo $RANDOM | md5sum | cut -c 2-10
register: system_sj
- name: Chanage hostname
hostname:
name: "centos_7.9_{{ system_sj.stdout }}"
执行结果分别在两台主机查看:
# 192.168.10.2
centos_7.9_1348277e0
# 192.168.10.3
centos_7.9_e08760762
🍔Facts Variables
Ansible中的facts是由Ansible在目标机器上运行的“setup”模块生成的系统和环境信息。这些信息存储在变量中,可以通过Ansible playbook和模板使用。
Facts变量包括:
- 系统信息:操作系统、主机名、内核参数、网络接口、CPU信息等。
- 硬件信息:服务器制造商、BIOS版本、物理内存、磁盘容量等。
- 网络信息:IP地址、MAC地址、路由列表等。
- 环境变量:PATH、PYTHONPATH等环境变量。
在使用场景中:
- 检查CPU信息,生成不同的nginx配置文件
- 检查内存信息。生成不同的memcached配置文件
- 检查主机名信息,生成不同的zabbix配置文件
- 检查IP信息,生成不同的redis配置文件
可以使用下面这条命令查看可用信息:
ansible all -m setup
示例:基于IP生成redis配置文件
---
- hosts: all
tasks:
- name: Installed redis
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
service:
name: redis
state: restarted
配置文件模板:redis.conf.j2
bind 127.0.0.1 {{ ansible_ens33.ipv4.address }}
分别在两台主机上查看是否成功:
[root@centos_7 ~]# netstat -utpln | grep 6379
tcp 0 0 192.168.10.2:6379 0.0.0.0:* LISTEN 30584/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 30584/redis-server
[root@centos_7 ~]# netstat -utpln | grep 6379
tcp 0 0 192.168.10.3:6379 0.0.0.0:* LISTEN 32967/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 32967/redis-server
facts优化:
- 使用
gather_facts: no
关闭facts
- hosts: all
gather_facts: no
- 使用redis进行缓存
vim ansible.cfg
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 192.168.10.3:6379
# 如果redis有密码
fact_caching_connection = 192.168.10.3:6379:0:passwd