Tuesday, July 26, 2022

[SOLVED] Problems with SED in Ansible playbook

Issue

I'm installing Docker on some hosts and using Ansible playbook to do this. However, we have a startup script for Consul that breaks when docker is installed, as Docker adds a virtual NIC and adds an extra value to the variable.

Original Variables

NODEIP=`hostname -I`
NODE=`hostname -I |sed  's/[.]/-/g'`

I can manually change them to the following and this works.

NODEIP=$(hostname -I | grep -o "[^ ]\\+" | awk /^10\./"{print $1}")
NODE=$(hostname -I | grep -o "[^ ]\+" | awk /^10\./"{print $1}" |sed  "s/[.]/-/g")

However, I need to add these to an Ansible playbook. I've modified the variable for NODE and it gets updated in the script, but NODEIP does not. See sample playbook code below.

name: Fix consul startup script for Docker virtual network interface
      shell: sed -i 's/NODEIP=`hostname -I`/s_.*_NODEIP=$(hostname -I | grep -o \"[^ ]\\+\" | awk /^10\./\"{print \$1}\")' filename
      shell: sed -i '/NODE=`hostname -I |sed/s_.*_NODE=$(echo $NODEIP|sed  's/[.]/-/g')_' filename

I'm going insane trying to get this to work properly. Can anyone help?


Solution

Thanks to all for the input. Here's what I ended up coming up with (had to escape some characters with backslashes). Delighted it works

- name: replace NODEIP variable in consul startup script
  lineinfile:
   path: filename
   regexp: '^NODEIP='
   line: "NODEIP=$(hostname -I | grep -o \"[^ ]\\+\" | awk /^10\\./\"{print $1}\")"
   backrefs: yes

- name: replace NODE variable in consul startup script
  lineinfile:
   path: filename
   regexp: '^NODE='
   line: "NODE=$(hostname -I | grep -o \"[^ ]\\+\" | awk /^10\\./\"{print $1}\" |sed  \"s/[.]/-/g\")"
   backrefs: yes


Answered By - MalkyBesh
Answer Checked By - Candace Johnson (WPSolving Volunteer)