Ansible_管理事實(Fact)


一、Ansible管理事實(fact)

1、Ansible事實描述

1️⃣:Ansible事實是Ansible在受管主機上自動檢測到的變量

2️⃣:事實(fact)中包含有與主機相關的信息,可以像play中的常規變量、條件、循環或依賴於從受管主機收集的值的任何其他語句那樣使用

3️⃣:一些事實可能包括:

主機名稱、內核版本、網絡接口、IP地址、操作系統版本、各種環境變量、CPU數量、提供的或可用的內存、可用磁盤空間等等

4️⃣:借助事實,可以方便地檢索受管主機的狀態,並根據該狀態確定要執行的操作

例如:

  • 可以根據含有受管主機當前內核版本的事實運行條件任務,以此來重啟服務器
  • 可以根據通過事實報告的可用內存來自定義MySQL配置文件
  • 可以根據事實的值設置配置文件中使用的IPv4地址

5️⃣:每個play在執行第一個任務之前會先自動運行setup模塊來收集事實

  • 演示實例:使用debug模塊顯示ansible_facts變量值為受管主機收集事實
     //查看playbook文件
    [root@localhost project]# cat playbook.yaml 
    ---
    - hosts: all
      tasks:
        - name: 收集事實
          debug:
            var: ansible_facts
    
     //執行play收集事實
    [root@localhost project]# ansible-playbook playbook.yaml
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [client.example.com]
    TASK [收集事實] *************************************************************************************************************************************************************** ok: [client.example.com] => { "ansible_facts": { "all_ipv4_addresses": [ "192.168.121.81" ], "all_ipv6_addresses": [ "fe80::63e7:778f:ba5b:fa1d" ], ............
  • PlaybookJSON格式顯示ansible_facts變量的內容
  • Ansible事實的示例:
    事實 變量
    短主機名 ansible_facts['hostname']
    完全限定域名 ansible_facts['fqdn']
    IPv4地址 ansible_facts['default_ipv4']['address']
    所有網絡接口的名稱列表 ansible_facts['interfaces']
    /dev/vda1磁盤分區的大小 ansible_facts['devices']['vda']['partitions']['vda1']['size']
    DNS服務器列表 ansible_facts['dns']['nameservers']
    當前運行的內核版本 ansible_facts['kernel']

6️⃣:在playbook中使用事實時,Ansible將事實的變量名動態替換為對應的值

  • 演示實例:
     //查看playbook文件
    [root@localhost project]# cat playbook.yaml 
    ---
    - hosts: all
      tasks:
        - name: 收集事實
          debug:
            msg: >     // >:表示換行的意思
              this host ip is {{ ansible_facts['default_ipv4']['address'] }}
              this hostname is {{ ansible_facts['hostname']}}
    
     //執行playbook文件
    [root@localhost project]# ansible-playbook playbook.yaml 
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [client.example.com]
    
    TASK [收集事實] ***************************************************************************************************************************************************************
    ok: [client.example.com] => {
        "msg": "this host ip is 192.168.121.81 this hostname is client\n"
    }
    PLAY RECAP ****************************************************************************************************************************************************************
    client.example.com         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

2、Ansible事實作為變量注入

1️⃣:較早的變量注入:

  • Ansible2.5之前,事實是作為前綴為字符串ansible_的單個變量注入,而不是作為ansible_facts變量的一部分注入
    • ansible_facts['distribution']事實會被稱為ansible_distribution
  • 可以使用臨時命令來運行setup模塊,以此形式顯示所有事實的值:
    • 演示實例:
      [root@localhost project]# ansible all -m setup
      client.example.com | SUCCESS => {
          "ansible_facts": {
              "ansible_all_ipv4_addresses": [
                  "192.168.121.81"
              ],
              "ansible_all_ipv6_addresses": [
                  "fe80::63e7:778f:ba5b:fa1d"
              ],
              "ansible_apparmor": {
                  "status": "disabled"
              },
      ............

2️⃣:選定的Ansible事實名稱比較

ansible_facts形式 舊事實變量形式
ansible_facts['hostname'] ansible_hostname
ansible_facts['fqdn'] ansible_fqdn
ansible_facts['default_ipv4']['address'] ansible_default_ipv4['address']
ansible_facts['interfaces'] ansible_interfaces
ansible_facts['devices']['vda']['partitions']['vda1']['size'] ansible_devices['vda']['partitions']['vda1']['size']
ansible_facts['dns']['nameservers'] ansible_dns['nameservers']
ansible_facts['kernel'] ansible_kernel

 

 

 

 

 

 

 

 

 

3️⃣:將Ansible配置文件的[default]部分中inject_facts_as_vars參數設置為False,可關閉舊命名系統。默認設置為True

4️⃣:inject_facts_as_vars的默認值在Ansible的未來版本中可能會更改為False

  • 如果設置為False,則只能使用新的ansible_facts.*命名系統引用Ansible事實

3、關閉事實收集

1️⃣:要為play禁用事實收集功能,可將gather_facts關鍵字設置為no

  • 演示實例:
    [root@localhost project]# cat playbook.yaml 
    ---
    - hosts: all
      gather_facts: no
      tasks:
        - name: test file
          debug:
              var: anisble_facts

2️⃣:即使play設置了gather_facts: no,也可以隨時通過運行使用setup模塊的任務來手動收集事實

  • 演示實例:
    [root@localhost project]# cat playbook.yaml 
    ---
    - hosts: all
      gather_facts: no
      tasks:
        - name: get ansible_facts
          setup:
    
        - name: test debug
          debug:
            var: ansible_facts

4、創建自定義事實

1️⃣:除了使用系統捕獲的事實外,我們還可以自定義事實,並將其本地存儲在每個受管主機上;

2️⃣:默認情況下,setup模塊從各受管主機的/etc/ansible/facts.d目錄下的文件和腳本中加載自定義事實

3️⃣:各個文件或腳本的名稱必須.fact結尾才能被使用;動態自定義事實腳本必須輸出JSON格式的事實,而且必須是可執行文件

4️⃣:演示實例:

  • 方式一采用INI格式編寫的靜態自定義事實文件
     //在受管主機上創建自定義文件
    [root@client ~]# mkdir -p /etc/ansible/facts.d
    [root@client ~]# cd /etc/ansible/facts.d/
    [root@client facts.d]# cat example.fact 
    [users]
    user_one: zhangsan
    user_two: lisi
    
    [servers]
    service_one: httpd
    service_two: mariadb
    
     //在控制節點上查看
    [root@localhost project]# ansible all -m setup |less
    ..............
    "ansible_local": {
                "example": {
                    "servers": {
                        "service_one": "httpd",
                        "service_two": "mariadb"
                    },
                    "users": {
                        "user_one": "zhangsan",
                        "user_two": "lisi"
                    }
                }
            },
    ...............
  • 方式二JSON格式提供事實,JSON事實等同於INI格式指定的事實,JSON數據可以存儲在靜態文本文件中
     //查看用JSON格式寫對fact文件
    [root@client facts.d]# pwd
    /etc/ansible/facts.d
    [root@client facts.d]# cat test.fact 
    {
       "users": {
          "user_one": "zhangsan",
          "user_two": "lisi"
       },
       "servers": {
          "service_one": "httpd",
          "service_two": "vsftpd"
       }
    }
    
    
     //在控制節點上查看
    [root@localhost project]# ansible all -m setup |less
    .............
    "ansible_local": {
                "test": {
                    "servers": {
                        "service_one": "httpd",
                        "service_two": "vsftpd"
                    },
                    "users": {
                        "user_one": "zhangsan",
                        "user_two": "lisi"
                    }
                }
            },
    .............

5️⃣:自定義事實由setup模塊存儲在ansible_facts['ansible_local']變量中

  • 事實按照定義它們的文件的名稱來整理;例如:自定義事實由受管主機上保存為/etc/ansible/facts.d/example.fact的文件,在這種情況下,ansible_facts['ansible_local']['example']['users']['user_two']的值為lisi
  • 演示實例:
     //在控制節點編寫playbook
    [root@localhost project]# cat playbook.yaml 
    ---
    - hosts: all
      tasks:
        - name: 輸出某個用戶
          debug:
            msg: 該用戶是:{{ ansible_facts['ansible_local']['example']['users']['user_one'] }}
    
     //執行playbook
    [root@localhost project]# ansible-playbook playbook.yaml 
    
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [client.example.com]
    
    TASK [輸出某個用戶] *************************************************************************************************************************************************************
    ok: [client.example.com] => {
        "msg": "該用戶是:zhangsan"
    }
    
    PLAY RECAP ****************************************************************************************************************************************************************
    client.example.com         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
     //查看與anisble_local上的信息是否正確
    [root@localhost project]# ansible all -m setup |less
    ..............
    "ansible_local": {
                "example": {
                    "servers": {
                        "service_one": "httpd",
                        "service_two": "vsftpd"
                    },
                    "users": {
                        "user_one": "zhangsan",
                        "user_two": "lisi"
                    }
                }
            },
    .............
  •  //查看playbook文件內容
    [root@localhost project]# cat playbook.yaml 
    ---
    - hosts: all
      tasks:
        - name: 輸出某個用戶
          debug:
            var:  ansible_facts['ansible_local']['example']['users']['user_one'] }}
    
     //執行playbook
    [root@localhost project]# ansible-playbook playbook.yaml 
    
    PLAY [all] ****************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [client.example.com]
    
    TASK [輸出某個用戶] *************************************************************************************************************************************************************
    ok: [client.example.com] => {
        "ansible_facts['ansible_local']['example']['users']['user_one'] }}": "zhangsan}}"
    }
    
    PLAY RECAP ****************************************************************************************************************************************************************
    client.example.com         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    執行playbook另外一種方式 

5、使用魔法(magic)變量

1️⃣:一些變量並非事實或通過setup模塊配置,但也由Ansible自動設置。這些魔法變量也可用於獲取與特定受管主機相關的信息

2️⃣:常用的魔法變量

魔法變量 說明
hostvars 包含受管主機的變量,可以用於獲取另一台受管主機的變量的值。
如果還沒有為受管主機收集事實,則它不會包含該主機的事實。
group_names 列出當前受管主機所屬的所有組
groups 列出清單中的所有組和主機
inventory_hostname 包含清單中配置的當前受管主機的主機名稱。
因為各種原因有可能與事實報告的主機名稱不同

 

 

 

 

 

 

 

 

3️⃣:更多魔法變量,請參考官方文檔:https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html#special-variables

 


免責聲明!

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



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