Okay, we’ve ran out of ip addresses, and got a larger subnet from our ip. I am currently in the process of switching them over, and decided it would be nice to do this with ansible, but I have ran into a little snag.
Currently I have:
-
shell: “ifconfig | grep -B1 {{ old_address }}| grep -E ‘^(\w+)[[:space:]]’ | sed ‘s/\s.*$//’”
args:
executable: /bin/bash
register: network_interface
-
template:
src: files/linux_network_interfaces.j2
dest: /etc/network/interfaces
owner: root
group: root
mode: ‘0644’
become: true
when: item.key == inventory_hostname
with_dict: “{{ new_addresses }}”
-
shell: “ifdown {{ network_interface.stdout }} && ifup {{ network_interface.stdout }}”
args:
executable: /bin/bash
become: true
But it hangs in the last shell task… since the IP address was changed.
Is there a way I can tell this task to just run, then use set_fact to modify each host to its new IP to ping and make sure it worked, then I’ll move forward and modify our DNS records to match the new hosts…
Solved it via running the command as “fire and forget” with async and pool, using a bash command in the background. Then modifying the ansible_ssh_host to the new IP address, and waiting for it port 22 to come up on that host.
-
name: Grab the network interface that the old IP is using and store it.
shell: “ifconfig | grep -B1 {{ old_address_start }}| grep -E ‘^(\w+)[[:space:]]’ | sed ‘s/\s.*$//’”
args:
executable: /bin/bash
register: network_interface
-
name: Pushout new /etc/network/interface to hosts
template:
src: files/linux_network_interfaces.j2
dest: /etc/network/interfaces
owner: root
group: root
mode: ‘0644’
become: true
when: item.key == inventory_hostname
with_dict: “{{ new_addresses }}”
-
name: Reload the hosts’ network interface
shell: “(sleep 1; ifdown {{ network_interface.stdout }} && ifup {{ network_interface.stdout }}) &”
args:
executable: /bin/bash
become: true
async: 100
poll: 0
-
name: Change ansible’s ip address for each host
set_fact:
ansible_ssh_host: “{{ item.value.address }}”
when: item.key == inventory_hostname
with_dict: “{{ new_addresses }}”
-
name: Wait for the hosts’ network interface to come back up
local_action:
module: wait_for
host: “{{ ansible_ssh_host }}”
port: 22
delay: 10
state: started
register: wait_result
-
name: Modify all of the route53 records for ip changes that succeeded
local_action:
module: route53
command: create
zone: xxxxx
record: “{{ item.key }}”
type: A
value: “{{ item.value.address }}”
overwrite: true
when: item.key == inventory_hostname and wait_result|succeeded
with_dict: “{{ new_addresses }}”
Hi, I was wondering if you could provide us with the j2 template for your network interface? If not, what are the basics that you used for it?
Thank you!