2015-10-19 33 views
38

這是一個劇本的片段,我使用(server.yml):覆蓋承載Ansible劇本的可變從命令行

- name: Determine Remote User 
    hosts: web 
    gather_facts: false 
    roles: 
    - { role: remote-user, tags: [remote-user, always] } 

我的主機文件具有服務器,例如不同組

[web] 
x.x.x.x 

[droplets] 
x.x.x.x 

現在我想執行ansible-playbook -i hosts/<env> server.yml,並覆蓋從server.ymlhosts: web來運行這個劇本的[droplets]

我可以直接重寫爲一次性的東西嗎?不需要直接編輯0​​?

謝謝。

回答

50

我不認爲Ansible提供了這種功能,它應該。這裏的東西,你可以做:

hosts: "{{ variable_host | default('web') }}"

,你可以從命令行或從瓦爾文件,通過variable_host如:

ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)" 
+2

需要進行小修改。它應該是'主機:「{{variable_host |默認('網絡')}}」' – SPM

+0

哦,是的,我的壞。感謝您指出:) – wallydrag

+10

這裏是一個筆記,我覺得將完成尋找這個解決方案的安全新手的答案: 例如:'ansible-playbook server.yml --extra-vars「variable_host = newtarget(s)」' – Frobbit

2

如果要運行與主機關聯但位於不同主機上的任務,則應嘗試delegate_to

在你的情況,你應該委託給本地主機(ansible主),並調用ansible-playbook命令

25

對於任何人誰可能來尋找解決方案。
Play圖書

- hosts: '{{ host }}' 
    tasks: 
    - debug: msg="Host is {{ ansible_fqdn }}" 

庫存

[web] 
x.x.x.x 

[droplets] 
x.x.x.x 

命令:ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets" 所以,你可以在指定的組名額外瓦爾

+0

供參考,這應該是正確的答案。 – OzNetNerd

4

這是一個有點晚,但我認爲你可以使用--limit or -l命令將模式限制爲更具體的主機。 (2.3.2.0版本)

你可以有 - hosts: all (or group) tasks: - some_task

然後ansible-playbook playbook.yml -l some_more_strict_host_or_pattern 並使用--list-hosts標誌上看到哪些主機這個配置將被應用。

+2

我對ansible很新穎,但我認爲這是一個非常有效的解決方案,比其他方案更加緊湊。爲什麼它低調? –

+1

這很危險。如果忘記「限制」受影響主機的列表,可能會造成很大的損害。 –

+0

我發現使用'--extra-vars「variable_host = newtarget(s)」'就像接受的解決方案一樣危險並且是一個更復雜的解決方案。它使用'web'的默認主機,它可以在這裏應用,而不是'all'。您可以使用嚴格的主機組作爲默認組,以避免出錯,並使用'--list-hosts'標誌清楚地瞭解您正在影響哪些主機。 –