如何在一个 ansible 脚本中为不同的剧本指定不同的主机

如何在一个 ansible 脚本中为不同的剧本指定不同的主机

据我了解,每个剧本都有一个主机条目。我想知道,如果我创建一个包含其他剧本的容器剧本,我是否可以为每个剧本包含的主机参数化。所以类似

---
- include playbook_1.yml
    hosts: tag_postgres
- include: playbook_2.yml
    hosts: tag_rabbitmq

我能够将所有不同的剧本放在一个脚本中并调用,但这样我就无法将一个剧本中的一些 set_fact 重用到另一个剧本中,因此存在大量的任务重复。

这个问题的另一个推论是,我可以在亚马逊上启动 EC2 吗?

hosts: localhost

以及已启动的 ec2s 的配置,它基本上会从中配置清单-i ec2.py,并将主机指定为

hosts: tag_<some_tag>

是通过同一个剧本还是一组包含的剧本(不同的角色)发生?

答案1

实际上,每个剧本可以有多个 hosts: 部分。看起来 hosts: 启动了一个新剧本。请参阅http://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/, 例如。

类似这样的方法对我有用(ansible 2.2):

---
- hosts: localhost 
  connection: local
  roles:
    - { role: ec2,
        tag: 'master',
        instance_type: t2.2xlarge,
        count: 1
      }
  tasks:
  - shell: hostname # reports localhost

- hosts: tag_master
  tasks:
  - shell: hostname # reports instance(s) with tag 'master'

因此,将 hosts: 放在每个包含的 .yml 的顶部,而不是在 include: 之后。

答案2

http://docs.ansible.com/ansible/playbooks_variables.html#information-discovered-from-systems-facts

... 变量可以来自其他地方,但这些是被发现的变量类型,而不是由用户设置的变量。

事实是通过与远程系统对话而获得的信息......

事实来自您的远程主机。这就是为什么您通常可以共享事实在您的不同主机之间*.yml文件有几个剧本

现在,如果您在剧本的另一部分执行类似这样的操作,您就可以访问来自其他主机的事实:

{{ hostvars['server01.example.com']['ansible_eth0']['ipv4']['address'] }}
...
...
{{ hostvars[groups['servers'][0]]['ansible_eth0']['ipv4']['address'] }}

但在这种情况下,你需要记住,你需要了解事实你使用它。然后,你可以在剧本中设置第一部分,获取所有主机的所有事实,或为此使用事实缓存(参见:http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching

现在,如果您想在剧本中分享选项,也许最好重新考虑放入变量中的信息,这样,您就可以使用相同的include指令“共享”您的变量,请看这个:

http://docs.ansible.com/ansible/playbooks_variables.html#variables-defined-from-included-files-and-roles

相关内容