2016-05-23 72 views
2

我有幾個ansible劇本,有時在本地環境中有意義,否則它們是遠程執行的。爲了做到這一點我用delegate_to指令,但是這也意味着我不得不把所有的任務,例如:Ansible有條件delegate_to本地或遠程?

--- 
- hosts: all 
    gather_facts: no 

    tasks: 

    - name: Local command 
    command: hostname 
    register: target_host 
    when: vhost is undefined 
    delegate_to: 127.0.0.1 

# ---  

    - name: Remote command 
    command: hostname 
    register: target_host 
    when: vhost is defined 

Exec的本地翻番:

$ ansible-playbook -i inv.d/test.ini play.d/delegate.yml 

PLAY [all] ******************************************************************** 

TASK: [Local command] ********************************************************* 
changed: [new-server -> 127.0.0.1] 

TASK: [Remote command] ******************************************************** 
skipping: [new-server] 

PLAY RECAP ******************************************************************** 
new-server     : ok=1 changed=1 unreachable=0 failed=0 

Exec的遙控器

$ ansible-playbook -i inv.d/test.ini play.d/delegate.yml -e vhost=y 

PLAY [all] ******************************************************************** 

TASK: [Local command] ********************************************************* 
skipping: [new-server] 

TASK: [Remote command] ******************************************************** 
changed: [new-server] 

PLAY RECAP ******************************************************************** 
new-server     : ok=1 changed=1 unreachable=0 failed=0 

有沒有更智能的方法來告訴ansible何時回退到當地環境?目前我正在使用ansible==1.9.2

回答

6

不應在任務中定義任務應執行的位置。如果任務總是必須在本地或在相關機器(例如數據庫主機或路由器)上運行,而劇本本身以及大多數任務運行在劇本級別上定義的主機,則委派是有意義的。

但是,如果您的目標是在本地或在一組遠程主機上運行整個手冊,則應該使用不同的庫存文件或組。

如果你有兩個不同的清單文件,在一個定義本地主機,在其他所有的遠程主機,然後應用調用ansible,-i inv.d/local-i inv.d/remote當你想要的清單。

或者將它全部放入一個清單並動態傳遞組。在清單中定義兩個組:

[local] 
127.0.0.1 

[remote] 
host-1 
host-2 
host-N 

,然後再通過組作爲一個額外的VAR到ansible:-e "run=local"-e "run=remote"

在你的劇本設置了hosts動態:

--- 
- hosts: "{{ run | mandatory }}" 
    gather_facts: no 
    tasks: 
    ... 

在您的示例中,您似乎只能使用根據vhost extra-var定義的單個遠程主機。在這種情況下,最好的選擇似乎是在主機部分重新使用這個變量,默認爲localhost。

--- 
- hosts: "{{ vhost | default('127.0.0.1') }}" 
    gather_facts: no 
    tasks: 
    ... 

所以,如果vhost定義整個劇本將在該主機上執行。如果沒有定義,劇本在本地運行。

最後,你還可以使用單任務的delegate_to選項,如下所示:

- name: Local AND remote command 
    command: hostname 
    delegate_to: "{{ '127.0.0.1' if vhost is undefined else omit }}" 

omit is a special variable使Ansible忽略的選擇,因爲如果它不會被定義。

+0

會起作用:'connection:「{{'ansible_host'| default('local')}}」'? [Docs](http://docs.ansible.com/ansible/intro_inventory.html#non-ssh-connection-types)似乎不明確,'ansible_host'被定義爲'要連接到的Docker容器的名稱'。我願意這只是文檔中的錯誤。 –

+0

我會在清單文件中設置連接,如本節底部所述:http://docs.ansible.com/ansible/intro_inventory.html#hosts-and-groups – udondan

+0

'localhost ansible_connection = local' – udondan