我知道这可能是一个简单的问题,但不知何故它对我不起作用。我不确定我在哪里犯了错误。
我在所有主机上都有一个名为
/tmp/myfile
的文件,并且在该文件上有一个名为 my_ip
的字符串。
我需要:
my_ip
(库存)文件中ip_addresses
字段中提到的唯一IP地址替换hosts.yaml
。abcde
必须得到字符串 192.168.1.2
作为 /tmp/myfile
等中的替换。到目前为止,我尝试了以下方法:
库存文件:
[hosts]
abcde ansible_host=192.168.1.102
pqrst ansible_host=192.168.1.103
xyzwa ansible_host=192.168.1.104
[ip_addresses]
192.168.1.2
192.168.1.3
192.168.1.4
Ansible任务:
---
- name: Assign IP addresses to hosts
hosts: hosts
gather_facts: false
tasks:
- name: Assign IP addresses
replace:
path: /tmp/myfile
regexp: 'my_ip'
replace: "{{ item }}"
with_items: "{{ ip_addresses }}"
when: "'{{ inventory_hostname }}' in group_names"
vars:
ip_addresses: "{{ groups['ip_addresses'] }}"
但是它循环遍历并将每个 IP 分配给每个主机,最终所有主机都从
ip_addresses
.
有人可以帮忙吗?
P.S.:我不想将这些变量定义到剧本中。此外,不能将“模板”用作远程文件
/tmp/myfile
在所有主机上将具有不同的内容但将具有共同的my_ip
字符串。
根据您给定的描述和示例数据集,它看起来像
new_ip = .10x - 100
以及关于您的评论
如何在 Ansible 中计算 IP(比如生成下一个 IP 编号)?
一个最小的例子
inventory.ini
[test]
test01.example.com ansible_host=192.0.2.101
test02.example.com ansible_host=192.0.2.102
test03.example.com ansible_host=192.0.2.103
playbook.yml
---
- hosts: test
become: false
gather_facts: false
tasks:
- name: Show IP from inventory
debug:
msg: "{{ ansible_host }}"
- name: Calculate new IP
debug:
msg: "{{ ansible_host | ipmath(-100) }}"
将导致输出
TASK [Show IP from inventory] ******
ok: [test01.example.com] =>
msg: 192.0.2.101
ok: [test02.example.com] =>
msg: 192.0.2.102
ok: [test03.example.com] =>
msg: 192.0.2.103
TASK [Calculate new IP] ************
ok: [test02.example.com] =>
msg: 192.0.2.2
ok: [test03.example.com] =>
msg: 192.0.2.3
ok: [test01.example.com] =>
msg: 192.0.2.1
这会更容易......遍历清单文件中列出的IP。
正如您从任务的输出中看到的
Calculate new IP
您不能依赖于顺序,并且需要引入索引和逻辑来保持两个“列表”同步或以其他方式在它们之间创建关系。这也是您可以通过使用 @β.εηοιτ.βε 提到的清单文件来实现的。
[test]
test01.example.com ansible_host=192.0.2.101 new_ip=192.0.2.1
test02.example.com ansible_host=192.0.2.102 new_ip=192.0.2.2
test03.example.com ansible_host=192.0.2.103 new_ip=192.0.2.3
进一步的文档和类似的问答