2017-08-28 154 views
0

我正嘗試使用基於{{ ansible_hostname }}的第四個字符的包含變量的模板創建配置文件。Ansible條件模板變量替換

什麼工作:

劇本:

--- 
- hosts: spock 
    roles: 
    - templaterole 

作用:

--- 
- name: testing autofs template on spock 
    template: 
    src=autofs 
    dest=/tmp/autofs 
    with_items: 
    - "{{ var_a }}" 
    when: ('{{ ansible_hostname }}' == "spock") 

瓦爾/ main.yml:

var_a: 
    - 
    var_1: 'this is var_a1' 
    var_2: 'this is var_a2' 
var_b: 
    - 
    var_1: 'this is var_b1' 
    var_2: 'this is var_b2' 

模板:

{{ item.var_1 }} 
# 
{{ item.var_2 }} 
# 

可正常工作和輸出產生的/ tmp/autofs文件的斯波克主機看起來像:

this is var_a1 
# 
this is var_a2 
# 

現在,如果我嘗試根據嘗試拉出{{ ansible_hostname }}的第4個字符來寫入該文件,該播放不會在條件上獲得匹配,也不會寫入該文件。我想這個條件在我的角色:

--- 
- name: testing autofs template on spock 
    template: 
    src=autofs 
    dest=/tmp/autofs 
    with_items: 
    - "{{ var_a }}" 
    when: ('{{ ansible_hostname }} | cut -c4' == "c") or 
     ('{{ ansible_hostname }} | cut -c4' == "k") 

播放跳過由於對條件不匹配這個任務。最終,我希望能夠拉我們主機名的任何第四個字符,因爲這將始終是可預測的(只能是4個已知字符中的一個,它定義了我的環境並允許我根據這些差異生產環境定義正確的模板變量。)

任何人都可以幫助我重新定義我的when語句,這樣我可以做或條件和拉出字符的定義ansible_hostname變量?

+0

當您使用管道將其發送的第一個命令的結果....但這是一個變量而不是命令的名稱。所以最有可能的是使用未找到的命令。也許如果你剛剛在第四個位置得到了char {[ansible_hostname [3]}} ==「c」的字符,它將起作用 – surfer190

+0

我不相信你第一個條件工作正常。它總會被評估爲假。請閱讀'when'指令的文檔。 – techraf

回答

0

不要在when聲明中使用大括號,它已經是Jinja2聲明。
而在Jinja2語句中,您使用|來應用過濾器,但沒有cut過濾器可用。

你的說法應該是簡單的:

when: ansible_hostname[3] in 'ck' 
+0

非常感謝你們。很棒。 – deevee8