目錄
- fact變數
- 1.1 fact變數的引用
- ansible的魔法變數
- 1. 魔法變數的使用
- 1.1 魔法變數的實際使用
- 1. 魔法變數的使用
fact變數
在常用模組裡就提到過setup模組,這個模組會收集被控端的資訊,而這個模組收集資訊的方式就是依賴於fact,返回的是json格式的資料
[ansible@master ansible]$ ansible all -m setup >setup
[ansible@master ansible]$ vim setup
192.168.200.210 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.200.210",
"172.17.0.1",
"10.245.149.0"
],
這裡面會有非常多的資訊,同時這都都是變數,採用鍵值對的方式
1.1 fact變數的引用
fact變數的引用有個前提就是playbook裡面的gather_facts一定要是開啟狀態
我們讓節點輸出一個IP地址
透過上面擷取的ip地址資訊可以得知ansible_all_ipv4_addresses這個變數的值是一個列表,那我們要取出這個列表裡的值的話直接給出索引就好了
[ansible@master ansible]$ vim fact-ip.yaml
[ansible@master ansible]$ cat fact-ip.yaml
---
- name: print ip
hosts: all
tasks:
- name: Print the first IPv4 address
debug:
msg: "{{ ansible_all_ipv4_addresses.0 }}"
# 這裡的寫法還可以是 ansible_all_ipv4_addresses[0]
執行劇本
[ansible@master ansible]$ ansible-playbook fact-ip.yaml
ok: [192.168.200.210] => {
"msg": "192.168.200.210"
}
這個時候他就返回了一個ip地址
剛剛取出的是一個列表裡的某個值,如果我們需要取出一個字典裡的值呢?其實這個更加的簡單
"ansible_default_ipv4": {
"address": "192.168.200.210",
"alias": "ens33",
"broadcast": "192.168.200.255",
"gateway": "192.168.200.2",
"interface": "ens33",
"macaddress": "00:0c:29:2c:0d:98",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "192.168.200.0",
"type": "ether"
},
比如這一段內容,這些內容都是來自setup
我們需要取出address的話直接這樣寫
[ansible@master ansible]$ vim fact-ip.yaml
---
- name: print ip
hosts: all
tasks:
- name: Print the first IPv4 address
debug:
msg: "{{ ansible_default_ipv4.address }}"
直接用 **. ** 一直寫到你想取出的值的key
[ansible@master ansible]$ ansible-playbook fact-ip.yaml
ok: [192.168.200.210] => {
"msg": "192.168.200.210"
}
這個也是沒有問題的
我們將fact功能給關掉,看他還能不能正常輸出
[ansible@master ansible]$ vim fact-ip.yaml
---
- name: print ip
hosts: all
gather_facts: false
tasks:
- name: Print the first IPv4 address
debug:
msg: "{{ ansible_default_ipv4.address }}"
去執行他
[ansible@master ansible]$ ansible-playbook fact-ip.yaml
TASK [Print the first IPv4 address] ********************************************
fatal: [192.168.200.210]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible_default_ipv4' is undefined\n\nThe error appears to be in '/home/ansible/ansible/fact-ip.yaml': line 6, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: Print the first IPv4 address\n ^ here\n"}
看到了吧,他直接就報錯了,報錯的原因是有一個沒有被定義的變數
ansible的魔法變數
- hostvars:獲取指定主機的相關變數格式為 {{ hostvars['主機名'].ansible_default_ipv4.address }},這樣可以獲取指定主機的IP地址
- inventory_hostname:識別當前正在執行task的主機名,可以與hostvars一起使用
- {{ hostvars[inventory_hostname].ansible_default_ipv4.address }}
- groups:列出所有/指定主機組的列表
- {{ groups }} 列出所有的主機
- {{ groups.test}} 列出test主機組下的所有主機
- {{ group_names }} 列出當前正在執行task的主機所在的主機組
1. 魔法變數的使用
現在我們將控制節點也加入到主機清單內
[ansible@master ansible]$ cat inventory
[test]
192.168.200.210 os=euler
192.168.200.200 ansible_user=root
[test:vars]
ansible_user=ansible
ansible_ssh_pass=123
ansible_become=yes
websoft=nginx
1.1 魔法變數的實際使用
讓每臺主機輸出自己的default IP地址
[ansible@master ansible]$ vim magic-vars.yaml
- name: print ip
hosts: test
tasks:
- name: print
debug:
msg: "{{ hostvars[inventory_hostname].ansible_default_ipv4.address }}"
這裡的意思是使用hostvars採集某臺主機的變數,哪臺主機呢?我們使用inventory_hostname 代表當前正在執行這個劇本的主機,然後後面的都是普通的變數了