Ansible Variables
1、什么是变量
变量提供了便捷的方式来管理 ansible 项目中的动态值。 比如 nginx-1.12 ,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便。这样可以简化项目的创建和维护;
2、变量定义的方式
2.1、通过命令行传递变量参数定义
2.2、在play文件中进行定义变量
1、通过vars定义变量 2、通过vars_files定义变量
2.3、通过inventory在主机组或单个主机中设置变量
1、通过host_vars对主机进行定义 2、通过group_vars对主机组进行定义
3、Playbook中定义变量
3.1、vars方式定义变量
3.1.1、定义方法
在 playbook 的文件中开头通过 vars 关键字进行变量定义
3.1.2、示例
cat << 'CAT_END' > vars_test.yml - hosts: localhost vars: - web_packages: httpd - ftp_packages: vsftpd tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}" CAT_END
3.2、vars_files方式定义变量
3.2.1、方法
在 playbook 中使用 vars_files 指定文件作为变量文件,好处就是其他的playbook 也可以调用;
3.2.2、示例
# 1、准备一个用于存储变量的文件,后缀为 .yml 文件内容: vars_name: value cat << 'CAT_END' >vars.yaml web_packages: httpd ftp_packages: vsftpd CAT_END # 2、使用 Playbook 调用变量文件 cat << 'CAT_END' >var_file.yaml - hosts: localhost vars_files: ./vars.yaml tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}" CAT_END
3.3、在Inventory中定义变量
3.3.1、在inventory主机清单中定义变量
注意:主机变量优先级高于主机组变量。 ]# vi /etc/ansible/hosts [httpd] 192.168.10.17 web=nginx version=1.22 port=8080 192.168.10.18 web=nginx version=1.22 port=8080 [httpd:vars] port=80 ---------------------------------------------- cat << 'CAT_END' > host_var.yaml - hosts: httpd tasks: - name: out put variable debug: msg: - "{{ web }} {{ version }} {{ port }}" CAT_END ---------------------------------------------- # 输出结果 TASK [out put variable] ******************************************************** ok: [192.168.10.17] => { "msg": [ "nginx 1.22 8080" ] } ok: [192.168.10.18] => { "msg": [ "nginx 1.22 8080" ] }
3.4、使用host_vars定义变量
3.4.1、方法
在项目目录中创建 host_vars 目录,然后在创建一个文件,文件的文件名称要与inventory 清单中的主机名称要保持完全一致,如果是ip地址,则创建相同ip地址的文件即可
3.4.2、示例
# 1、主机清单 ]# cat /etc/ansible/hosts [httpd] 192.168.10.17 192.168.10.18
# 创建存放变量的目录 mkdir host_vars # 2、在 host_vars 目录中创建文件,给 192.168.10.17 主机定义变量 cat << 'CAT_END' > host_vars/192.168.10.17 web: nginx version: 1.2 CAT_END # 3、准备一个 playbook 文件调用 host_vars 目录中定义的主机变量 cat << 'CAT_END' > host_var_ip.yaml - hosts: 192.168.10.17 tasks: - name: output variable debug: msg: - "{{ web }}" - "{{ version }}" - hosts: 192.168.10.18 tasks: - name: output variable debug: msg: - "{{ web }}" - "{{ version }}" CAT_END
3.5、使用group_vars定义变量
3.5.1、方法
在项目目录中创建 group_vars 目录,然后在创建一个文件,文件的文件名称要与 inventory 清单中的组名称保持完全一致
3.5.2、组的局部变量【示例】
# 1、主机清单 ]# cat /etc/ansible/hosts [httpd] 192.168.10.17 192.168.10.18 mkdir group_vars # 2、在 group_vars 目录中创建 httpd 文件,为 httpd 主机组设定变量 cat << 'CAT_END' > group_vars/httpd web: nginx_group version: 1.2_group CAT_END # 3、准备一个 playbook 文件调用 group_vars 目录中定义的主机变量 cat << 'CAT_END' > group_var.yaml - hosts: httpd tasks: - name: output variable debug: msg: - "{{ web }}" - "{{ version }}" CAT_END
3.5.3、组的全局变量【示例】
cat << 'CAT_END' > group_vars/all web: nginx_group version: 1.2_group CAT_END
3.6、通过执行Playbook命令传递变量
3.6.1、方法
在执行Playbook时,可以通过命令行 --extra-vars 或 -e 外置传参设定变量;
3.6.2、示例
# 创建调试playbook cat << 'CAT_END' > cmd_var.yaml - hosts: httpd tasks: - name: output variable debug: msg: - "{{ arg1 }}" - "{{ arg2 }}" CAT_END ]# ansible-playbook cmd_var.yaml -e "arg1=test" -e "arg2=cyc"
3.7、变量优先级总结
3.7.1、变量方式的总结
1)在plabook中定义vars变量 2)在playbook中定义vars_files变量 3)在host_vars中定义变量 4)在group_vars中定义变量 5)通过执行命令传递变量
3.7.2、变量优先级
命令行变量--> play中的vars_files --> play中的vars --> inventory-hosts --> host_vars --> group_vars/group_name --> group_vars/all --> inventorygroup
4、变量注册Register
4.1、什么是Register
register 关键字可以将某个 task 任务结果存储至变量中,最后使用 debug 输出变量内容,可以用于后续排障;
4.2、示例1-【获取netstats的结果】
4.2.1、编写playbook
cat << 'CAT_END' > register_1.yaml - hosts: localhost tasks: - name: shell: netstat -tunlp register: result - name: run netstat result debug: msg={{result.stdout_lines}} CAT_END
4.2.2、查看运行结果
]# ansible-playbook register_1.yaml PLAY [localhost] ********************************************************************************************************************************************* TASK [Gathering Facts] *************************************************************************************************************************************** ok: [localhost] TASK [shell] ************************************************************************************************************************************************* changed: [localhost] TASK [run netstat result] ************************************************************************************************************************************ ok: [localhost] => { "msg": [ "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:111 0.0.0.0:* LISTEN 658/rpcbind ", "tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 946/sshd ", "tcp 0 0 0.0.0.0:52936 0.0.0.0:* LISTEN 1408/rpc.statd ", "tcp6 0 0 :::56303 :::* LISTEN 1408/rpc.statd ", "tcp6 0 0 :::111 :::* LISTEN 658/rpcbind ", "tcp6 0 0 :::22 :::* LISTEN 946/sshd ", "udp 0 0 127.0.0.1:736 0.0.0.0:* 1408/rpc.statd ", "udp 0 0 0.0.0.0:830 0.0.0.0:* 658/rpcbind ", "udp 0 0 0.0.0.0:52176 0.0.0.0:* 1408/rpc.statd ", "udp 0 0 0.0.0.0:111 0.0.0.0:* 658/rpcbind ", "udp 0 0 127.0.0.1:323 0.0.0.0:* 687/chronyd ", "udp6 0 0 :::830 :::* 658/rpcbind ", "udp6 0 0 :::111 :::* 658/rpcbind ", "udp6 0 0 ::1:323 :::* 687/chronyd ", "udp6 0 0 :::48726 :::* 1408/rpc.statd " ] } PLAY RECAP *************************************************************************************************************************************************** localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4.3、示例2-【结果分割处理显示】
cat <<'CAT_END' > register_2.yaml - hosts: httpd tasks: - name: run shell command shell: cmd: "SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 |head -c 50`;echo SECRET_KEY=${SECRET_KEY}" register: SECRET_KEY - name: output variable debug: msg={{SECRET_KEY.stdout.split('=')[1]}} CAT_END