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


9

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

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

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

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

hosts: localhost

并配置已启动的ec2,这将基本上从配置清单-i ec2.py,并将主机指定为

hosts: tag_<some_tag>

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


您是否知道hosts:您的Yaml中可以包含多个部分,并且从本质上讲,您的清单中有几本使用不同主机组的剧本?
Yonsy Solis

Answers:


4

实际上,每个剧本可以包含多个主机:部分。似乎是主持人:开始一个新戏。例如,请参阅http://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/

像这样的东西对我有用(可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'

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


4

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


2
我的问题是针对主机的,而不是一般的变量。我的需求是能够创建一个没有主机的主剧本,但每个包含的剧本要么包含主机,要么可以作为参数提供给主机。我总是可以将它们作为单独的剧本来运行,但是在一本小说中获得的事实并不会传递到下一本小说,因此存在很多冗余
Pankaj Lal

请再次阅读以上内容:“现在,如果您在剧本的另一部分中执行类似的操作,则可以从其他主机访问事实:...但是在这种情况下,您需要记住,在使用之前需要获取事实。此”,是的,您可以在主剧本中包含的剧本之间共享您的事实。
Yonsy Solis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.