我可以在Ansible模板中为主机使用变量吗?

时间:2016-01-10 00:51:34

标签: ansible ansible-playbook

是否可以替换host:target with variable?

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

我尝试在命令行上使用--extra-vars="vm_ip: IPP_ADDR "传递vm_ip,但它从未起作用。

3 个答案:

答案 0 :(得分:2)

我宁愿只设置hosts:all并使用limit执行playbook,只执行您需要执行的主机。

- 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

另一个可能性是创建一个带有ip地址的文件。

/tmp/execute_only_that_host

文件内容:

IPP_ADDR

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

我建议使用这种方法,因为它是您自己的应用程序,可以调用您的剧本,您可以随时通过limit确保调用它,因此您不需要为{{1}打扰在你的剧本的顶部。

答案 1 :(得分:1)

我不会使用limit,如果您忘记错误地指定它,那么它将在所有危险的主机上运行。你的命令行是错误的。尝试:

--extra-vars "vm_ip=IP_ADDR"

hosts: "{{ vm_ip }}"

答案 2 :(得分:0)

您可以从命令行传递它,是的。

确保你有有效的yaml:

hosts: "{{ vm_ip }}"

必须引用该表达式,否则您会遇到yaml gotcha

但首先必须在清单中定义主机,我想这是你错过的部分。这几乎使它变得毫无意义,因为与@Bernardo Vale所描述的使用hosts: all--limit没有任何优势 - 但这是更加安全的标准。