库存文件(inventories/test/environments/tmp6.yml):
test:
children:
environments:
children:
tmp6:
tmp6:
vars:
ansible_user: superuser
ansible_password: superuser
ansible_become_password: "{{ ansible_password }}"
children:
infra:
hosts:
host_5:
ansible_host: 192.168.1.72
host_6:
ansible_host: 192.168.1.83
tools:
hosts:
host_7:
ansible_host: 192.168.1.239
host_8:
ansible_host: 192.168.1.46
一般的playbook.yml
:
- hosts: environments
roles:
- role: host-configuration
- role: host-users
- role: node-exporter
post_tasks:
- ansible.builtin.copy:
content: |
- target:
- {{ ansible_host }}:9100
labels:
environment_name: {{ inventory_file | ansible.builtin.basename | ansible.builtin.regex_replace('.yml$', '') }}
environment_type: {{ inventory_file | ansible.builtin.dirname | ansible.builtin.dirname | ansible.builtin.basename }}
dest: "./{{ inventory_file | ansible.builtin.basename }}"
delegate_to: localhost
在节点上成功安装node_exporter后,需要创建环境的通用配置文件:
- target:
- 192.168.1.72:9100
- 192.168.1.83:9100
- 192.168.1.239:9100
- 192.168.1.46:9100
labels:
environment_name: tmp6
environment_type: test
主要问题是制定目标清单。
如果创建这样一个模板:
- target:
- {{ ansible_host }}:9100
labels:
environment_name: {{ inventory_file | ansible.builtin.basename | ansible.builtin.regex_replace('.yml$', '') }}
environment_type: {{ inventory_file | ansible.builtin.dirname | ansible.builtin.dirname | ansible.builtin.basename }}
变量的值ansible_host
总是在变化。因此这不是一个解决方案。
如何在剧本中创建动态主机列表?
PS:Playbook可以应用于多种环境:
ansible-playbook playbook.yml -i inventories/test -l tmp1,tmp3,tmp6
一般任务:
- 在“环境”组的节点上安装node_exporter
- 在本地主机上创建通用配置文件
- 将配置文件复制到主机“prometheus”
Ansible 对你的“环境”一无所知。如果您想在剧本中使用该信息,则需要将其添加到您的库存中。例如,我们可以像这样添加
environment_type
和变量:environment_name
给定上面的清单文件,我们可以编写如下的剧本:
如果我们运行:
我们得到:
如果我们受环境限制,像这样:
我们得到:
最后,如果我们限制单个主机,如下所示:
我们得到:
这个问题可以通过中间临时文件来解决。
最终剧本:
更新
无需中间临时文件即可解决该问题。
最终剧本: