Ansible:遍历字符串并将其替换为每个主机上的文件以进行 1:1 映射

问题描述 投票:0回答:1

我知道这可能是一个简单的问题,但不知何故它对我不起作用。我不确定我在哪里犯了错误。

我在所有主机上都有一个名为

/tmp/myfile
的文件,并且在该文件上有一个名为
my_ip
的字符串。

我需要:

  1. my_ip
    (库存)文件中
    ip_addresses
    字段中提到的唯一IP地址替换
    hosts.yaml
  2. 主机和IP映射应该是顺序的。像
    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
字符串。

ansible ansible-inventory
1个回答
0
投票

根据您给定的描述和示例数据集,它看起来像

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

进一步的文档和类似的问答

© www.soinside.com 2019 - 2024. All rights reserved.