Ansible – host_vars 定義特定的變量

Loading

測試環境 CentOS 9 Stream (虛擬機)

架構需求如下系統可以分為 Control node ( Ansible 控制端) 與 Managed nodes (被 Ansible 控制端)

  • Control node ( Ansible 控制端) IP: 192.168.31.131
  • Managed nodes (被 Ansible 控制端) IP: 192.168.31.133 與 192.168.31.178

以下是問 ChatGT 的, 如何在 Managed node1 執行 echo ‘1’ , 在 node2 執行 echo ‘2’ 的範例

使用 host_vars 目錄來為每個節點定義特定的變量,並在 Playbook 中使用這些變量。這個方法可以讓你的配置更加模組化和易於維護。

目錄結構
首先,確保你的 Ansible 專案目錄結構如下所示:

ansible_project/
├── inventory
│   ├── hosts
│   └── host_vars/
│       ├── node1.yml
│       ├── node2.yml
├── playbook.yml
[root@localhost ~]# mkdir -p ansible_project/inventory/host_vars/
[root@localhost ~]# cd ansible_project/
[root@localhost ansible_project]#
  • 創建 Inventory 文件
    在 inventory/hosts 文件中,定義你的節點:

    [root@localhost ansible_project]# vi inventory/hosts
    [nodes]
    node1 ansible_host=192.168.31.133
    node2 ansible_host=192.168.31.178
    
  • 創建 host_vars 目錄和變量文件
    在 inventory/host_vars/ 目錄中,為每個節點創建一個 YAML 文件,並在文件中定義特定於該節點的變量。

    [root@localhost ansible_project]# vi inventory/host_vars/node1.yml
    node_command: "echo '1'"
    
    [root@localhost ansible_project]# vi inventory/host_vars/node2.yml
    node_command: "echo '2'"
    
  • 創建 Playbook
    在 Ansible 專案目錄中,創建一個 Playbook 文件 playbook.yml (建議可以用 nano 的編輯器, copy Paste 以下資料就不會出問題)

    [root@localhost ansible_project]# vi playbook.yml
    - hosts: nodes
      tasks:
        - name: 執行特定節點的命令
          command: "{{ node_command }}"
    

    這個 Playbook 的作用是在所有定義在 nodes 組中的節點上執行每個節點特定的命令。命令是通過每個節點的 host_vars 文件中的 node_command 變量來定義的。

  • 執行 Playbook
    在終端中導航到你的 Ansible 專案目錄,然後運行以下命令來執行 Playbook:

    可以先用 ansible-lint 檢視 playbook.yml 是否有錯誤.

    [root@localhost ansible_project]# ansible-lint playbook.yml
    WARNING  Listing 3 violation(s) that are fatal
    name[play]: All plays should be named.
    playbook.yml:1
    
    fqcn[action-core]: Use FQCN for builtin module actions (command).
    playbook.yml:3 Use `ansible.builtin.command` or `ansible.legacy.command` instead.
    
    no-changed-when: Commands should not change things if nothing needs doing.
    playbook.yml:3 Task/Handler: 執行特定節點的命令
    
    Read documentation for instructions on how to ignore specific rule violations.
    
                        Rule Violation Summary
     count tag               profile    rule associated tags
         1 name[play]        basic      idiom
         1 no-changed-when   shared     command-shell, idempotency
         1 fqcn[action-core] production formatting
    
    Failed: 3 failure(s), 0 warning(s) on 1 files. Last profile that met the validation criteria was 'min'.
    A new release of ansible-lint is available: 6.22.2 → 24.6.1
    

    執行

    [root@localhost ansible_project]# ansible-playbook -i inventory/hosts playbook.yml
    
    PLAY [nodes] ***********************************************************************************************************
    
    TASK [Gathering Facts] *************************************************************************************************
    ok: [node1]
    ok: [node2]
    
    TASK [執行特定節點的命令] **********************************************************************************************
    changed: [node1]
    changed: [node2]
    
    PLAY RECAP *************************************************************************************************************
    node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    node2                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

    解釋

    • Inventory 文件:inventory/hosts 文件中定義了所有節點,並將它們分組在 nodes 組中。
    • Host Variables:在 inventory/host_vars/ 目錄中,每個節點有一個單獨的 YAML 文件,定義了該節點的特定變量 node_command。
    • Playbook:在 playbook.yml 中,任務 執行特定節點的命令 使用 command 模塊來執行 node_command 變量中定義的命令。Ansible 會自動根據當前節點從對應的 host_vars 文件中讀取 node_command 變量的值。

    通過這種方法,你可以輕鬆地為每個節點定義特定的變量,並在 Playbook 中引用這些變量。這樣做的好處是配置更加模組化,便於管理和維護。

沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料