2017-06-20 41 views
0

以下任務正在運行,無論我設置爲ansible_distribution。ansible忽略條件不包裹在jinja2格式

- name: install packages 
    yum: name={{item.name}} state=installed 
    when: item.when 
    with_items: 
    - { name: 'telnet', when: "ansible_distribution == 'CentOS'" } 
    - { name: 'net-tools', when: "ansible_distribution == 'Debian'" } 
    - { name: 'net-tools', when: "ansible_distribution == 'blahblahblah'" } 

結果

TASK [Gathering Facts] *************************************************************************************************************************************************************************************** 
ok: [172.16.2.3] 

TASK [test : install packages] ********************************************************************************************************************************************************************************* 
ok: [172.16.2.3] => (item={u'when': u"ansible_distribution == 'CentOS'", u'name': u'telnet'}) 
ok: [172.16.2.3] => (item={u'when': u"ansible_distribution == 'Debian'", u'name': u'net-tools'}) 
ok: [172.16.2.3] => (item={u'when': u"ansible_distribution == 'blahblahblah'", u'name': u'httpd'}) 

這裏是我的ansible版本

ansible 2.3.0.0 
config file = /etc/ansible/ansible.cfg 
configured module search path = Default w/o overrides 
python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.520150623 (Red Hat 4.8.5-11)] 

然而,當包裹的時候條件,像這樣"{{item.when}}" Jinja2的格式,我獲得以下儘管有警告。

TASK [test : install packages] ********************************************************************************************************************************************************************************* 
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{item.when}} 

skipping: [172.16.2.3] => (item={u'when': u"ansible_distribution == 'blahblahblah'", u'name': u'httpd'}) 
skipping: [172.16.2.3] => (item={u'when': u"ansible_distribution == 'Debian'", u'name': u'net-tools'}) 
ok: [172.16.2.3] => (item={u'when': u"ansible_distribution == 'CentOS'", u'name': u'telnet'}) 

任何想法如何我可以重寫這個任務,而不必包裝jinja2格式的when條件?

+0

它不會忽略,它會盡職地檢查條件表達式的值,並且它是一個非空字符串值,它的計算結果爲「true」。通常,這種體系結構之間的區別是通過包含不同的任務文件或變量文件來實現的。 – techraf

回答

1

你可以試試這個:

- name: install packages 
    package: 
    name: "{{ pkgs[ansible_distribution] | default(pkgs.default) }}" 
    state: present 
    vars: 
    pkgs: 
     CentOS: telnet 
     Debian: net-tools 
     default: net-tools 

我換成yum模塊package,使其發行的獨立,因爲yum肯定會在Debian失敗。

我@ techraf的評論認爲,如果你有很多是每個發行版不同的任務,可以考慮使用include/include_varswith_first_found包括特定發行設定的任務/變量(見example)的。