2016-11-15 58 views
1

的Ansible最佳實踐文檔recommends分離庫存:如何在Ansible中的不同庫存之間共享group_vars?

 
inventories/ 
    production/ 
     hosts.ini   # inventory file for production servers 
     group_vars/ 
     group1   # here we assign variables to particular groups 
     group2   # "" 
     host_vars/ 
     hostname1  # if systems need specific variables, put them here 
     hostname2  # "" 

    staging/ 
     hosts.ini   # inventory file for staging environment 
     group_vars/ 
     group1   # here we assign variables to particular groups 
     group2   # "" 
     host_vars/ 
     stagehost1  # if systems need specific variables, put them here 
     stagehost2  # "" 

我的分期和生產環境都以同樣的方式構成。我在兩種環境中都有相同的組。事實證明,我也有相同的group_vars相同的組。這意味着我想消除冗餘。

有沒有辦法在不同庫存之間共享一些group_vars?

作爲一種變通我開始把共享group_vars進入角色。

my_var: 
    my_group: 
    - { var1: 1, var2: 2 } 

這使得有可能通過交叉主機的組與定義的VAR遍歷一些增值經銷商:

with_items: "{{group_names | intersect(my_var.keys())}}" 

但是,這是一個有點複雜理解,我覺得角色不應該知道任何關於團體的事

我想單獨大部分庫存,但分享一些group_vars在一個易於理解的方式。是否有可能將全局group_vars與庫存特定的group_vars合併?

回答

0

我抓住了這個想法,按照Ansible的建議。現在一年後,我確信Ansible的建議對我的要求沒有用處。相反,我認爲儘可能在不同階段分享是很重要的。

現在我把所有庫存在同一目錄:

production.ini 
reference.ini 

我照顧每個庫存定義了一組包括與舞臺的名稱的所有主機。

文件production.ini有組production

[production:children] 
all_production_hosts 

和文件reference.ini有組reference

[reference:children] 
all_reference_hosts 

我只有一個group_vars目錄中,我定義了一個文件,每分期組:

group_vars/production.yml 
group_vars/reference.yml 

並且每個文件定義一個stage變量。該文件production.yml定義是:

--- 
stage: production 

和文件reference.yml定義:

--- 
stage: reference 

這使得可以分享一切生產和基準之間別人。但主持人完全不同。通過使用正確的庫存在PlayBook上運行無論是在生產或引用主機:

ansible-playbook -i production.ini site.yml 
ansible-playbook -i reference.ini site.yml 

如果有必要的site.yml或角色,表現在生產和參考環境略有不同,他們可以通過使用條件stage變量。但我儘量避免這種情況。因爲最好將所有差異移入分段文件production.ymlreference.yml中的等效定義。

例如,如果group_vars/all.yml定義了一些用戶:

users: 
    - alice 
    - bob 
    - mallory 

我想創建這兩個環境中的用戶,但我想從生產環境中排除mallory,我可以定義一個名爲新組effective_users。在reference.yml它等同於users列表:

effective_users: >- 
    {{ users }} 

但在production.yml我可以排除mallory

effective_users: >- 
    {{ users | difference(['mallory']) }} 

的劇本或角色,也不需要在兩個階段之間的區別,他們可以簡單地使用組effective_users。該組僅通過選擇清單自動包含用戶的正確清單。

2

您可以將group_vars在劇本目錄中。 More info

Ansible將爲他們提供所有庫存。

+0

但這隻適用於劇本。即席命令將失敗。有沒有辦法自定義ad-hoc命令執行,以便讀取全局group_vars? – ceving

+0

另一個問題似乎是,如果我想從不同的組收集變量,我必須設置'hash_behaviour = merge'。以及哈希中的數組值如何? – ceving

+0

這不適用於ad-hoc。列表不能自動合併,你必須使用一些手動任務。 –

2

簡單的選項,在這裏(我們做什麼)僅僅是符號鏈接通用組圍繞瓦爾文件。

例如,我們可能有這樣的事情NGINX該角色通用的角色,然後幾個具體的使用情況。在這種情況下,我們創建一個組變量文件,該文件爲每個具體用例使用NGINX角色,然後將這些組變量文件簡單地鏈接到適當的文件夾中。然後

我們的項目文件夾結構可能是這個樣子(徹底簡化):

. 
├── inventories 
│   ├── bar-dev 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── dev.yml -> ../../shared/dev.yml 
│   │   └── inventory 
│   ├── bar-prod 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── prod.yml -> ../../shared/prod.yml 
│   │   └── inventory 
│   ├── bar-test 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── test.yml -> ../../shared/test.yml 
│   │   └── inventory 
│   ├── foo-dev 
│   │   ├── group_vars 
│   │   │   ├── dev.yml -> ../../shared/dev.yml 
│   │   │   └── foo.yml -> ../../shared/foo.yml 
│   │   └── inventory 
│   ├── foo-prod 
│   │   ├── group_vars 
│   │   │   ├── foo.yml -> ../../shared/foo.yml 
│   │   │   └── prod.yml -> ../../shared/prod.yml 
│   │   └── inventory 
│   ├── foo-test 
│   │   ├── group_vars 
│   │   │   ├── foo.yml -> ../../shared/foo.yml 
│   │   │   └── test.yml -> ../../shared/test.yml 
│   │   └── inventory 
│   └── shared 
│    ├── bar.yml 
│    ├── dev.yml 
│    ├── foo.yml 
│    ├── prod.yml 
│    └── test.yml 
└── roles 
    └── nginx 
     ├── defaults 
     │   └── main.yml 
     ├── meta 
     │   └── main.yml 
     ├── tasks 
     │   └── main.yml 
     └── templates 
      └── main.yml 

現在我們的庫存文件可以讓主機使用這些共享組瓦爾簡單地通過將主機中正確的組。

+1

很高興看到,我不是唯一有這個問題的人。 – ceving

+0

順便說一句:我必須使用Fossil SCM,Fossil的默認是遵循符號鏈接。這樣做是爲了通過生成Unix問題來避免Windows問題。化石傢伙可能認爲Unix問題比Windows問題更容易解決。所以我不確定符號鏈接是否適合我。 – ceving

相關問題