Ansible:根据库存变量包含playbook

时间:2017-07-25 20:42:10

标签: ansible

我正在尝试设置Ansible,以便能够根据主机所在的库存组运行一本剧本。例如,在库存中,我们有:

[group1]
host1.sub.domain.tld ansible_host=10.0.0.2
...
[group1:vars]
whatsmyplaybook=build-server.yml

然后我们想制作一个简单的剧本,或多或少地重定向到库存中的剧本:

---
- name: Load Playbook from inventory
  include: "{{hostvars[server].whatsmyplaybook}}"

" server"变量将是从命令行传入的主机的FQDN:

ansible-playbook whatsmyplaybook.yml -e "server=host1.sub.domain.tld"

我们的理由是从全新安装(PXE启动)获得服务器引导程序,它只会真正知道它的FQDN,然后将一个firstboot脚本SSH连接到我们的Ansible主机并启动上述命令。但是,当我们这样做时,我们得到以下错误:

ERROR! 'hostvars' is undefined

这表明在提供host列表之前不会解析库存,这很糟糕。还有另一种方法可以实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

老实说,有点奇怪的工作流程。

您的设置无效,因为在Playbook解析时没有定义大多数变量。

您可能更幸运地为不同的组定义具有不同播放的单个剧本(不需要设置组var,只需使用正确的主机模式(在我的示例中为组名))并执行限制到特定主机:

site.yml:

---
- hosts: group1
  tasks:
    - include: build-web-server-tasks.yml

- hosts: group2
  tasks:
    - include: build-db-server-tasks2.yml

配置特定服务器的命令:

ansible-playbook -l host1.sub.domain.tld site.yml

答案 1 :(得分:0)

您可以开发自己的动态库存文件,以便所有需要引导的机器将自动添加到您的库存和组中,而无需手动输入库存文件。

要开发动态广告资源,您可以点击以下链接:

http://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html

您可以包含针对不同群组的多个剧本,如下所示。

---
- hosts: all
  tasks:
    - include: build-web-server-tasks.yml
      where: inventory_hostname in groups['group1']
    - include: build-db-server-tasks2.yml
      where: inventory_hostname in groups['group2']

inventory_hostname是Ansible的库存主机文件中配置的主机名的名称。当您不想依赖于发现的主机名ansible_hostname或出于其他神秘原因时,这可能很有用。如果您有一个很长的FQDN,则inventory_hostname_short还包含截至第一个句点的部分,而不包含该域的其余部分。