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