首页 文章

重新加载Ansible的动态库存

提问于
浏览
43

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

  • 如果需要,将创建新实例

  • 主机脚本加载库存(包括服务器的事实)

  • 部署剧本有效

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

我可以强制Ansible重新加载库存吗?我的测试文件是: 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 并看到 two 运行:

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

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

4 回答

  • -2

    使用Ansible 2.0,您可以通过运行task来在游戏中刷新您的库存:

    - meta: refresh_inventory
    
  • 17

    我发现 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
    
  • 7

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

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

  • 42

    看看add_host .

    它确实将主机(以及组)添加到ansible-playbook内存库存中

相关问题