如何根据输入范围将拆分值传递到ansible中的循环中?

how to pass split values into a loop in ansible based on input range?

我对 Ansible 循环还很陌生。
我正在尝试替换文件中的一组 IP 地址(oldipnewip)。
它需要接受输入的 ip 地址作为 oldip1:newip1,oldip2:newip2,oldip3:newip3...

形式的动态列表

我想拆分上面的 ip 地址对 (old:new),然后根据输入列表循环将它们传递给 Ansible replace 模块。

我正在尝试这样的事情,但我对如何将 ip 地址对的动态范围传递到循环中感到困惑。

我的输入变量就像 192.123.12.11;192.123.12.20, 192.123.12.12;192.123.12.19 , 192.123.12.13;192.123.12.18 ...(动态 ip 对范围)

vars: 
  ip_pairs: oldIP_newIP
tasks: 
  - debug: "{{ oldIP_newIP.split (',') }}"
  - replace: 
      path: /home/ubuntu/cassandra.properties
      regexp: "{{ item.regexp }}"
      replace: "{{ item.replace }}"
      backup: yes
    with_items: 
      - { regexp = "{{ oldIP }}", replace = "{{ newIP }}"
      - { regexp = "{{ oldIP }}", replace = "{{ newIP }}"
      .
      .
      .
      .

此循环应根据输入的 ip 对条目继续(5 次 5 对 ip 对 (old;new)。

为了实现这一点,您可以使用的真正有用的东西是您可以在任务级别注册变量,通过 vars 属性.

例如:

- name: This will display 'bar', the content of foo
  debug:
    msg: "{{ foo }}"
  vars:
    foo: 'bar'

基于此,你可以很轻松的实现你想要的:

- name: Replace IPs
  replace:
    path: /home/ubuntu/cassandra.properties
    regexp: "{{ oldNewIp[0] | trim }}"
    replace: "{{ oldNewIp[1] | trim }}"
    backup: yes
  vars:
    oldNewIp: "{{ item.split(';') }}"
  with_items: "{{ ipPairs.split(',') }}"

请注意,我添加了一些额外的 Jinja trim 以应对以下事实:在您的示例输入中,您的逗号后确实有一些 space。

这里有一个完整的示例来演示这个:
给定剧本

- hosts: local
  vars:
    ipPairs: '192.123.12.11;192.123.12.20, 192.123.12.12;192.123.12.19, 192.123.12.13;192.123.12.18'

  tasks:
    - name: Create an example file to replace in
      copy:
        dest: /tmp/ips.txt
        content: ''

    - name: Populate a file with old IPs
      lineinfile:
        path: /tmp/ips.txt
        line: "{{ oldNewIp[0] | trim }}"
      vars:
        oldNewIp: "{{ item.split(';') }}"
      with_items: "{{ ipPairs.split(',') }}"

    - name: Replace IPs
      replace:
        path: /tmp/ips.txt
        regexp: "{{ oldNewIp[0] | trim }}"
        replace: "{{ oldNewIp[1] | trim }}"
        backup: yes
      vars:
        oldNewIp: "{{ item.split(';') }}"
      with_items: "{{ ipPairs.split(',') }}"

我有以下玩法:

/ # ansible-playbook -i inventory.yaml play.yaml 

PLAY [local] *********************************************************************************************

TASK [Gathering Facts] ***********************************************************************************
[WARNING]: Platform linux on host local is using the discovered Python interpreter at /usr/bin/python3,
but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more
information.
ok: [local]

TASK [Create an example file to replace in] **************************************************************
changed: [local]

TASK [Populate a file with old IPs] ***********************************************************************
changed: [local] => (item=192.123.12.11;192.123.12.20)
changed: [local] => (item= 192.123.12.12;192.123.12.19)
changed: [local] => (item= 192.123.12.13;192.123.12.18)

TASK [Replace IPs] ***************************************************************************************
changed: [local] => (item=192.123.12.11;192.123.12.20)
changed: [local] => (item= 192.123.12.12;192.123.12.19)
changed: [local] => (item= 192.123.12.13;192.123.12.18)

PLAY RECAP ***********************************************************************************************
local                      : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

/ # cat /tmp/ips.txt
192.123.12.20
192.123.12.19
192.123.12.18