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

Can I use variable for hosts in Ansible template?

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

- 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,但从未成功。

我宁愿只设置 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

另一种可能性是使用 ip 地址创建一个文件。

/tmp/execute_only_that_host

文件内容:

IPP_ADDR

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

我推荐这种方法,因为调用你的剧本的是你自己的应用程序,你总是可以确保它是用 limit 调用的,因此你不需要在顶部打扰 hosts你的剧本。

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

确保你有有效的 yaml:

hosts: "{{ vm_ip }}"

那个表达式必须被引用或者你 运行 到 yaml gotcha.

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

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

--extra-vars "vm_ip=IP_ADDR"

hosts: "{{ vm_ip }}"