Ansible 通过遍历文件并为每个主机分配变量来自动配置
Ansible Automate configuration by iterating over files and assigning variables for each host
我需要一些帮助来确定执行此操作的最佳方法以及如何设置我的剧本以适当地为每个节点提取变量。
假设我有 3 个主机
/etc/ansible/hosts:
host1
host2
host3
我有一个包含多个条目的可变文件
vars/IPs.yaml:
---
IP: ['192.168.77.35', '192.167.77.36', '192.168.77.37']
我是运行这本剧本:
network_change.yaml:
---
- hosts: all
vars_files:
- vars/IPs.yaml
tasks:
- name: Check 10G Interface
stat:
path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
register: teng
- name: Change 10G Interface Settings
lineinfile:
path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
regexp: '{{item.From}}'
line: '{{item.To}}'
when: teng.stat.exists
with_items:
- { From: 'IPADDR=', To: 'IPADDR={{IP}}'}
我在单个主机上工作得很好...但是当我有多个主机时,我不确定如何遍历 IPs.yaml 变量并在下次循环时提取下一个值运行。还有一种方法可以让我不使用字典 .yaml 变量,我可以只使用一个在换行符上有 IP 的原始文本文件吗?
基本上我想遍历并让主机在每个主机中显示这个 /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1。
host1 = 'IPADDR=192.168.77.35'
host2 = 'IPADDR=192.168.77.36'
host3 = 'IPADDR=192.168.77.37'
最终目标是能够使用简单的文本文件而不是字典 yaml 文件在 100 多个主机上执行此操作,并且将包括多个变量等。所有系统都可以通过 dhcp/hostnames/IP.
用数据创建字典,例如
- set_fact:
_dict: '{{ dict(ansible_play_hosts|zip(IP)) }}'
run_once: true
应该给
_dict:
host1: 192.168.77.35
host2: 192.167.77.36
host3: 192.168.77.37
然后使用这个字典和select IP,例如
- name: Change 10G Interface Settings
lineinfile:
path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
regexp: 'IPADDR='
line: 'IPADDR={{ _dict[inventory_hostname] }}'
when: teng.stat.exists
您可能想先测试一下,例如
- name: Change 10G Interface Settings
debug:
msg: 'IPADDR={{ _dict[inventory_hostname] }}'
应该给
ok: [host2] =>
msg: IPADDR=192.167.77.36
ok: [host1] =>
msg: IPADDR=192.168.77.35
ok: [host3] =>
msg: IPADDR=192.168.77.37
下一个选项不是创建字典,而是计算列表中的索引,例如应该给出相同的结果
- name: Change 10G Interface Settings
debug:
msg: 'IPADDR={{ IP[_index|int] }}'
vars:
_index: '{{ ansible_play_hosts.index(inventory_hostname) }}'
问:"使用 IP 换行的原始文本文件"
A:创建文件,例如
shell> cat IP.txt
192.168.77.35
192.167.77.36
192.168.77.37
即时创建列表,例如
- set_fact:
IP: "{{ lookup('file', 'IP.txt').split('\n') }}"
run_once: true
应该给
IP:
- 192.168.77.35
- 192.167.77.36
- 192.168.77.37
更可靠的解决方案是将哈希值放入文件中,例如
shell> cat IP.txt
host1: 192.168.77.35
host2: 192.167.77.36
host3: 192.168.77.37
然后任务
- include_vars:
file: IP.txt
name: _dict
应该创建字典
_dict:
host1: 192.168.77.35
host2: 192.167.77.36
host3: 192.168.77.37
但是,最简单的解决方案是将此字典存储在 IP.yml 中并将其放入目录 group_vars/all.
我需要一些帮助来确定执行此操作的最佳方法以及如何设置我的剧本以适当地为每个节点提取变量。
假设我有 3 个主机
/etc/ansible/hosts:
host1
host2
host3
我有一个包含多个条目的可变文件
vars/IPs.yaml:
---
IP: ['192.168.77.35', '192.167.77.36', '192.168.77.37']
我是运行这本剧本:
network_change.yaml:
---
- hosts: all
vars_files:
- vars/IPs.yaml
tasks:
- name: Check 10G Interface
stat:
path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
register: teng
- name: Change 10G Interface Settings
lineinfile:
path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
regexp: '{{item.From}}'
line: '{{item.To}}'
when: teng.stat.exists
with_items:
- { From: 'IPADDR=', To: 'IPADDR={{IP}}'}
我在单个主机上工作得很好...但是当我有多个主机时,我不确定如何遍历 IPs.yaml 变量并在下次循环时提取下一个值运行。还有一种方法可以让我不使用字典 .yaml 变量,我可以只使用一个在换行符上有 IP 的原始文本文件吗?
基本上我想遍历并让主机在每个主机中显示这个 /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1。
host1 = 'IPADDR=192.168.77.35'
host2 = 'IPADDR=192.168.77.36'
host3 = 'IPADDR=192.168.77.37'
最终目标是能够使用简单的文本文件而不是字典 yaml 文件在 100 多个主机上执行此操作,并且将包括多个变量等。所有系统都可以通过 dhcp/hostnames/IP.
用数据创建字典,例如
- set_fact:
_dict: '{{ dict(ansible_play_hosts|zip(IP)) }}'
run_once: true
应该给
_dict:
host1: 192.168.77.35
host2: 192.167.77.36
host3: 192.168.77.37
然后使用这个字典和select IP,例如
- name: Change 10G Interface Settings
lineinfile:
path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
regexp: 'IPADDR='
line: 'IPADDR={{ _dict[inventory_hostname] }}'
when: teng.stat.exists
您可能想先测试一下,例如
- name: Change 10G Interface Settings
debug:
msg: 'IPADDR={{ _dict[inventory_hostname] }}'
应该给
ok: [host2] =>
msg: IPADDR=192.167.77.36
ok: [host1] =>
msg: IPADDR=192.168.77.35
ok: [host3] =>
msg: IPADDR=192.168.77.37
下一个选项不是创建字典,而是计算列表中的索引,例如应该给出相同的结果
- name: Change 10G Interface Settings
debug:
msg: 'IPADDR={{ IP[_index|int] }}'
vars:
_index: '{{ ansible_play_hosts.index(inventory_hostname) }}'
问:"使用 IP 换行的原始文本文件"
A:创建文件,例如
shell> cat IP.txt
192.168.77.35
192.167.77.36
192.168.77.37
即时创建列表,例如
- set_fact:
IP: "{{ lookup('file', 'IP.txt').split('\n') }}"
run_once: true
应该给
IP:
- 192.168.77.35
- 192.167.77.36
- 192.168.77.37
更可靠的解决方案是将哈希值放入文件中,例如
shell> cat IP.txt
host1: 192.168.77.35
host2: 192.167.77.36
host3: 192.168.77.37
然后任务
- include_vars:
file: IP.txt
name: _dict
应该创建字典
_dict:
host1: 192.168.77.35
host2: 192.167.77.36
host3: 192.168.77.37
但是,最简单的解决方案是将此字典存储在 IP.yml 中并将其放入目录 group_vars/all.