ansible之变量
一、常用系统变量
1. loop #表示循环,去读循环体里的变量固定使用{{item}},item是个字典对象item.key=value,例如如下playbook内容:
--- - name: test loop hosts: localhost connection: local gather_facts: no tasks: - name: debug loop debug: msg: "{{item.A1}}" loop: - A: a A1: a1 A2: a2 - B: b A1: b1 A2: b2 - C: c A1: c1 A2: c2 - D: d A1: d1 A2: d2
A: a A1: a1 A2: a2 以上成为一块,即一个item,符号"-"为循环体块的标志,{{item.A1}}的值,即分别为a1,b1,c1,d1
结果输出:
playbook文件print_info2.yaml信息如下: --- - name: test loop hosts: localhost connection: local gather_facts: no vars: my_list: - a - b - c - 1 tasks: - name: debug loop output debug: msg: "The {{index}} one is {{item}}" loop: "{{my_list}}" loop_control: index_var: index
2. when 当条件满足时,执行
官方文档说明:https://docs.ansible.com/ansible/2.7/user_guide/playbooks_conditionals.html#playbooks-conditionals
二、在主机列表文件里定义变量
默认主机列表文件位置/etc/ansible/hosts,可自定义局部主机配置文件位置
如上图,展示了两种变量表现形式:
1.基于组的变量:组内部的所有成员主机都获得此变量
[ios:vars] #代表基于ios组的变量集 passwd=123456 #变量名passwd,值123456,由组内成员共享 ansible_connection=network_cli #2.5版本后推出新的连接方式,代替provider ansible_network_os=ios #告知ansible是基于ios的系统 ansible_use=cisco #ssh用户名cisco ansible_ssh_pass=cisco #ssh登录密码cisco ansible_become=yes #是否进入特权模式,yes是 ansible_become_method=enable #进入方法:enable ansible_become_pass=cisco #enable密码cisco #注意:ansible_开头一般都是众所周知的变量名
2.基于单个主机的变量
每一台主机设备所在行,直接变量=值的方式表示
r5a ansible_host=192.168.62.45 user=r5 #主机名r5a,变量ansible_host=192.168.62.45 ,变量user=r5
三、在playbook里定义变量
四、 在host_vars,group_vars文件中定义变量
4.1 此方法可定义较复杂变量,定义方法如下:
#1.创建host_vars和group_vars两个文件夹 (ps:上述两个文件夹要么创建于playbook下,要么创建于my_inventory此类文件设备同目录下。一般情况,playbook和inventory主机配置文件都是在同一目录下,所以无需太在意) [root@localhost test_ansible]# pwd /root/test_ansible [root@localhost test_ansible]# [root@localhost test_ansible]# mkdir group_vars [root@localhost test_ansible]# [root@localhost test_ansible]# mkdir host_vars #2.文件夹内创建对应文件 ##2.1 group_vars存放基于组名的文件 例如:在我们的inventory主机配置清单里,定义了ios组,则关于这个组的变量定义,创建一个ios.yaml的YAML文件,文件定义的变量就会应用到整个ios组,以及组下的所有成员 ##2.2 host_vars存放基于设备主机的文件 例如:在inventory主机配置清单里,有一台主机r1,创建一个r1.yaml的YAML文件,文件定义的变量就会自动与r1关联
4.2 示例说明
在host_vars/localhost.yaml文件里
--- content: hello world!
physical_port: - int_name: GE1/0/1 int_ip: 192.168.12.2/24 neighbor_name: r3 - int_name: GE1/0/2 int_ip: 192.168.23.2/24 neighbor_name: r1
编辑playbook文件loop2.yaml
--- - name: test loop hosts: localhost connection: local gather_facts: no tasks: - name: debug loop debug: msg: "{{content}}"
结果截图:
五、不同位置变量优先执行顺序
playbook里的定义的vars > host_vars目录下的主机文件 > inventory清单主机文件里的主机行变量 > group_vars目录下的组文件 > inventory清单主机文件里的组[xx:vars]组变量
六、变量注意事项
#1.ansible_xx一般为内部变量,有些可被自动调用,例如ansible_user和ansible_ssh_pass会自动被ansible_connection:network_cli调用 #2.在playbook里定义host:为主机名a而非组名A时,如果该主机a归属在组名A里,则组A的组变量也能被a调用 #3.自定义ansible.cfg为b,存放在要运行playbook的目录下,配置文件b里的变量只需定义与主配置文件ansible.cfg不一样的即可,因为ansible在运行时,在配置文件b找不到会去ansible.cfg里找