重新加载 Ansible 的动态清单
Reload Ansible's dynamic inventory
我正在使用 Ansible 设置 EC2 实例并部署应用程序。有一个主机脚本,用于收集标签相关的服务器和组信息。我想 运行 这些操作作为一个单独的剧本,所以
- 如果需要会创建新实例
- 托管脚本加载清单(包括服务器的事实)
- 部署手册有效
但是,库存是提前加载的,所以如果服务器 created/updated 在播放期间没有 servers/groups 数据。我可以 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
并且看到两个运行s:
$> cat log.log
Thu Mar 12 09:43:16 SAMT 2015
Thu Mar 12 09:43:16 SAMT 2015
但我还没有找到将其加倍的命令。
Ansible 目前不支持这个。如果您查看 ansible
或 ansible-playbook
命令的源代码,您会看到首先加载清单,然后将清单对象传递给运行指定任务或剧本的 ansible 命令。出于多种原因,将库存处理移动到 task/playbook 处理程序中可能是一项相当大的任务。
做这样的事情时,你最好的选择是简单地将你的剧本分成两部分,并将它们的调用包装在一个你只需要调用一次的 shell 脚本中。
看看add_host。
它确实将一个主机(或者一个组)添加到 ansible-playbook 内存清单中
使用 Ansible 2.0+,您可以在游戏中通过 运行 task:
刷新库存
- meta: refresh_inventory
我发现 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.ini 文件并设置选项:
cache_max_age = 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:
请注意,meta: refresh_inventory
在 Ansible Tower (AWX) 中不起作用。
https://docs.ansible.com/ansible-tower/3.3.1/html/userguide/best_practices.html
Playbooks should not use the meta: refresh_inventory Ansible feature, as it is incompatible with how Tower processes inventory, if a playbook does refresh inventory, it will refresh back to the start of the inventory the job began with. Instead, use a workflow with separate inventory refresh steps.
我还没有足够的代表发表评论,否则我会的。
我正在使用 Ansible 设置 EC2 实例并部署应用程序。有一个主机脚本,用于收集标签相关的服务器和组信息。我想 运行 这些操作作为一个单独的剧本,所以
- 如果需要会创建新实例
- 托管脚本加载清单(包括服务器的事实)
- 部署手册有效
但是,库存是提前加载的,所以如果服务器 created/updated 在播放期间没有 servers/groups 数据。我可以 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
并且看到两个运行s:
$> cat log.log
Thu Mar 12 09:43:16 SAMT 2015
Thu Mar 12 09:43:16 SAMT 2015
但我还没有找到将其加倍的命令。
Ansible 目前不支持这个。如果您查看 ansible
或 ansible-playbook
命令的源代码,您会看到首先加载清单,然后将清单对象传递给运行指定任务或剧本的 ansible 命令。出于多种原因,将库存处理移动到 task/playbook 处理程序中可能是一项相当大的任务。
做这样的事情时,你最好的选择是简单地将你的剧本分成两部分,并将它们的调用包装在一个你只需要调用一次的 shell 脚本中。
看看add_host。
它确实将一个主机(或者一个组)添加到 ansible-playbook 内存清单中
使用 Ansible 2.0+,您可以在游戏中通过 运行 task:
刷新库存- meta: refresh_inventory
我发现 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.ini 文件并设置选项:
cache_max_age = 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:
请注意,meta: refresh_inventory
在 Ansible Tower (AWX) 中不起作用。
https://docs.ansible.com/ansible-tower/3.3.1/html/userguide/best_practices.html
Playbooks should not use the meta: refresh_inventory Ansible feature, as it is incompatible with how Tower processes inventory, if a playbook does refresh inventory, it will refresh back to the start of the inventory the job began with. Instead, use a workflow with separate inventory refresh steps.
我还没有足够的代表发表评论,否则我会的。