49

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

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

但是,库存会提前加载,因此如果在游戏期间创建/更新服务器,则没有服务器/组数据。我可以 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

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

4

7 回答 7

50

使用 Ansible 2.0+,您可以通过运行以下任务来刷新您的库存:

- meta: refresh_inventory
于 2015-12-01T04:19:45.740 回答
21

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

- 名称:刷新库存
  主机:本地主机
  连接:本地
  收集事实:错误
  任务:
    - 名称:刷新 EC2 缓存
      命令:/etc/ansible/ec2.py --refresh-cache
    - 名称:刷新内存中的 EC2 缓存
      元:refresh_inventory
于 2016-09-07T22:59:38.393 回答
6

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

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

于 2015-03-12T11:33:42.523 回答
2

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

cache_max_age = 0

通过确保首先没有缓存任何内容来防止重新加载。

于 2019-02-26T11:03:20.660 回答
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:
于 2021-01-22T21:33:09.807 回答
0

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

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

Playbook 不应该使用 meta: refresh_inventory Ansible 功能,因为它与 Tower 处理库存的方式不兼容,如果 playbook 确实刷新了库存,它将刷新到作业开始时的库存开始。相反,使用具有单独库存刷新步骤的工作流。

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

于 2021-04-13T21:46:08.990 回答
-2

看看add_host

它确实将主机(或者组)添加到 ansible-playbook 内存清单

于 2015-10-08T14:10:52.837 回答