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

我可以在Ansible模板中为主机使用变量吗?,ansible,ansible-playbook,Ansible,Ansible Playbook,是否可以用变量替换hosts:target - name: ansible application deploy hosts: {{ vm_ip }} vars: project_path: "{{ host_project_path|default('/var/www/html') }}" 我曾尝试在命令行上使用--extra vars=“vm\u ip:IPP\u ADDR”传递vm\u ip,但从未成功过。我宁愿只设置hosts:all并使用limit仅对需要执行的主机执

是否可以用变量替换hosts:target

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

我曾尝试在命令行上使用
--extra vars=“vm\u ip:IPP\u ADDR”
传递vm\u ip,但从未成功过。

我宁愿只设置
hosts:all
并使用
limit
仅对需要执行的主机执行剧本

- name: ansible application deploy
  hosts: all
  vars:
    project_path: "{{ host_project_path|default('/var/www/html') }}"
使用
limit
子句执行剧本:

ansible playbook应用程序\u deploy.yml-l IPP\u ADDR

另一种可能是创建一个具有ip地址的文件

/tmp/仅执行该主机

文件内容:

IPP\u地址

正在执行:
ansible playbook app_deploy.yml-l@/tmp/execute_only_该主机


我推荐这种方法,因为调用playbook的是您自己的应用程序,您可以始终确保使用
limit
来调用它,因此您不需要在playbook顶部设置
主机。

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

确保您拥有有效的yaml:

hosts: "{{ vm_ip }}"
必须引用该表达式,否则会遇到错误


但是主机必须首先在清单中定义,我想这就是您缺少的部分。这几乎使它变得毫无意义,因为使用带有@Bernardo Vale所描述的限制的
-limit
主机:all
没有任何优势,但这是更容易理解的标准。

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

--extra-vars "vm_ip=IP_ADDR"


我想象不出有必要那样做。你能解释一下你为什么需要这个吗?有很多方法可以做到这一点,而不必在主机上使用变量。我正在开发rails应用程序,该应用程序将执行ansible脚本,以便在后端自动化一些事情,并且脚本需要根据任务针对不同的VM运行,您能想到我将如何替换主机值吗?我想先运行sed或awk,然后运行脚本,但是使用变量会更干净为什么不设置hosts:all,或者设置为包含该应用程序的所有vm的组,只使用-l vm_ip执行playbook
hosts: "{{ vm_ip }}"