Merge "Add nspawn container driver"
This commit is contained in:
commit
25b671e344
@ -194,3 +194,14 @@
|
|||||||
scm: git
|
scm: git
|
||||||
src: https://github.com/logan2211/ansible-haproxy-endpoints
|
src: https://github.com/logan2211/ansible-haproxy-endpoints
|
||||||
version: 49901861b16b8afaa9bccdbc649ac956610ff22b
|
version: 49901861b16b8afaa9bccdbc649ac956610ff22b
|
||||||
|
|
||||||
|
# Once the initial commit for nspawn has been merged we can work on porting
|
||||||
|
# these roles over into the openstack-ansible namspace.
|
||||||
|
- name: nspawn_container_create
|
||||||
|
src: https://github.com/cloudnull/ansible-nspawn_container_create
|
||||||
|
scm: git
|
||||||
|
version: master
|
||||||
|
- name: nspawn_host
|
||||||
|
src: https://github.com/cloudnull/ansible-nspawn_host
|
||||||
|
scm: git
|
||||||
|
version: master
|
||||||
|
@ -120,6 +120,9 @@ global_overrides:
|
|||||||
shared-infra_hosts:
|
shared-infra_hosts:
|
||||||
aio1:
|
aio1:
|
||||||
ip: 172.29.236.100
|
ip: 172.29.236.100
|
||||||
|
container_vars:
|
||||||
|
# Optional | container_tech for a target host, default is "lxc".
|
||||||
|
container_tech: "{{ container_tech }}"
|
||||||
|
|
||||||
repo-infra_hosts:
|
repo-infra_hosts:
|
||||||
aio1:
|
aio1:
|
||||||
|
@ -325,6 +325,37 @@
|
|||||||
# infra3:
|
# infra3:
|
||||||
# ip: 172.29.236.103
|
# ip: 172.29.236.103
|
||||||
#
|
#
|
||||||
|
# List of target hosts on which to deploy shared infrastructure services
|
||||||
|
# and define the the container_tech for a specific infra node. If this setting
|
||||||
|
# is omitted the inventory generation system will default to "lxc". Accpetable
|
||||||
|
# options are "lxc" and "nspawn".
|
||||||
|
#
|
||||||
|
# Level: <value> (required, string)
|
||||||
|
# Hostname of a target host.
|
||||||
|
#
|
||||||
|
# Option: ip (required, string)
|
||||||
|
# IP address of this target host, typically the IP address assigned to
|
||||||
|
# the management bridge.
|
||||||
|
#
|
||||||
|
# Level: container_vars (required)
|
||||||
|
# Contains storage options for this target host.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# Define three shared infrastructure hosts with different "container_tech":
|
||||||
|
#
|
||||||
|
# shared-infra_hosts:
|
||||||
|
# infra1:
|
||||||
|
# ip: 172.29.236.101
|
||||||
|
# container_vars:
|
||||||
|
# container_tech: nspawn
|
||||||
|
# infra2:
|
||||||
|
# ip: 172.29.236.102
|
||||||
|
# container_vars:
|
||||||
|
# container_tech: lxc
|
||||||
|
# infra3:
|
||||||
|
# ip: 172.29.236.103
|
||||||
|
#
|
||||||
# --------
|
# --------
|
||||||
#
|
#
|
||||||
# Level: repo-infra_hosts (required)
|
# Level: repo-infra_hosts (required)
|
||||||
@ -764,4 +795,3 @@
|
|||||||
# address is ``193.0.14.129``. To change this default,
|
# address is ``193.0.14.129``. To change this default,
|
||||||
# set the ``keepalived_ping_address`` variable in the
|
# set the ``keepalived_ping_address`` variable in the
|
||||||
# ``user_variables.yml`` file.
|
# ``user_variables.yml`` file.
|
||||||
|
|
||||||
|
@ -81,8 +81,14 @@ global_overrides:
|
|||||||
shared-infra_hosts:
|
shared-infra_hosts:
|
||||||
infra1:
|
infra1:
|
||||||
ip: 172.29.236.11
|
ip: 172.29.236.11
|
||||||
|
container_vars:
|
||||||
|
# Optional | Example setting the container_tech for a target host.
|
||||||
|
container_tech: lxc
|
||||||
infra2:
|
infra2:
|
||||||
ip: 172.29.236.12
|
ip: 172.29.236.12
|
||||||
|
container_vars:
|
||||||
|
# Optional | Example setting the container_tech for a target host.
|
||||||
|
container_tech: nspawn
|
||||||
infra3:
|
infra3:
|
||||||
ip: 172.29.236.13
|
ip: 172.29.236.13
|
||||||
|
|
||||||
|
@ -66,7 +66,8 @@ service_region: RegionOne
|
|||||||
|
|
||||||
## OpenStack Domain
|
## OpenStack Domain
|
||||||
openstack_domain: openstack.local
|
openstack_domain: openstack.local
|
||||||
lxc_container_domain: "{{ openstack_domain }}"
|
lxc_container_domain: "{{ container_domain }}"
|
||||||
|
container_domain: "{{ openstack_domain }}"
|
||||||
|
|
||||||
## DHCP Domain Name
|
## DHCP Domain Name
|
||||||
dhcp_domain: openstacklocal
|
dhcp_domain: openstacklocal
|
||||||
|
@ -28,4 +28,3 @@ lxc_container_wait_params:
|
|||||||
delay: 3
|
delay: 3
|
||||||
# Wait 60 seconds for the container to respond
|
# Wait 60 seconds for the container to respond
|
||||||
timeout: 60
|
timeout: 60
|
||||||
|
|
||||||
|
@ -114,8 +114,9 @@ class MissingStaticRouteInfo(Exception):
|
|||||||
|
|
||||||
class LxcHostsDefined(Exception):
|
class LxcHostsDefined(Exception):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.message = ("The group 'lxc_hosts' must not be defined in config;"
|
self.message = ("The group 'lxc_hosts' or 'nspawn_hosts' must not"
|
||||||
" it will be dynamically generated.")
|
" be defined in config; it will be dynamically "
|
||||||
|
" generated.")
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.message
|
return self.message
|
||||||
@ -754,9 +755,10 @@ def populate_lxc_hosts(inventory):
|
|||||||
|
|
||||||
:param inventory: The dictionary containing the Ansible inventory
|
:param inventory: The dictionary containing the Ansible inventory
|
||||||
"""
|
"""
|
||||||
host_nodes = _find_lxc_hosts(inventory)
|
lxc_host_nodes, nspawn_host_nodes = _find_lxc_hosts(inventory)
|
||||||
inventory['lxc_hosts'] = {'hosts': host_nodes}
|
inventory['nspawn_hosts'] = {'hosts': nspawn_host_nodes}
|
||||||
logger.debug("Created lxc_hosts group.")
|
inventory['lxc_hosts'] = {'hosts': lxc_host_nodes}
|
||||||
|
logger.debug("Created lxc_hosts and nspawn_hosts group.")
|
||||||
|
|
||||||
|
|
||||||
def _find_lxc_hosts(inventory):
|
def _find_lxc_hosts(inventory):
|
||||||
@ -773,16 +775,33 @@ def _find_lxc_hosts(inventory):
|
|||||||
:returns: List of hostnames that are LXC hosts
|
:returns: List of hostnames that are LXC hosts
|
||||||
:rtype: list
|
:rtype: list
|
||||||
"""
|
"""
|
||||||
host_nodes = []
|
lxc_host_nodes = []
|
||||||
|
nspawn_host_nodes = []
|
||||||
for host, hostvars in inventory['_meta']['hostvars'].items():
|
for host, hostvars in inventory['_meta']['hostvars'].items():
|
||||||
physical_host = hostvars.get('physical_host', None)
|
physical_host = hostvars.get('physical_host', None)
|
||||||
|
container_tech = hostvars.get('container_tech', 'lxc')
|
||||||
|
hostvars['container_tech'] = container_tech
|
||||||
|
|
||||||
# We want this node's "parent", so append the physical host
|
# We want this node's "parent", so append the physical host
|
||||||
if not host == physical_host:
|
if not host == physical_host:
|
||||||
appended = du.append_if(array=host_nodes, item=physical_host)
|
if container_tech == 'lxc':
|
||||||
|
appended = du.append_if(
|
||||||
|
array=lxc_host_nodes,
|
||||||
|
item=physical_host
|
||||||
|
)
|
||||||
|
elif container_tech == 'nspawn':
|
||||||
|
appended = du.append_if(
|
||||||
|
array=nspawn_host_nodes,
|
||||||
|
item=physical_host
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
appended = None
|
||||||
|
|
||||||
if appended:
|
if appended:
|
||||||
logger.debug("%s added to lxc_hosts group", physical_host)
|
logger.debug("%s added to lxc_hosts and nspawn_hosts group",
|
||||||
return host_nodes
|
physical_host)
|
||||||
|
|
||||||
|
return lxc_host_nodes, nspawn_host_nodes
|
||||||
|
|
||||||
|
|
||||||
def _ensure_inventory_uptodate(inventory, container_skel):
|
def _ensure_inventory_uptodate(inventory, container_skel):
|
||||||
@ -908,7 +927,9 @@ def _check_multiple_ips_to_host(config):
|
|||||||
def _check_lxc_hosts(config):
|
def _check_lxc_hosts(config):
|
||||||
if 'lxc_hosts' in config.keys():
|
if 'lxc_hosts' in config.keys():
|
||||||
raise LxcHostsDefined()
|
raise LxcHostsDefined()
|
||||||
logger.debug("lxc_hosts group not defined")
|
elif 'nspawn_hosts' in config.keys():
|
||||||
|
raise LxcHostsDefined()
|
||||||
|
logger.debug("lxc_hosts or nspawn_hosts group not defined")
|
||||||
|
|
||||||
|
|
||||||
def _check_group_branches(config, physical_skel):
|
def _check_group_branches(config, physical_skel):
|
||||||
|
134
playbooks/common-tasks/os-nspawn-container-setup.yml
Normal file
134
playbooks/common-tasks/os-nspawn-container-setup.yml
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
---
|
||||||
|
# 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 (container)
|
||||||
|
file:
|
||||||
|
path: "{{ item['mount_path'] }}"
|
||||||
|
state: "directory"
|
||||||
|
with_items:
|
||||||
|
- "{{ list_of_bind_mounts | default([]) }}"
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
when:
|
||||||
|
- not is_metal | bool
|
||||||
|
tags:
|
||||||
|
- common-nspawn
|
||||||
|
|
||||||
|
- name: Ensure mount directories exists (physical host)
|
||||||
|
file:
|
||||||
|
path: "{{ item['bind_dir_path'] }}"
|
||||||
|
state: "directory"
|
||||||
|
with_items:
|
||||||
|
- "{{ list_of_bind_mounts | default([]) }}"
|
||||||
|
when:
|
||||||
|
- not is_metal | bool
|
||||||
|
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: _ec
|
||||||
|
when:
|
||||||
|
- not is_metal | bool
|
||||||
|
- 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:
|
||||||
|
- not is_metal | bool
|
||||||
|
- 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 | success
|
||||||
|
retries: 3
|
||||||
|
delay: 5
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
when:
|
||||||
|
- _ec | changed
|
||||||
|
tags:
|
||||||
|
- common-nspawn
|
||||||
|
|
||||||
|
- name: Wait for container connectivity
|
||||||
|
wait_for_connection:
|
||||||
|
delay: 3
|
||||||
|
timeout: 60
|
||||||
|
when:
|
||||||
|
- _container_restart | changed
|
||||||
|
tags:
|
||||||
|
- common-nspawn
|
@ -13,5 +13,7 @@
|
|||||||
# 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.
|
||||||
|
|
||||||
- include: "containers-{{ container_tech | default('lxc') }}-host.yml"
|
- include: "containers-lxc-host.yml"
|
||||||
- include: "containers-{{ container_tech | default('lxc') }}-create.yml"
|
- include: "containers-lxc-create.yml"
|
||||||
|
- include: "containers-nspawn-host.yml"
|
||||||
|
- include: "containers-nspawn-create.yml"
|
||||||
|
@ -14,11 +14,25 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
- name: Gather lxc container host facts
|
- name: Gather lxc container host facts
|
||||||
hosts: "{{ lxc_host_group | default('lxc_hosts')}}"
|
hosts: "{{ lxc_host_group | default('lxc_hosts') }}"
|
||||||
gather_facts: "{{ osa_gather_facts | default(True) }}"
|
gather_facts: "{{ osa_gather_facts | default(True) }}"
|
||||||
|
|
||||||
|
- name: Set lxc containers group
|
||||||
|
hosts: "{{ container_group | default('all_containers') }}"
|
||||||
|
gather_facts: false
|
||||||
|
tasks:
|
||||||
|
- name: Add hosts to dynamic inventory group
|
||||||
|
group_by:
|
||||||
|
key: lxc_containers
|
||||||
|
parents: all_lxc_containers
|
||||||
|
when:
|
||||||
|
- container_tech == 'lxc'
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
- lxc-containers-create
|
||||||
|
|
||||||
- name: Create container(s)
|
- name: Create container(s)
|
||||||
hosts: "{{ container_group|default('all_containers') }}"
|
hosts: all_lxc_containers
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
max_fail_percentage: 20
|
max_fail_percentage: 20
|
||||||
user: root
|
user: root
|
||||||
@ -42,7 +56,7 @@
|
|||||||
# TODO(evrardjp): Remove host_need_pip in the future
|
# TODO(evrardjp): Remove host_need_pip in the future
|
||||||
# when the process building the repo is done before this step.
|
# when the process building the repo is done before this step.
|
||||||
- name: Configure containers default software, but don't run pip yet
|
- name: Configure containers default software, but don't run pip yet
|
||||||
hosts: "{{ container_group|default('all_containers') }}"
|
hosts: all_lxc_containers
|
||||||
gather_facts: true
|
gather_facts: true
|
||||||
user: root
|
user: root
|
||||||
roles:
|
roles:
|
||||||
|
@ -13,8 +13,22 @@
|
|||||||
# 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: Set lxc containers group
|
||||||
|
hosts: "{{ container_group | default('all_containers') }}"
|
||||||
|
gather_facts: false
|
||||||
|
tasks:
|
||||||
|
- name: Add hosts to dynamic inventory group
|
||||||
|
group_by:
|
||||||
|
key: lxc_containers
|
||||||
|
parents: all_lxc_containers
|
||||||
|
when:
|
||||||
|
- container_tech == 'lxc'
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
- lxc-containers-create
|
||||||
|
|
||||||
- name: Destroy lxc containers
|
- name: Destroy lxc containers
|
||||||
hosts: "{{ container_group|default('all_containers') }}"
|
hosts: all_lxc_containers
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
max_fail_percentage: 20
|
max_fail_percentage: 20
|
||||||
user: root
|
user: root
|
||||||
|
57
playbooks/containers-nspawn-create.yml
Normal file
57
playbooks/containers-nspawn-create.yml
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
# 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: Gather nspawn container host facts
|
||||||
|
hosts: "{{ nspawn_host_group | default('nspawn_hosts') }}"
|
||||||
|
gather_facts: true
|
||||||
|
|
||||||
|
- name: Set nspawn containers group
|
||||||
|
hosts: "{{ container_group | default('all_containers') }}"
|
||||||
|
gather_facts: false
|
||||||
|
tasks:
|
||||||
|
- name: Add hosts to dynamic inventory group
|
||||||
|
group_by:
|
||||||
|
key: nspawn_containers
|
||||||
|
parents: all_nspawn_containers
|
||||||
|
when:
|
||||||
|
- container_tech == 'nspawn'
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
- nspawn-containers-create
|
||||||
|
|
||||||
|
- name: Create container(s)
|
||||||
|
hosts: all_nspawn_containers
|
||||||
|
gather_facts: false
|
||||||
|
user: root
|
||||||
|
roles:
|
||||||
|
- role: "nspawn_container_create"
|
||||||
|
environment: "{{ deployment_environment_variables | default({}) }}"
|
||||||
|
tags:
|
||||||
|
- nspawn-containers-create
|
||||||
|
|
||||||
|
# TODO(evrardjp): Remove host_need_pip in the future
|
||||||
|
# when the process building the repo is done before this step.
|
||||||
|
- name: Configure containers default software, but don't run pip yet
|
||||||
|
hosts: all_nspawn_containers
|
||||||
|
gather_facts: true
|
||||||
|
user: root
|
||||||
|
roles:
|
||||||
|
- role: "openstack_hosts"
|
||||||
|
is_container: true
|
||||||
|
vars:
|
||||||
|
host_need_pip: False
|
||||||
|
environment: "{{ deployment_environment_variables | default({}) }}"
|
||||||
|
tags:
|
||||||
|
- nspawn-containers-create
|
103
playbooks/containers-nspawn-destroy.yml
Normal file
103
playbooks/containers-nspawn-destroy.yml
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
---
|
||||||
|
# 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: Set nspawn containers group
|
||||||
|
hosts: "{{ container_group | default('all_containers') }}"
|
||||||
|
gather_facts: false
|
||||||
|
tasks:
|
||||||
|
- name: Add hosts to dynamic inventory group
|
||||||
|
group_by:
|
||||||
|
key: nspawn_containers
|
||||||
|
parents: all_nspawn_containers
|
||||||
|
when:
|
||||||
|
- container_tech == 'nspawn'
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
- nspawn-containers-destroy
|
||||||
|
|
||||||
|
- name: Destroy nspawn containers
|
||||||
|
hosts: all_nspawn_containers
|
||||||
|
gather_facts: false
|
||||||
|
max_fail_percentage: 20
|
||||||
|
user: root
|
||||||
|
tasks:
|
||||||
|
- name: Get container status
|
||||||
|
command: machinectl status "{{ inventory_hostname }}"
|
||||||
|
register: machinectl_status
|
||||||
|
failed_when: false
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
|
||||||
|
- name: Get container image status
|
||||||
|
command: machinectl image-status "{{ inventory_hostname }}"
|
||||||
|
register: machinectl_image_status
|
||||||
|
failed_when: false
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
|
||||||
|
- name: Escape quote container name
|
||||||
|
command: "systemd-escape {{ inventory_hostname }}"
|
||||||
|
changed_when: false
|
||||||
|
register: systemd_escape
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
|
||||||
|
- name: Disable container
|
||||||
|
systemd:
|
||||||
|
name: "systemd-nspawn@{{ systemd_escape.stdout }}"
|
||||||
|
state: stopped
|
||||||
|
enabled: false
|
||||||
|
failed_when: false
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
when:
|
||||||
|
- force_containers_destroy | bool
|
||||||
|
|
||||||
|
- name: Halt container
|
||||||
|
command: "machinectl poweroff {{ inventory_hostname }}"
|
||||||
|
failed_when: false
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
when:
|
||||||
|
- machinectl_status.rc == 0
|
||||||
|
- force_containers_destroy | bool
|
||||||
|
|
||||||
|
- name: Remove container
|
||||||
|
command: "machinectl remove {{ inventory_hostname }}"
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
when:
|
||||||
|
- machinectl_image_status.rc == 0
|
||||||
|
- force_containers_destroy | bool
|
||||||
|
|
||||||
|
- name: Destroy container data
|
||||||
|
file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: "absent"
|
||||||
|
with_items:
|
||||||
|
- "/openstack/{{ container_name }}"
|
||||||
|
- "/openstack/backup/{{ container_name }}"
|
||||||
|
- "/openstack/log/{{ container_name }}"
|
||||||
|
delegate_to: "{{ physical_host }}"
|
||||||
|
when:
|
||||||
|
- force_containers_destroy | bool
|
||||||
|
- force_containers_data_destroy | bool
|
||||||
|
vars_prompt:
|
||||||
|
- name: "force_containers_destroy"
|
||||||
|
prompt: "Are you sure you want to destroy the nspawn containers?"
|
||||||
|
default: "no"
|
||||||
|
private: no
|
||||||
|
when: force_containers_destroy is undefined
|
||||||
|
- name: "force_containers_data_destroy"
|
||||||
|
prompt: "Are you sure you want to destroy the nspawn container data?"
|
||||||
|
default: "no"
|
||||||
|
private: no
|
||||||
|
when: force_containers_data_destroy is undefined
|
||||||
|
tags:
|
||||||
|
- nspawn-containers-destroy
|
24
playbooks/containers-nspawn-host.yml
Normal file
24
playbooks/containers-nspawn-host.yml
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
# 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: Additional nspawn host setup
|
||||||
|
hosts: "{{ nspawn_host_group | default('nspawn_hosts') }}"
|
||||||
|
gather_facts: true
|
||||||
|
user: root
|
||||||
|
roles:
|
||||||
|
- role: "nspawn_host"
|
||||||
|
environment: "{{ deployment_environment_variables | default({}) }}"
|
||||||
|
tags:
|
||||||
|
- nspawn-hosts
|
16
releasenotes/notes/add-nspawn-driver-ac2aa38f04a7505a.yaml
Normal file
16
releasenotes/notes/add-nspawn-driver-ac2aa38f04a7505a.yaml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Deployers can now set the ``container_tech`` to **nspawn** when deploying
|
||||||
|
OSA within containers. When making the decision to deploy container types
|
||||||
|
the deployer only needs to define the desired ``container_tech`` and
|
||||||
|
continue the deployment as normal.
|
||||||
|
- The addition of the ``container_tech`` option and the inclusion of
|
||||||
|
**nspawn** support deployers now have the availability to define a desired
|
||||||
|
containerization strategy globally or on specific hosts.
|
||||||
|
- When using the **nspawn** driver containers will connect to the system
|
||||||
|
bridges using a MACVLAN, more on this type of network setup can be seen
|
||||||
|
`here <https://www.systutorials.com/docs/linux/man/8-ip-link/>`_.
|
||||||
|
- When using the **nspawn** driver container networking is managed by
|
||||||
|
systemd-networkd both on the host and within the container. This gives us a
|
||||||
|
single interface to manage regardless of distro and allows systemd to
|
||||||
|
efficiently manage the resources.
|
@ -47,6 +47,7 @@ export ANSIBLE_HOST_KEY_CHECKING="${ANSIBLE_HOST_KEY_CHECKING:-False}"
|
|||||||
export ANSIBLE_TIMEOUT="${ANSIBLE_TIMEOUT:-5}"
|
export ANSIBLE_TIMEOUT="${ANSIBLE_TIMEOUT:-5}"
|
||||||
export ANSIBLE_TRANSPORT="${ANSIBLE_TRANSPORT:-ssh}"
|
export ANSIBLE_TRANSPORT="${ANSIBLE_TRANSPORT:-ssh}"
|
||||||
export ANSIBLE_SSH_PIPELINING="${ANSIBLE_SSH_PIPELINING:-True}"
|
export ANSIBLE_SSH_PIPELINING="${ANSIBLE_SSH_PIPELINING:-True}"
|
||||||
|
export ANSIBLE_SSH_RETRIES="${ANSIBLE_SSH_RETRIES:-3}"
|
||||||
export ANSIBLE_PIPELINING="${ANSIBLE_SSH_PIPELINING}"
|
export ANSIBLE_PIPELINING="${ANSIBLE_SSH_PIPELINING}"
|
||||||
|
|
||||||
export ANSIBLE_STRATEGY_PLUGINS="${ANSIBLE_STRATEGY_PLUGINS:-/etc/ansible/roles/plugins/strategy}"
|
export ANSIBLE_STRATEGY_PLUGINS="${ANSIBLE_STRATEGY_PLUGINS:-/etc/ansible/roles/plugins/strategy}"
|
||||||
|
@ -261,6 +261,20 @@ function get_instance_info {
|
|||||||
lxc-checkconfig > \
|
lxc-checkconfig > \
|
||||||
"/openstack/log/instance-info/host_lxc_config_info_${TS}.log" || true
|
"/openstack/log/instance-info/host_lxc_config_info_${TS}.log" || true
|
||||||
fi
|
fi
|
||||||
|
if [ "$(which machinectl)" ]; then
|
||||||
|
machinectl list > \
|
||||||
|
"/openstack/log/instance-info/host_nspawn_container_info_${TS}.log" || true
|
||||||
|
machinectl list-images > \
|
||||||
|
"/openstack/log/instance-info/host_nspawn_container_image_info_${TS}.log" || true
|
||||||
|
fi
|
||||||
|
if [ "$(which networkctl)" ]; then
|
||||||
|
networkctl list > \
|
||||||
|
"/openstack/log/instance-info/host_netowrkd_list_${TS}.log" || true
|
||||||
|
networkctl status >> \
|
||||||
|
"/openstack/log/instance-info/host_netowrkd_status_${TS}.log" || true
|
||||||
|
networkctl lldp >> \
|
||||||
|
"/openstack/log/instance-info/host_netowrkd_lldp_${TS}.log" || true
|
||||||
|
fi
|
||||||
(iptables -vnL && iptables -t nat -vnL && iptables -t mangle -vnL) > \
|
(iptables -vnL && iptables -t nat -vnL && iptables -t mangle -vnL) > \
|
||||||
"/openstack/log/instance-info/host_firewall_info_${TS}.log" || true
|
"/openstack/log/instance-info/host_firewall_info_${TS}.log" || true
|
||||||
if [ "$(which ansible)" ]; then
|
if [ "$(which ansible)" ]; then
|
||||||
@ -271,6 +285,14 @@ function get_instance_info {
|
|||||||
get_repos_info > \
|
get_repos_info > \
|
||||||
"/openstack/log/instance-info/host_repo_info_${TS}.log" || true
|
"/openstack/log/instance-info/host_repo_info_${TS}.log" || true
|
||||||
|
|
||||||
|
for i in nspawn-macvlan.service nspawn-networking.slice nspawn.slice; do
|
||||||
|
systemctl status ${i} > "/openstack/log/instance-info/${i}_${TS}.log" || true
|
||||||
|
journalctl -u ${i} >> "/openstack/log/instance-info/${i}_${TS}.log" || true
|
||||||
|
done
|
||||||
|
|
||||||
|
ip route get 1 > "/openstack/log/instance-info/routes_${TS}.log" || true
|
||||||
|
ip link show > "/openstack/log/instance-info/links_${TS}.log" || true
|
||||||
|
|
||||||
determine_distro
|
determine_distro
|
||||||
case ${DISTRO_ID} in
|
case ${DISTRO_ID} in
|
||||||
centos|rhel|fedora|opensuse)
|
centos|rhel|fedora|opensuse)
|
||||||
|
@ -194,9 +194,6 @@ bridge_iptables_rules: |
|
|||||||
up /sbin/iptables -t nat -A POSTROUTING -o {{ bootstrap_host_public_interface }} -j MASQUERADE
|
up /sbin/iptables -t nat -A POSTROUTING -o {{ bootstrap_host_public_interface }} -j MASQUERADE
|
||||||
down /sbin/iptables -t nat -D POSTROUTING -o {{ bootstrap_host_public_interface }} -j MASQUERADE
|
down /sbin/iptables -t nat -D POSTROUTING -o {{ bootstrap_host_public_interface }} -j MASQUERADE
|
||||||
|
|
||||||
# Set the container technology in service. Options are lxc.
|
|
||||||
container_tech: "lxc"
|
|
||||||
|
|
||||||
## Extra storage
|
## Extra storage
|
||||||
# An AIO may optionally be built using a second storage device. If a
|
# An AIO may optionally be built using a second storage device. If a
|
||||||
# secondary disk device to use is not specified, then the AIO will be
|
# secondary disk device to use is not specified, then the AIO will be
|
||||||
@ -239,3 +236,6 @@ bootstrap_host_apt_components:
|
|||||||
# By default the address will be set to the ipv4 address of the
|
# By default the address will be set to the ipv4 address of the
|
||||||
# host's network interface that has the default route on it.
|
# host's network interface that has the default route on it.
|
||||||
#bootstrap_host_public_address: 0.0.0.0
|
#bootstrap_host_public_address: 0.0.0.0
|
||||||
|
|
||||||
|
# Set the container technology in service. Options are nspawn and lxc.
|
||||||
|
container_tech: "{{ ('nspawn' in bootstrap_host_scenario) | ternary('nspawn', 'lxc') }}"
|
||||||
|
@ -204,6 +204,3 @@ nova_service_negate:
|
|||||||
{% if _pypi_mirror is defined and _pypi_mirror.stdout is defined %}
|
{% if _pypi_mirror is defined and _pypi_mirror.stdout is defined %}
|
||||||
repo_nginx_pypi_upstream: "{{ _pypi_mirror.stdout | netloc }}"
|
repo_nginx_pypi_upstream: "{{ _pypi_mirror.stdout | netloc }}"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Set the container tech. Options are "lxc"
|
|
||||||
container_tech: "{{ container_tech }}"
|
|
||||||
|
@ -265,6 +265,7 @@ class TestAnsibleInventoryFormatConstraints(unittest.TestCase):
|
|||||||
'mano_all',
|
'mano_all',
|
||||||
'mano_containers',
|
'mano_containers',
|
||||||
'mano_hosts',
|
'mano_hosts',
|
||||||
|
'nspawn_hosts',
|
||||||
'octavia-infra_hosts',
|
'octavia-infra_hosts',
|
||||||
'octavia_all',
|
'octavia_all',
|
||||||
'octavia-api',
|
'octavia-api',
|
||||||
|
@ -33,6 +33,17 @@ confd_overrides:
|
|||||||
- name: neutron.yml.aio
|
- name: neutron.yml.aio
|
||||||
- name: nova.yml.aio
|
- name: nova.yml.aio
|
||||||
- name: swift.yml.aio
|
- name: swift.yml.aio
|
||||||
|
aio_nspawn:
|
||||||
|
- name: haproxy.yml.aio
|
||||||
|
- name: cinder.yml.aio
|
||||||
|
- name: designate.yml.aio
|
||||||
|
- name: glance.yml.aio
|
||||||
|
- name: heat.yml.aio
|
||||||
|
- name: horizon.yml.aio
|
||||||
|
- name: keystone.yml.aio
|
||||||
|
- name: neutron.yml.aio
|
||||||
|
- name: nova.yml.aio
|
||||||
|
- name: swift.yml.aio
|
||||||
ceph:
|
ceph:
|
||||||
- name: haproxy.yml.aio
|
- name: haproxy.yml.aio
|
||||||
- name: ceph.yml.aio
|
- name: ceph.yml.aio
|
||||||
|
@ -79,6 +79,13 @@
|
|||||||
action: upgrade
|
action: upgrade
|
||||||
scenario: aio
|
scenario: aio
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: openstack-ansible-deploy-aio_nspawn-ubuntu-xenial
|
||||||
|
parent: openstack-ansible-deploy-aio_lxc-ubuntu-xenial
|
||||||
|
voting: false
|
||||||
|
vars:
|
||||||
|
scenario: aio_nspawn
|
||||||
|
|
||||||
- job:
|
- job:
|
||||||
name: openstack-ansible-upgrade-ceph-ubuntu-xenial
|
name: openstack-ansible-upgrade-ceph-ubuntu-xenial
|
||||||
parent: openstack-ansible-deploy-aio_lxc-ubuntu-xenial
|
parent: openstack-ansible-deploy-aio_lxc-ubuntu-xenial
|
||||||
@ -123,6 +130,12 @@
|
|||||||
action: upgrade
|
action: upgrade
|
||||||
scenario: aio
|
scenario: aio
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: openstack-ansible-deploy-aio_nspawn-centos-7
|
||||||
|
parent: openstack-ansible-deploy-aio_lxc-centos-7
|
||||||
|
vars:
|
||||||
|
scenario: aio_nspawn
|
||||||
|
|
||||||
- job:
|
- job:
|
||||||
name: openstack-ansible-upgrade-ceph-centos-7
|
name: openstack-ansible-upgrade-ceph-centos-7
|
||||||
parent: openstack-ansible-deploy-aio_lxc-centos-7
|
parent: openstack-ansible-deploy-aio_lxc-centos-7
|
||||||
@ -153,6 +166,12 @@
|
|||||||
action: upgrade
|
action: upgrade
|
||||||
scenario: aio
|
scenario: aio
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: openstack-ansible-deploy-aio_nspawn-opensuse-423
|
||||||
|
parent: openstack-ansible-deploy-aio_lxc-opensuse-423
|
||||||
|
vars:
|
||||||
|
scenario: aio_nspawn
|
||||||
|
|
||||||
|
|
||||||
# NOTE(cloudnull): META JOB MAP
|
# NOTE(cloudnull): META JOB MAP
|
||||||
# In order to cater for the possibility that an external job was dependent on the old job name
|
# In order to cater for the possibility that an external job was dependent on the old job name
|
||||||
|
@ -24,10 +24,12 @@
|
|||||||
- openstack-ansible-deploy-ceph-ubuntu-xenial
|
- openstack-ansible-deploy-ceph-ubuntu-xenial
|
||||||
- openstack-ansible-deploy-ceph-opensuse-423
|
- openstack-ansible-deploy-ceph-opensuse-423
|
||||||
- openstack-ansible-deploy-aio_metal-ubuntu-xenial
|
- openstack-ansible-deploy-aio_metal-ubuntu-xenial
|
||||||
|
- openstack-ansible-deploy-aio_nspawn-ubuntu-xenial
|
||||||
experimental:
|
experimental:
|
||||||
jobs:
|
jobs:
|
||||||
- openstack-ansible-deploy-octavia-ubuntu-xenial
|
- openstack-ansible-deploy-octavia-ubuntu-xenial
|
||||||
- openstack-ansible-deploy_with_ansible_devel-aio-ubuntu-xenial
|
- openstack-ansible-deploy_with_ansible_devel-aio-ubuntu-xenial
|
||||||
|
- openstack-ansible-deploy-aio_nspawn-centos-7
|
||||||
gate:
|
gate:
|
||||||
jobs:
|
jobs:
|
||||||
- openstack-ansible-linters
|
- openstack-ansible-linters
|
||||||
|
Loading…
x
Reference in New Issue
Block a user