2016-01-10 50 views
1

是否有可能取代主機:目標與變量?Ansible模板中的主機可以使用變量嗎?

- name: ansible application deploy 
    hosts: {{ vm_ip }} 
    vars: 
    project_path: "{{ host_project_path|default('/var/www/html') }}" 

我試圖通過vm_ip在命令行中使用--extra-vars="vm_ip: IPP_ADDR ",但它從來沒有工作過。

+0

我不能想象一個必要。你能解釋爲什麼你需要這個嗎?有很多方法可以在主機上不使用變量的情況下執行此操作。 –

+0

我正在開發rails應用程序,它會執行可執行的腳本來自動執行後端中的幾件事情,並且腳本需要根據任務對不同的虛擬機運行,您能想出有關如何替換hosts值的任何想法嗎?我正在考慮首先運行sed或awk,然後運行腳本,但使用變量將會更清潔 – Deano

+0

爲什麼不設置hosts:all或設置爲包含該應用程序的所有虛擬機的組,並且只需使用-l執行操作手冊vm_ip –

回答

2

我寧願只設置hosts:all,並且只對需要執行的主機執行帶有limit的操作手冊。

- name: ansible application deploy 
    hosts: all 
    vars: 
    project_path: "{{ host_project_path|default('/var/www/html') }}" 

使用limit條款執行劇本:

ansible-playbook app_deploy.yml -l IPP_ADDR

另一個possibilite創造與IP地址的文件。

/tmp/execute_only_that_host

文件內容:

IPP_ADDR

執行:ansible-playbook app_deploy.yml -l @/tmp/execute_only_that_host

我推薦這種方法,因爲這是你自己的應用程序,將打電話給你的劇本,你總是可以保證其與limit呼籲,因此你不需要打擾與hosts在你的劇本的頂部。

0

你可以從命令行傳遞它,是的。

請確保您有有效的YAML:

hosts: "{{ vm_ip }}" 

這表達必須引用或你碰到yaml gotcha

但主機必須首先在庫存中定義,我想這是你失蹤的一塊。這幾乎沒有意義,因爲按照@Bernardo Vale的說法,hosts: all--limit沒有什麼優勢,但是這是更爲合理的標準。

1

我不會使用limit,如果您忘記錯誤地指定,那麼它會在所有危險的主機上運行。你的命令行是錯誤的。嘗試:

--extra-vars "vm_ip=IP_ADDR" 

hosts: "{{ vm_ip }}" 
相關問題