Write MAC addresses to local facts folder
This change allows for caching of the MAC addresses between runs by using local facts on the physical host. This saves calculation time after the first run, since the facts are effectively cached. This also means any containers that rely on having stable MAC addresses (such as neutron agents or rabbitmq) can be recreated with the same MAC address if the container is destroyed. It will *not* be retained if destroyed and removed from inventory, however, since the facts rely on using the exact same hostname. Change-Id: Id3d13299c1416cc4862437629b32f4309c2dc595
This commit is contained in:
parent
aaa69073ce
commit
e311cb657e
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- MAC addresses for containers with a fixed MAC (`lxc_container_fixed_mac`
|
||||||
|
variable) are now saved to the ``/etc/ansible/facts.d/mac.fact`` file.
|
||||||
|
Should such a container be destroyed but not removed from inventory,
|
||||||
|
the interfaces will be recreated with the same MAC address when the
|
||||||
|
container is recreated.
|
@ -13,6 +13,13 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
- name: Read custom facts from previous runs
|
||||||
|
setup:
|
||||||
|
filter: ansible_local
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
- name: Check for lxc volume group
|
- name: Check for lxc volume group
|
||||||
shell: "(which vgs > /dev/null && vgs | grep -o '{{ lxc_container_vg_name }}') || false"
|
shell: "(which vgs > /dev/null && vgs | grep -o '{{ lxc_container_vg_name }}') || false"
|
||||||
register: vg_result
|
register: vg_result
|
||||||
@ -199,7 +206,7 @@
|
|||||||
# resolve the rotating mac address issue this task is setting the mac in a hwaddr
|
# resolve the rotating mac address issue this task is setting the mac in a hwaddr
|
||||||
# file and a lookup is being used in the container-interface.ini template to render
|
# file and a lookup is being used in the container-interface.ini template to render
|
||||||
# the static hardware address as expected.
|
# the static hardware address as expected.
|
||||||
- name: Set unique interface mac address
|
- name: Set unique interface mac address (when no facts exist)
|
||||||
environment:
|
environment:
|
||||||
hexchars: "0123456789abcdef"
|
hexchars: "0123456789abcdef"
|
||||||
shell: |
|
shell: |
|
||||||
@ -215,6 +222,27 @@
|
|||||||
delegate_to: "{{ physical_host }}"
|
delegate_to: "{{ physical_host }}"
|
||||||
when:
|
when:
|
||||||
- lxc_container_fixed_mac | bool
|
- lxc_container_fixed_mac | bool
|
||||||
|
- (ansible_local is not defined or
|
||||||
|
'mac' not in ansible_local or
|
||||||
|
inventory_hostname not in ansible_local['mac'])
|
||||||
|
tags:
|
||||||
|
- lxc_container_create-networks
|
||||||
|
|
||||||
|
# NOTE(palendae): If we have saved MACs, write those out instead of generating new ones.
|
||||||
|
# Parentheses on the mac in ansible_local check to make the YAML parser happy.
|
||||||
|
- name: Reuse saved interface mac address from host facts
|
||||||
|
shell: |
|
||||||
|
echo {{ item.value }} > /var/lib/lxc/{{ inventory_hostname }}/{{ item.key }}.hwaddr
|
||||||
|
args:
|
||||||
|
executable: /bin/bash
|
||||||
|
creates: "/var/lib/lxc/{{ inventory_hostname }}/{{ item.key }}.hwaddr"
|
||||||
|
with_dict: "{{ ansible_local['mac'][inventory_hostname] | default({}) }}"
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
when:
|
||||||
|
- lxc_container_fixed_mac | bool
|
||||||
|
- ansible_local is defined
|
||||||
|
- ('mac' in ansible_local)
|
||||||
|
- inventory_hostname in ansible_local['mac']
|
||||||
tags:
|
tags:
|
||||||
- lxc_container_create-networks
|
- lxc_container_create-networks
|
||||||
|
|
||||||
@ -239,6 +267,30 @@
|
|||||||
tags:
|
tags:
|
||||||
- lxc_container_create-networks
|
- lxc_container_create-networks
|
||||||
|
|
||||||
|
# NOTE(palendae): If a unique identifier (like the hostname) is not provided as the marker, only one block will be written.
|
||||||
|
# Each host will be written once, and whichever one came last will be the only one in the file.
|
||||||
|
- name: Ensure MAC address fact cache is up-to-date
|
||||||
|
blockinfile:
|
||||||
|
dest: /etc/ansible/facts.d/mac.fact
|
||||||
|
marker: "# {mark} Managed by OpenStack-Ansible {{ inventory_hostname }}"
|
||||||
|
block: "{{ lookup('template', 'macs.fact.j2') }}"
|
||||||
|
create: yes
|
||||||
|
when:
|
||||||
|
- lxc_container_fixed_mac | bool
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
tags:
|
||||||
|
- lxc_container_create-networks
|
||||||
|
|
||||||
|
# NOTE(palendae): This is necessary to read any local facts in to the 'ansible_local' dict.
|
||||||
|
- name: Read local facts in for use
|
||||||
|
setup:
|
||||||
|
filter: ansible_local
|
||||||
|
when:
|
||||||
|
- lxc_container_fixed_mac | bool
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
- name: LXC host config for container networks
|
- name: LXC host config for container networks
|
||||||
template:
|
template:
|
||||||
src: "container-interface.ini.j2"
|
src: "container-interface.ini.j2"
|
||||||
|
@ -13,6 +13,14 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
- name: Allow the usage of local facts
|
||||||
|
file:
|
||||||
|
path: /etc/ansible/facts.d/
|
||||||
|
state: directory
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
tags:
|
||||||
|
- lxc_container_create-install
|
||||||
|
|
||||||
- name: Ansible version and LXC backing store check
|
- name: Ansible version and LXC backing store check
|
||||||
fail:
|
fail:
|
||||||
msg: "Using overlayfs is not supported when using Ansible version < 2"
|
msg: "Using overlayfs is not supported when using Ansible version < 2"
|
||||||
|
4
templates/macs.fact.j2
Normal file
4
templates/macs.fact.j2
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[{{ inventory_hostname }}]
|
||||||
|
{% for mac in macs.results %}
|
||||||
|
{{ mac.item.value.interface }} = {{ mac.stdout }}
|
||||||
|
{% endfor %}
|
Loading…
Reference in New Issue
Block a user