重新加载Ansible的dynamic库存
我正在使用Ansible来设置EC2实例并部署一个应用程序。 有一个主机脚本收集标签相关的服务器和组信息。 我想把这些行动作为一个单一的剧本,所以
- 如果需要,将创build新的实例
- 主机脚本加载库存(包括服务器的事实)
- 部署剧本的作品
但是,如果在播放过程中创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目前不支持这一点。 如果您查看ansible或ansible-playbook命令的源代码,您将看到清单首先被加载,然后清单对象被传递到运行指定任务或剧本的可靠命令。 移动库存处理,使其发生在任务/剧本处理程序内可能是一个非常重要的承诺,原因有很多。 
当做这样的事情时,最好的办法是简单地将你的剧本分成两部分,然后把它们的调用包装在一个只需调用一次的shell脚本中。
看看add_host 。
它确实添加了一个主机(或者一个组)到内存库存中