我正在尝试设置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
列表之前不会解析库存,这很糟糕。还有另一种方法可以实现这个目标吗?
答案 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还包含截至第一个句点的部分,而不包含该域的其余部分。