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里找

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM