重新加载Ansible的dynamic库存

我正在使用Ansible来设置EC2实例并部署一个应用程序。 有一个主机脚本收集标签相关的服务器和组信息。 我想把这些行动作为一个单一的剧本,所以

  1. 如果需要,将创build新的实例
  2. 主机脚本加载库存(包括服务器的事实)
  3. 部署剧本的作品

但是,如果在播放过程中创build/更新服务器,则提前加载库存,以便不存在服务器/组数据。 我可以1)分开供应和部署剧本2)使用add_host技巧来模拟更新服务器时的dynamic库存,但是这些方法存在缺陷。

我可以强制Ansible重新加载库存吗? 我的testing文件是: hosts脚本:

 #!/bin/sh echo `date` >> log.log echo "{\"standalone\":[\"localhost\"]}" 

示例playbook.yml

 --- - hosts: all tasks: - name: show inventory_hostname command: echo {{ inventory_hostname }} 

我运行它ansible-playbook -i hosts playbook.yml -v并看到两个运行:

 $> cat log.log Thu Mar 12 09:43:16 SAMT 2015 Thu Mar 12 09:43:16 SAMT 2015 

但我还没有find一个命令加倍。

使用Ansible 2.0+,您可以通过运行任务来刷新您的广告资源:

 - meta: refresh_inventory 

我发现meta: refresh_inventory是不够的。
我不得不添加一个显式调用ec2.py --refresh-cache首先。

 - 名称:刷新清单
  主机:localhost
  连接:本地
   gather_facts:错误
  任务:
     - 名称:刷新EC2caching
      命令:/etc/ansible/ec2.py --refresh-cache
     - 名称:刷新内存中的EC2caching
       meta:refresh_inventory

Ansible目前不支持这一点。 如果您查看ansibleansible-playbook命令的源代码,您将看到清单首先被加载,然后清单对象被传递到运行指定任务或剧本的可靠命令。 移动库存处理,使其发生在任务/剧本处理程序内可能是一个非常重要的承诺,原因有很多。

当做这样的事情时,最好的办法是简单地将你的剧本分成两部分,然后把它们的调用包装在一个只需调用一次的shell脚本中。

看看add_host 。

它确实添加了一个主机(或者一个组)到内存库存中

Interesting Posts