openstack-ansible/playbooks/common-tasks/os-nspawn-container-setup.yml

130 lines
3.7 KiB
YAML

---
# Copyright 2017, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
- name: Pull systemd version
command: "systemctl --version"
changed_when: false
register: systemd_version
delegate_to: "{{ physical_host }}"
tags:
- skip_ansible_lint
- always
- name: Set facts
set_fact:
nspawn_systemd_version: "{{ systemd_version.stdout_lines[0].split()[-1] }}"
tags:
- always
- name: Escape quote container name
command: "systemd-escape {{ inventory_hostname }}"
changed_when: false
register: systemd_escape
delegate_to: "{{ physical_host }}"
tags:
- skip_ansible_lint
- always
- name: Ensure mount directories exists (physical host)
file:
path: "{{ item['mount_path'] }}"
state: "directory"
with_items:
- "{{ list_of_bind_mounts | default([]) }}"
delegate_to: "{{ physical_host }}"
tags:
- common-nspawn
- name: Ensure mount directories exists (container)
file:
path: "{{ item['bind_dir_path'] }}"
state: "directory"
with_items:
- "{{ list_of_bind_mounts | default([]) }}"
tags:
- common-nspawn
- name: Create container bind mount config
lineinfile:
dest: "/etc/systemd/nspawn/{{ inventory_hostname }}.nspawn"
line: "Bind={{ item['mount_path'] }}:{{ item['bind_dir_path'] }}"
insertafter: "^Bind"
backup: "true"
with_items:
- "{{ list_of_bind_mounts | default([]) }}"
delegate_to: "{{ physical_host }}"
register: add_bind
when:
- nspawn_systemd_version | int > 219
tags:
- common-nspawn
- name: Create container bind mount config (old)
block:
- name: Get ExecStart from config
shell: >-
grep -w '^ExecStart=/usr/bin/systemd-nspawn'
/etc/systemd/system/systemd-nspawn@$(/usr/bin/systemd-escape {{ inventory_hostname }}).service
delegate_to: "{{ physical_host }}"
register: _ec_old_start
changed_when: false
- name: set flag fact
set_fact:
nspawn_flags: "{{ _ec_old_start.stdout.split('ExecStart=/usr/bin/systemd-nspawn')[-1] }}"
nspawn_extra_flags: "{% for item in list_of_bind_mounts %} --bind={{ item['mount_path'] }}:{{ item['bind_dir_path'] }}{% endfor %}"
- name: set flag list
set_fact:
nspawn_flag_list: "{{ nspawn_flags.split() | union(nspawn_extra_flags.split()) | unique }}"
- name: Add line in container start config
lineinfile:
dest: "/etc/systemd/system/systemd-nspawn@{{ systemd_escape.stdout }}.service"
line: "ExecStart=/usr/bin/systemd-nspawn {{ nspawn_flag_list | join(' ') }}"
regexp: "^ExecStart"
backup: "true"
delegate_to: "{{ physical_host }}"
register: _ec
when:
- list_of_bind_mounts | default([])
- nspawn_systemd_version | int < 220
tags:
- common-nspawn
- name: Restart container
systemd:
name: "systemd-nspawn@{{ systemd_escape.stdout }}"
state: restarted
register: _container_restart
until: _container_restart is success
retries: 3
delay: 5
delegate_to: "{{ physical_host }}"
when:
- (_ec is defined and _ec is changed) or
(add_bind is defined and add_bind is changed)
tags:
- common-nspawn
- name: Wait for container connectivity
wait_for_connection:
delay: 3
timeout: 60
when:
- _container_restart is changed
tags:
- common-nspawn