2017-07-25 64 views
0

我试图建立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列表,它吸了很多。有没有另外一种方法来完成这个?

+0

你为什么试这个? Ansible戏剧有'主持人'声明,它决定了他们被应用到哪个组。您包含的任何游戏都必须具有此声明,并将在所有匹配的主机组上运行。 – techraf

+0

@techraf“'我们的推理是从一个全新的安装(PXE启动)中启动一个服务器引导程序,它只会真正知道它的FQDN”。我们已经有了可以填写'hosts'声明的剧本,但是当我们重建一台机器时,它们必须被修改或者运行的范围太大。我们的目标是消除对此的需求,并允许不知道其角色/剧本的主持人让Ansible与之竞争。 – MrDrMcCoy

回答

0

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

您的设置不起作用,因为大多数变量在剧本分析时间期间未定义。

你可能是有限定单个剧本针对不同群体不同戏剧更幸运(无需设置组变量,只是用在我的例子)正确的主机模式(组名),并执行其限制在特定的主机:

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 
+0

我们已经为每个主机组开发了工作剧本,但是他们要么针对整个组(不理想)运行,要么必须手动编辑和调用,以针对新装载的机器运行(这是我们试图消除需求的原因对于)。 – MrDrMcCoy

+0

我想这是'-l'开关背后的原因:限制主机模式而不修改剧本。否则我不明白这个问题,对不起。 –

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还包含直到第一个时间段的部分,而不包含域的其余部分。

+0

正如我在问题中指出的那样,清单已经与必需的主机一起完成。 – MrDrMcCoy