变量通过便捷的方式来管理ansible项目中的动态值。
比如:version=ngix-1.16
在使用中只需要调用version
这个变量名即可,方便管理及后期升级修改等操作。
🍔变量定义的方式:
通过命令行传递变量参数定义
在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