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

Pan*_*Lal 10 ansible

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

---
- include playbook_1.yml
    hosts: tag_postgres
- include: playbook_2.yml
    hosts: tag_rabbitmq
Run Code Online (Sandbox Code Playgroud)

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

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

hosts: localhost
Run Code Online (Sandbox Code Playgroud)

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

hosts: tag_<some_tag>
Run Code Online (Sandbox Code Playgroud)

通过相同的剧本或一组包含的剧本(不同的角色)发生?

小智 6

实际上,您可以拥有多个主机:每个剧本的部分。看来,一个主持人:开始新的戏剧。例如,参见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'
Run Code Online (Sandbox Code Playgroud)

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


Yon*_*lis 4

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

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

事实是从与远程系统对话中获得的信息......

事实来自您的远程主机。因此,这就是为什么当您的*.yml文件有多个playbook时,通常您可以在不同主机之间共享事实的原因。

现在,如果您在剧本的另一部分中执行以下操作,则可以从其他主机访问事实:

{{ hostvars['server01.example.com']['ansible_eth0']['ipv4']['address'] }}
...
...
{{ hostvars[groups['servers'][0]]['ansible_eth0']['ipv4']['address'] }}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,您需要记住,在使用它之前您需要了解事实。然后,您可以在剧本中设置第一部分,获取所有主机的所有事实或为此使用事实缓存(请参阅: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认同)