gpt4 book ai didi

linux - 我们如何在使用循环时调用 ansible playbook 中的变量

转载 作者:行者123 更新时间:2023-12-03 09:57:53 30 4
gpt4 key购买 nike

我有两个文件,其中这些文件包含 server namesserver IP's ,我想更改/替换一些特定的server namesIP addressees根据要求在两个文件中。
这与 This Post <-- 有关因为它被要求打开一个新帖子。
我的场景:
在下面的示例文件(file & file2)中,我需要执行以下操作..
1 - 在 file1 和 fil2 我必须替换 fostrain01.example.comdbfostrain01.example.com .
2 - 在另一行中我必须替换 171.20.20.18172.20.20.18在这两个文件中也是如此。

# cat /etc/file1
fostrain01.example.com
fostrain02.example.com
ServerIPS 171.20.20.16 171.20.20.17 171.20.20.18 171.20.20.19 171.20.20.20

# cat /etc/fil2
fostrain01.example.com
fostrain02.example.com
ServerIPS 171.20.20.16 171.20.20.17 171.20.20.18 171.20.20.19 171.20.20.20
我的剧本:
---
- name: Replace file contents
hosts: all
gather_facts: false
vars:
files:
- /etc/file1
- /etc/file2
from_str: "fostrain01.example.com"
to_str: "dbfoxtrain01.example.com"
from_ip: "^(.*)171\\.20\\.20\\.18(.*)$"
to_ip: "\\g<1>172.20.20.18\\g<2>"

tasks:
- name: Replace elements in file
replace:
path: "{{ item.path }}"
regexp: "{{ item.From }}"
replace: "{{ item.To }}"
backup: yes
loop:
# Replace the desired string
- { path: "{{ item }}", From: "{{ from_str }}", To: "{{ to_str }}" }
# Replace the desired ip
- { path: "{{ item }}", From: "{{ from_ip }}", To: "{{ to_ip }}" }
如您所见,在上面的剧本中,我已经为每个部分定义了变量。
我想知道的和想知道的:
我想了解 How i can use or reference files variablepath我的 playbook 中的替换模块部分以上使用 loop .
只是为了澄清,我说的是下面一个..
    files:
- /etc/file1
- /etc/file2
我希望这符合上述剧本中的方法,因为我知道这样做的另一种方式。
对不起,如果我不能说得更清楚。

最佳答案

所以文件是一个变量列表,就像任何变量列表一样,这些项目可以通过一个 0 索引的键访问。

  • 所以在你的情况下,files 的第一个元素列表,包含 /etc/file1
    可通过
    files.0
    或者
    files[0]
  • 第二个,包含/etc/file1可通过以下方式访问
    files.1
    或者
    files[1]
  • 等等等等。

  • 但是还有很多其他方法可以做到这一点:
  • 你可以使用 product 合并您的两个列表
  • 您可以使用 loop_control参数 index_var 创建自己的索引
  • 您可以使用 extended loop_control的参数,提供扩展变量 ansible_loop.index0

  • 所有这一切,为了让它更通用一点,如果我是你,我会使用 product 过滤并使用更简单的:
    - name: Replace elements in file
    replace:
    path: "{{ item.0 }}"
    regexp: "{{ item.1.from }}"
    replace: "{{ item.1.to }}"
    backup: yes
    vars:
    paths:
    - /etc/file1
    - /etc/file2
    replaces:
    - from: "fostrain01.example.com"
    to: "dbfoxtrain01.example.com"
    - from: "^(.*)171\\.20\\.20\\.18(.*)$"
    to: "\\g<1>172.20.20.18\\g<2>"
    loop: "{{ paths | product(replaces) | list }}"
    因为,那么没有理由转换您的列表,它已经拥有它应该为您的 replace任务。
    请注意,如果您需要 replaces,可以在游戏或任务级别定义变量。其他任务中的变量,只需将其恢复到游戏级别即可。

    关于linux - 我们如何在使用循环时调用 ansible playbook 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62875869/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com