2016-04-29 47 views
2

是否可以創建一個Ansible庫存變量,該變量與庫存主機或組沒有關聯,但該Playbook運行的服務器層是否可用?我有一個Ansible角色,使用APT安裝libffi-dev軟件包,但我可能想要在每個服務器層上安裝該軟件包的不同版本。我爲此創建了一個變量「libffi-dev_ver」。我還擁有與我的每個層級相對應的庫存文件「開發」,「分段」和「生產」。如何設置Ansible特定於庫存的變量?

我的角色的主要任務,這是從我的主要site.yml劇本叫,檢查該版本變量存在運行中的作用之前:

# roles/misc_libs/tasks/main.yml 
- include: check_vars.yml tags=misc_libs 
- include: misc_libs.yml tags=misc_libs 

check_vars.yml檢查,以確保軟件包版本變量存在:

# roles/misc_libs_tasks/check_vars.yml 
- name: check that required role variables are set 
    fail: msg="{{ item }} is not defined" 
    when: not {{ item }} 
    with_items: 
    - libffi-dev_ver 

的misc_libs作用實際上使用的是可變的安裝包:

# roles/misc_libs/tasks/misc_libs.yml 
- name: install libffi-dev 
    apt: > 
    pkg=libffi-dev={{ libffi-dev_ver }} 
    update_cache=yes 
    cache_valid_time=3600 
    become: True 

我的開發清單文件看起來是這樣的:

# development 
[webservers] 
web01.example.com ansible_ssh_host=<ip_address> 

[dev:children] 
webservers 

[webservers:vars] 
libffi-dev_ver="3.1-2+b2" 

當我運行此命令:

ansible-playbook -i development site.yml -l webservers 

我得到這個Ansible錯誤:

fatal: [web01.example.com] => error while evaluating conditional: not libffi-dev_ver 

什麼是聲明的正確方法Ansible中的這樣的包版本變量?變量的值取決於服務器層,它向我表明它已進入清單文件,因爲清單文件是服務器層特定的。但是所有庫存變量似乎都必須與主機或組相關聯。我已經這樣做了,但角色仍然沒有看到變量。我可以將任務添加到檢測服務器層的角色中,並使用「when」條件相應地設置變量,但該解決方案看起來很難看,因爲如果要在角色中安裝多個包,則每個角色需要三個條件包版本變量。我瀏覽了Ansible文檔並閱讀了很多關於設置多層劇本的博文,但我沒有看到這種特殊的情況。什麼是正確的方式來聲明這樣的層特定變量?

+0

我沒有得到你想要完成的。爲什麼: #角色/ misc_libs /任務/ misc_libs.yml - 名稱:安裝libffi-dev的 貼切:> PKG = libffi-dev的= {{libffi-dev_ver}} update_cache = YES cache_valid_time = 3600 成爲:真 何時:libffi-dev_ver被定義爲 不夠? –

回答

3

問題是我聲明的變量'libffi-dev_ver'實際上是必須遵守Python 2.x命名規則的Jinja2 identifier。根據這些規則,' - '(破折號)是無效的字符。一旦我將它改爲'_'(下劃線),我就不會再犯這個錯誤了。

此外,check_vars.yml手冊實際上是不必要的。 Ansible配置變量error_on_undefined_vars會導致包含未定義變量的步驟失敗。由於默認情況下它是真的,所以我不需要運行check_vars.yml,因爲所有變量都已被檢查。

一個聲明服務器層特定變量的位置似乎在group_vars目錄中的文件中,該文件與清單文件中以該層命名的組名稱相同。所以在我的情況下,我的'開發'庫存文件包含一個'dev'子組。該組包含我想要安裝libffi-dev軟件包的Web服務器。因此,我創建了一個文件'group_vars/dev',並在該文件中聲明瞭一個名爲'libffi_dev_ver'的變量,我可以在我的misc_libs.yml手冊中引用該變量。

0

我沒有得到你正在嘗試完成的。爲什麼是:

# roles/misc_libs/tasks/misc_libs.yml 
- name: install libffi-dev 
    apt: > 
    pkg=libffi-dev={{ libffi-dev_ver }} 
    update_cache=yes 
    cache_valid_time=3600 
    become: True 
    when: libffi-dev_ver is defined 

不夠?

+0

我可以做到這一點,但這與我的問題無關。即使我按照你的建議去做,也沒有找到。我有額外的check_vars.yml,在我使用with_items指令安裝了一些軟件包的情況下,我在我的代碼中的其他地方安裝了這些指令。這樣更乾淨。 – William

+0

好吧,如果它有效的話; - )事實上,你的check_vars loks的語法對我來說,我希望你需要一個'eval'的道德等價物來做到這一點 - 無論jinja2是否已經得到它,我不知道。 –