2015-07-20 75 views
1

我正在編寫一個Ansible角色以將Docker容器部署到主機。我的庫存文件包含CoreOS和Ubuntu服務器,並且Docker已經安裝在Ubuntu上,不允許非root用戶使用(也就是我需要sudo docker ...)。 CoreOS主機不需要它。Ansible sudo模式取決於變量

我想寫一個任務,如果需要,只使用sudo

- name: Start container XX 
    sudo: "{{ ansible_os_family and ansible_os_family == 'Debian' }}" 
    docker: 
    ... 

使用debug模塊,我可以看到這個表達式返回「真」。

直接使用sudo: "True"工作正常。

但是使用給定的片段不起作用,sudo模式未啓用。

如何有條件地使用sudo來實現我的目標?

+0

您是否嘗試過使用'ansible_sudo'變量?檢查谷歌,有關於這個錯誤報告,但它可能工作。 – magnetik

回答

0

我不熟悉docker模塊itselve,但我看到了一個解決方案。您需要使用條件when以及任務中的附加參數:

- hosts: all 
    tasks: 
    - name: Debug message 
    debug: msg="{{ ansible_os_family and ansible_os_family == 'Debian' }}" 

    - name: Rooted 
    shell: service docker restart 
    sudo: True 
    when: "{{ ansible_os_family and ansible_os_family == 'Debian' }}|default(false)|bool" 

    - name: Not root 
    shell: service docker restart 
    # This will fail when sudo is needed. 
    # When you remove 'not' in condition you will see that 
    when: "not {{ ansible_os_family and ansible_os_family == 'Debian' }}|default(false)|bool" 
+0

我不喜歡複製代碼,尤其是對於已經大約10行(許多docker參數)的任務,並且存在兩個稍微不同的版本(用於容器的兩種配置)。 Double'when' - > 4倍基本代碼 - > meh:/ 但是,感謝解決方法! :) –