据我了解,每个剧本都有一个主机条目。我想知道,如果我创建一个包含其他剧本的容器剧本,我是否可以为每个剧本包含的主机参数化。所以类似
---
- 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
指令“共享”您的变量,请看这个: