Replace all strings with loop - ANSIBLE

545 Views Asked by At

I'm trying to change CISCOASA word here using the output I got. I've tried using lineinfile module in ansible but the replacement is not in order.

ORIG JSON FILE:

{    "servers": [
{
"ingress": "CISCOASA",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
},
{
"ingress": "CISCOASA",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
},
{
"ingress": "CISCOASA",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": 22
},
{
"ingress": "CISCOASA",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12346,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
}
]}

REPLACE VALUES:

CISCOASA1
CISCOASA2
CISCOASA3
CISCOASA4

CURRENT OUTPUT:

{    "servers": [
{
"ingress": "CISCOASA4",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
},
{
"ingress": "CISCOASA3",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
},
{
"ingress": "CISCOASA2",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": 22
},
{
"ingress": "CISCOASA1",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12346,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
}
]}

DESIRED OUTPUT:

{    "servers": [
{
"ingress": "CISCOASA1",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
},
{
"ingress": "CISCOASA2",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
},
{
"ingress": "CISCOASA3",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12345,
"dest_ip": "IPADDRESS",
"dest_port": 22
},
{
"ingress": "CISCOASA4",
"protocol": "tcp",
"source_ip": "IPADDRESS",
"source_port": 12346,
"dest_ip": "IPADDRESS",
"dest_port": "ssh"
}
]}

Below is my task:

   - name: Adding extracted ingress in file
     become: yes
     become_user: root
     lineinfile:
       path: /filepath/valid.json
       regexp: "CISCOASA" 
       line: "\"ingress\": \"{{ item[0] }}\","
       state: present
     with_items:
       - "{{ foo }}"

Thank you

2

There are 2 best solutions below

1
On

this one do the trick :)

  - replace:
      path: ./file.json
      regexp: '^(.*?)CISCOASA\"(.*)'
      replace: '\1CISCOASA{{ servers_index + 1 }}\"\2'
    loop: "{{ vars_file_yml.servers }}"
    loop_control:
      index_var: servers_index
    vars:
      vars_file_yml: "{{ lookup('file', './file.json') | from_json }}"
0
On
   - name: Adding extracted ingress in file
     become: yes
     become_user: root
     replace:
       path: filepath/valid.json
       regexp: 'CISCOASA{{ servers_index + 1 }}'
       replace: "{{ item[0] }}"
     loop_control:
       index_var: servers_index
     with_items:
       - "{{ foo }}"

This answered my problem. :)