2016-01-10 49 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 }}" 
相关问题