一、常用系統變量
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里找