重新加载Ansible的动态广告资源

时间:2015-03-12 06:45:23

标签: ansible ansible-inventory

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

  1. 根据需要创建新实例
  2. 主机脚本加载广告资源(包括服务器'事实)
  3. 部署游戏手册
  4. 但是,库存预先加载,因此如果在播放期间创建/更新服务器,则没有服务器/组数据。我可以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并看到两个运行:

    $> cat log.log
    Thu Mar 12 09:43:16 SAMT 2015
    Thu Mar 12 09:43:16 SAMT 2015
    
    但是我还没有找到加倍它的命令。

7 个答案:

答案 0 :(得分:44)

使用Ansible 2.0+,您可以通过运行task来在游戏中刷新您的广告资源:

- meta: refresh_inventory

答案 1 :(得分:18)

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:1)

您还可以编辑ec2.ini文件并设置选项:

cache_max_age = 0

通过确保首先不缓存任何内容来避免需要重新加载。

答案 4 :(得分:0)

我遇到了类似的情况,meta 没有帮助,但 setup 有帮助。所以,这适用于所有可能觉得这很有用的人......为了提供一点上下文,我正在做的是将 linux 内核内存限制为一定数量的真实内存,然后更新一些基于文件的文件新价值观。

例如,ansible 任务类似于:

- name: Print real memory
  debug:
    msg: {{ ansible_memory_mb.real.total }}

- name: Reset GRUB_CMDLINE_LINUX
  lineinfile:
    path: /etc/default/grub
    regexp: '^{{ item.key }}='
    line: '{{ item.key }}="{{ item.value }}"'
  with_items:
    - { key: 'GRUB_CMDLINE_LINUX', 
        value: '{{ ansible_memory_mb.real.total - reserved }}m'}

- name: Update GRUB
  command: update-grub

- name: Reboot the node to load the system's real memory settings
  reboot:

- name: Print real memory
  debug:
    msg: {{ ansible_memory_mb.real.total }}

并且两个调试日志的输出相同,因为 ansible_memory_mb 变量在 linux 内核配置更改后没有重新加载。

解决方案?重新启动系统后向 setup 添加任务。

- name: Refresh ansible facts (ansible_memory_mb) after updating grub
  setup:

答案 5 :(得分:0)

请注意,meta: refresh_inventory 在 Ansible Tower (AWX) 中不起作用。

https://docs.ansible.com/ansible-tower/3.3.1/html/userguide/best_practices.html

<块引用>

剧本不应使用 meta: refresh_inventory Ansible 功能,因为它与 Tower 处理库存的方式不兼容,如果剧本确实刷新了库存,它将刷新回作业开始的库存的开始。而是使用具有单独库存刷新步骤的工作流。

我还没有足够的代表发表评论,否则我会。

答案 6 :(得分:-2)

看看add_host

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