在ansible中,關於如何引用自定義的變數,一直讓我很頭疼
尤其是有牽涉到從外部導入yaml檔案時,更是常常讓我不知道到底該怎麼抓出想要的變數
這次還是用selectattr 來處理,希望下次能夠記得…
首先是導入的yaml檔案,內容長這樣
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 | client_hosts:
  abc.com:
  - host: hqdc021
    ipv4: 192.168.11.21
  - host: hqdc022
    ipv4: 192.168.11.22
  - host: hqdc023
    ipv4: 192.168.11.23
  - host: hqdc024
    ipv4: 192.168.11.24
  - host: hqdc025
    iuser: True
    ipv4: 192.168.11.25
    user: [yangj]
  - host: hqdc026
    ipv4: 192.168.11.26
    user: [changp, joy]
  - host: hqdc027
    ipv4: 192.168.11.27
  xyz.com:
  - host: dc021
    iuser: True
    ipv4: 192.168.1.21
	user: [tim]
  - host: dc022
    ipv4: 192.168.1.22
  - host: dc023
    ipv4: 192.168.1.23
  - host: dc024
    ipv4: 192.168.1.24
  - host: dc025
    ipv4: 192.168.1.25
    user: [eric]
  - host: dc026
    ipv4: 192.168.1.26
    user: [erica]
  - host: dc027
    ipv4: 192.168.1.27
 | 
 
在playbook中,首先先導入這個檔案
| 1
2
3
4
 | - name: load client_host
  include_vars:
    file: client_hosts.yml
    name: ch
 | 
 
然後用這個剛剛導入的檔案,去做出想要的清單
像底下這個,就是指定了client_hosts的 abc.com 這個域名底下,iuser有被定義的資料,再轉成list
| 1
2
3
 | - name: get internet user list
  set_fact:
    iuser_list: "{{ ch['client_host']['abc.com']|selectattr('iuser','defined')|list }}"
 | 
 
然後就可以用來做condition了
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 | - name: copy environment block to /etc/environment
  copy:
   content: |
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    all_proxy="{{ proxy_env }}"
    http_proxy="{{ proxy_env }}"
    https_proxy="{{ proxy_env }}"
    no_proxy="localhost,127.0.0.1,192.168.1.1/16,.xyz.com,.abc.com"
   dest: /etc/environment
  when: item.ipv4 == ansible_default_ipv4.address
  with_items: "{{ iuser_list }}"
 |