Ansible fact變數與魔法變數

FuShudi發表於2024-06-20

目錄
  • fact變數
    • 1.1 fact變數的引用
  • ansible的魔法變數
    • 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的魔法變數

  1. hostvars:獲取指定主機的相關變數格式為 {{ hostvars['主機名'].ansible_default_ipv4.address }},這樣可以獲取指定主機的IP地址
  2. inventory_hostname:識別當前正在執行task的主機名,可以與hostvars一起使用
    • {{ hostvars[inventory_hostname].ansible_default_ipv4.address }}
  3. 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 代表當前正在執行這個劇本的主機,然後後面的都是普通的變數了

相關文章