如何根据提供的变量在不同的主机或主机集上运行ansible剧本?

时间:2019-02-05 18:10:19

标签: ansible

我需要在多个主机上设置环境。我需要从文件中读取变量,并且希望它们在特定主机或一组主机上执行。我无法确定如何使用单个任务来实现这一目标?

假设我有一个文件,其中包含以下格式的变量:

container_name: java1
container_hostname: java-mc1
script_location: /tmp
execute_on_hosts: host1,host2,host3

container_name: java2
container_hostname: java-mc2
script_location: /tmp
execute_on_hosts: host1

我希望我的任务从此文件中读取并仅通过匹配主机部分中的主机名(在剧本中提供)在指定的主机上执行任务。

1 个答案:

答案 0 :(得分:0)

您应该阅读Ansible Variables文档。虽然您可能可以使某些工作正常进行,但是您并没有真正按照预期的方式使用Ansible。

Ansible从根本上围绕“游戏”的概念而建立。每个游戏代表一个或多个任务,应针对一个主机或一组主机。然后将这些剧本打包成“剧本”。 Ansible提供了在“广告资源”中组织变量的方法。一种常见的方法是执行以下操作:

/ some / ansible / dir / hosts

[mc1_hosts]
host1
host2
host3

[mc2_hosts]
host1

/ some / ansible / dir / group_vars / mc1_hosts

---
mc1_container_data:
  container_name: java1
  container_hostname: java-mc1
  script_location: /tmp

/ some / ansible / dir / group_vars / mc2_hosts

---
mc2_container_data:
  container_name: java2
  container_hostname: java-mc2
  script_location: /tmp

/some/ansible/dir/playbook.yml

---

- hosts: mc1_hosts
  tasks:
    - name: Display variables
      debug:
        msg: "{{ mc1_container_data }}"
    - name: Display container_name
        msg: "{{ mc1_container_data.container_name }}"


- hosts: mc2_hosts
  tasks:
    - name: Display variables
      debug:
        msg: "{{ mc2_container_data }}"
    - name: Display container_name
        msg: "{{ mc2_container_data.container_name }}"

最后ansible-playbook playbook.yml运行这些任务。