2017-01-19 112 views
1

使用{{和}}我有這個在我的劇本:在ansible shell命令

- name: Get facts about containers 
    shell: "docker ps -f name=jenkins --format {%raw%}{{.Names}}{% endraw %}" 
    register: container 

注意,我插入{%raw%}{%endraw%}使ansible不evaulate的 '{{'。

如果我跑,我得到這個錯誤:

fatal: [localhost]: FAILED! => {"failed": true, "msg": "{u'cmd': u'docker ps -f name=jenkins --format {{.Names}}', u'end': u'2017-01-19 10:04:27.491648', u'stdout': u'ecs-sde-abn-17-jenkins-ec8eccee8c9eb8e38f01', u'changed': True, u'start': u'2017-01-19 10:04:27.481090', u'delta': u'0:00:00.010558', u'stderr': u'', u'rc': 0, 'stdout_lines': [u'ecs-task-17-jenkins-ec8eccee8c9eb8e38f01'], u'warnings': []}: template error while templating string: unexpected '.'. String: docker ps -f name=jenkins --format {{.Names}}"}

換句話說,命令運行成功地(輸出ECS-任務17詹金斯 - ec8eccee8c9eb8e38f01是正確的),但比它會嘗試模板字符串...再次?

這裏怎麼回事,我該如何解決這個問題?

EDITED

逃離{{這樣的:

shell: "docker ps -f name=jenkins --format {{ '{' }}{.Names}{{ '}' }}" 

導致同樣的錯誤。

+1

的可能的複製[獲取與ansible泊塢窗的IP地址(HTTP:// stackoverflow.com/questions/41721353/get-ip-address-of-docker-with-ansible) –

回答

1

這是Ansible 2.2.1中引入的一個問題:https://github.com/ansible/ansible/issues/20400。 在內部註冊變量{{時發生。

This解決辦法防止{{出現在註冊變量:

shell: "docker inspect --format '{''{ .NetworkSettings.IPAddress }''}' consul" 

的方式重現錯誤:

- hosts: localhost 
    gather_facts: no 
    tasks: 
    - shell: "echo '{''{.Names}''}'" 
     register: myvar  
    - debug: var=myvar 
+0

@techraf在答案中增加了代碼示例。在你觸摸'myvar'之前,一切正常(註釋掉'debug'),當你嘗試使用'myvar'時,它會失敗。 –

+1

@techraf是的,因爲它迴應了'{{.Names}}'在結果的stdout鍵中彈出(將echo重定向到文件,一切都會好起來)。對於OP任務,我的解決方法是有效的,因爲沒有使用雙大括號的輸出,並且'cmd'鍵有這個技巧來防止已註冊變量中的雙大括號。 –