重新加载Ansible的动态库存

Vla*_*nev 46 ansible ansible-inventory

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

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

但是,如果在播放期间创建/更新了服务器,则提前加载库存,因此没有服务器/组数据.我可以1)单独提供和部署剧本2)使用add_host技巧在服务器更新时模拟动态库存,但这些方法存在缺陷.

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

#!/bin/sh
echo `date` >> log.log
echo "{\"standalone\":[\"localhost\"]}"
Run Code Online (Sandbox Code Playgroud)

样品playbook.yml:

---
- hosts: all
  tasks:
    - name: show inventory_hostname
      command: echo {{ inventory_hostname }}
Run Code Online (Sandbox Code Playgroud)

我运行它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
Run Code Online (Sandbox Code Playgroud)

但是我还没有找到加倍它的命令.

小智 46

使用Ansible 2.0+,您可以通过运行任务在游戏中刷新库存:

- meta: refresh_inventory
Run Code Online (Sandbox Code Playgroud)

  • 对于其他任何人,我想我找到了我的问题.Meta:刷新库存不像使用强制缓存刷新的`./ec2.py --refresh-cache`.我发现我必须降低(或更具体地说,完全禁用)库存缓存.您可以通过在ec2.ini中设置`cache_max_age = 0`来完成此操作. (5认同)
  • 这真的很有帮助。我最终将其作为“ post_task”添加到我的剧本中,然后继续其他剧本。超级有用。没有太多的文档,但是如果您查看github仓库中的ansible,您会在那看到它。实现此目的的另一种方法是使用`--refresh-cache`运行ec2.py文件。 (2认同)
  • refresh_inventory真的有效吗?我在我的剧本中使用它并且没有停顿表明它正在刷新库存,更重要的是,它没有发现自初始库存收集以来创建的ec2实例.我已经测试了给它更多的时间手动暂停,这是一个实例仍然初始化的问题,但......似乎没有帮助. (2认同)

dsz*_*dsz 20

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

- name: refresh inventory
  hosts: localhost
  connection: local
  gather_facts: False
  tasks:
    - name: Refresh EC2 cache
      command: /etc/ansible/ec2.py --refresh-cache
    - name: Refresh in-memory EC2 cache
      meta: refresh_inventory

  • 为了使ec2.py位置更加灵活(例如,当使用多个库存时),您可以使用`{{inventory_dir}}/ec2.py --refresh-cache` (2认同)

Bru*_*e P 6

Ansible目前不支持此功能.如果查看ansibleansible-playbook命令的源代码,您将看到首先加载清单,然后将清单对象传递给运行指定任务或手册的ansible命令.由于多种原因,移动库存处理以使其在任务/剧本处理程序中发生可能是一项非常重要的任务.

做这样的事情最好的办法就是简单地将你的剧本分成两部分,并将你的调用包装在你只需要调用一次的shell脚本中.