Add Ansible support for Ironic
Configuration based off upstream documentation here: http://docs.openstack.org/developer/ironic/deploy/install-guide.html A few notes: -ironic-api is not configured to use mod_wsgi -several places it's noted that discoverd is going away and needs to be replaced with ironic-inspector - (sqlite connection should be changed too) -currently enabling ironic reconfigures nova compute (driver and scheduler) as well as changes neutron network settings -a nice enhancement would be to configure the web console Required post-deployment configuration: Create the flat network to launch the instances: neutron net-create --tenant-id $TENANT_ID sharednet1 --shared \ --provider:network_type flat --provider:physical_network physnet1 neutron subnet-create sharednet1 $NETWORK_CIDR --name $SUBNET_NAME \ --ip-version=4 --gateway=$GATEWAY_IP --allocation-pool \ start=$START_IP,end=$END_IP --enable-dhcp And then the above ID is used to set cleaning_network_uuid in the neutron section of ironic.conf. Change-Id: I572e7ff1f23c4e57a2c50817cafe9269fd9950dd Implements: blueprint ironic-container
This commit is contained in:
parent
40f9f0816f
commit
f5a50a1d7d
@ -104,6 +104,9 @@ heat_api_cfn_port: "8000"
|
||||
|
||||
murano_api_port: "8082"
|
||||
|
||||
ironic_api_port: "6385"
|
||||
|
||||
|
||||
####################
|
||||
# Openstack options
|
||||
####################
|
||||
@ -146,7 +149,9 @@ enable_heat: "yes"
|
||||
enable_horizon: "yes"
|
||||
enable_swift: "no"
|
||||
enable_murano: "no"
|
||||
enable_ironic: "no"
|
||||
|
||||
ironic_keystone_user: "ironic"
|
||||
|
||||
####################
|
||||
# RabbitMQ options
|
||||
|
@ -60,6 +60,8 @@ control
|
||||
[ceph-osd:children]
|
||||
storage
|
||||
|
||||
[ironic:children]
|
||||
control
|
||||
|
||||
# Additional control implemented here. These groups allow you to control which
|
||||
# services run on which hosts at a per-service level.
|
||||
@ -140,3 +142,16 @@ murano
|
||||
|
||||
[murano-engine:children]
|
||||
murano
|
||||
|
||||
# Ironic
|
||||
[ironic-api:children]
|
||||
ironic
|
||||
|
||||
[ironic-conductor:children]
|
||||
ironic
|
||||
|
||||
[ironic-discoverd:children]
|
||||
ironic
|
||||
|
||||
[ironic-pxe:children]
|
||||
ironic
|
||||
|
@ -62,6 +62,9 @@ control
|
||||
[murano:children]
|
||||
control
|
||||
|
||||
[ironic:children]
|
||||
control
|
||||
|
||||
[ceph-mon:children]
|
||||
control
|
||||
|
||||
@ -148,3 +151,16 @@ murano
|
||||
|
||||
[murano-engine:children]
|
||||
murano
|
||||
|
||||
# Ironic
|
||||
[ironic-api:children]
|
||||
ironic
|
||||
|
||||
[ironic-conductor:children]
|
||||
ironic
|
||||
|
||||
[ironic-discoverd:children]
|
||||
ironic
|
||||
|
||||
[ironic-pxe:children]
|
||||
ironic
|
||||
|
@ -141,3 +141,11 @@ listen heat_api_cfn
|
||||
server {{ hostvars[host]['ansible_hostname'] }} {{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ heat_api_cfn_port }} check inter 2000 rise 2 fall 5
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% if enable_ironic | bool %}
|
||||
listen ironic_api
|
||||
bind {{ kolla_internal_address}}:{{ ironic_api_port }}
|
||||
{% for host in groups['ironic-api'] %}
|
||||
server {{ hostvars[host]['ansible_hostname'] }} {{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ ironic_api_port }} check inter 2000 rise 2 fall 5
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
42
ansible/roles/ironic/defaults/main.yml
Normal file
42
ansible/roles/ironic/defaults/main.yml
Normal file
@ -0,0 +1,42 @@
|
||||
---
|
||||
project_name: "ironic"
|
||||
|
||||
####################
|
||||
# Database
|
||||
####################
|
||||
ironic_database_name: "ironic"
|
||||
ironic_database_user: "ironic"
|
||||
ironic_database_address: "{{ kolla_internal_address }}"
|
||||
|
||||
|
||||
####################
|
||||
# Docker
|
||||
####################
|
||||
ironic_api_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ kolla_install_type }}-ironic-api"
|
||||
ironic_api_tag: "{{ openstack_release }}"
|
||||
ironic_api_image_full: "{{ ironic_api_image }}:{{ ironic_api_tag }}"
|
||||
|
||||
ironic_conductor_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ kolla_install_type }}-ironic-conductor"
|
||||
ironic_conductor_tag: "{{ openstack_release }}"
|
||||
ironic_conductor_image_full: "{{ ironic_conductor_image }}:{{ ironic_conductor_tag }}"
|
||||
|
||||
ironic_discoverd_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ kolla_install_type }}-ironic-discoverd"
|
||||
ironic_discoverd_tag: "{{ openstack_release }}"
|
||||
ironic_discoverd_image_full: "{{ ironic_discoverd_image }}:{{ ironic_discoverd_tag }}"
|
||||
|
||||
ironic_pxe_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ kolla_install_type }}-ironic-pxe"
|
||||
ironic_pxe_tag: "{{ openstack_release }}"
|
||||
ironic_pxe_image_full: "{{ ironic_pxe_image }}:{{ ironic_pxe_tag }}"
|
||||
|
||||
|
||||
####################
|
||||
# Openstack
|
||||
####################
|
||||
ironic_public_address: "{{ kolla_external_address }}"
|
||||
ironic_admin_address: "{{ kolla_internal_address }}"
|
||||
ironic_internal_address: "{{ kolla_internal_address }}"
|
||||
|
||||
ironic_logging_verbose: "{{ openstack_logging_verbose }}"
|
||||
ironic_logging_debug: "{{ openstack_logging_debug }}"
|
||||
|
||||
openstack_ironic_auth: "{'auth_url':'{{ openstack_auth_v2.auth_url }}','username':'{{ openstack_auth_v2.username }}','password':'{{ openstack_auth_v2.password }}','project_name':'{{ openstack_auth_v2.project_name }}'}"
|
3
ansible/roles/ironic/meta/main.yml
Normal file
3
ansible/roles/ironic/meta/main.yml
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
dependencies:
|
||||
- { role: common }
|
64
ansible/roles/ironic/tasks/bootstrap.yml
Normal file
64
ansible/roles/ironic/tasks/bootstrap.yml
Normal file
@ -0,0 +1,64 @@
|
||||
---
|
||||
- name: Creating Ironic database
|
||||
command: docker exec -t kolla_ansible /usr/bin/ansible localhost
|
||||
-m mysql_db
|
||||
-a "login_host='{{ database_address }}'
|
||||
login_port='{{ mariadb_port }}'
|
||||
login_user='{{ database_user }}'
|
||||
login_password='{{ database_password }}'
|
||||
name='{{ ironic_database_name }}'"
|
||||
register: database
|
||||
changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
|
||||
failed_when: database.stdout.split()[2] != 'SUCCESS'
|
||||
run_once: True
|
||||
|
||||
- name: Creating Ironic database user and setting permissions
|
||||
command: docker exec -t kolla_ansible /usr/bin/ansible localhost
|
||||
-m mysql_user
|
||||
-a "login_host='{{ database_address }}'
|
||||
login_port='{{ mariadb_port }}'
|
||||
login_user='{{ database_user }}'
|
||||
login_password='{{ database_password }}'
|
||||
name='{{ ironic_database_name }}'
|
||||
password='{{ ironic_database_password }}'
|
||||
host='%'
|
||||
priv='{{ ironic_database_name }}.*:ALL'
|
||||
append_privs='yes'"
|
||||
register: database_user_create
|
||||
changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
|
||||
failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
|
||||
run_once: True
|
||||
|
||||
- name: Starting Ironic bootstrap container
|
||||
docker:
|
||||
detach: False
|
||||
docker_api_version: "{{ docker_api_version }}"
|
||||
net: host
|
||||
pull: "{{ docker_pull_policy }}"
|
||||
restart_policy: "no"
|
||||
state: reloaded
|
||||
registry: "{{ docker_registry }}"
|
||||
username: "{{ docker_registry_username }}"
|
||||
password: "{{ docker_registry_password }}"
|
||||
insecure_registry: "{{ docker_insecure_registry }}"
|
||||
name: bootstrap_ironic
|
||||
image: "{{ ironic_api_image_full }}"
|
||||
volumes: "{{ node_config_directory }}/ironic-api/:/opt/kolla/config_files/:ro"
|
||||
env:
|
||||
KOLLA_BOOTSTRAP:
|
||||
KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
|
||||
run_once: True
|
||||
when: database.stdout.find('localhost | SUCCESS => ') != -1 and (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed
|
||||
|
||||
# https://github.com/ansible/ansible-modules-core/pull/1031
|
||||
- name: Waiting for Ironic bootstrap container to exit
|
||||
command: docker wait bootstrap_ironic
|
||||
run_once: True
|
||||
when: database.stdout.find('localhost | SUCCESS => ') != -1 and (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed
|
||||
|
||||
- name: Cleaning up boostrap container
|
||||
docker:
|
||||
name: bootstrap_ironic
|
||||
image: "{{ ironic_api_image_full }}"
|
||||
state: absent
|
||||
when: database.stdout.find('localhost | SUCCESS => ') != -1 and (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed
|
78
ansible/roles/ironic/tasks/config.yml
Normal file
78
ansible/roles/ironic/tasks/config.yml
Normal file
@ -0,0 +1,78 @@
|
||||
---
|
||||
- include: ../../config.yml
|
||||
vars:
|
||||
service_name: "ironic-api"
|
||||
config_source:
|
||||
- "roles/ironic/templates/ironic.conf.j2"
|
||||
- "/etc/kolla/config/global.conf"
|
||||
- "/etc/kolla/config/database.conf"
|
||||
- "/etc/kolla/config/messaging.conf"
|
||||
- "/etc/kolla/config/{{ project_name }}.conf"
|
||||
- "/etc/kolla/config/{{ project_name }}/{{ service_name }}.conf"
|
||||
config_template_dest:
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_minimal"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_augment"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ service_name }}.conf_augment"
|
||||
config_dest: "{{ node_config_directory }}/{{ service_name }}/ironic.conf"
|
||||
when: inventory_hostname in groups['ironic-api']
|
||||
|
||||
- name: Copying Ironic API JSON configuration file
|
||||
template:
|
||||
src: "roles/ironic/templates/ironic-api.json.j2"
|
||||
dest: "{{ node_config_directory }}/ironic-api/config.json"
|
||||
|
||||
- include: ../../config.yml
|
||||
vars:
|
||||
service_name: "ironic-conductor"
|
||||
config_source:
|
||||
- "roles/ironic/templates/ironic.conf.j2"
|
||||
- "/etc/kolla/config/global.conf"
|
||||
- "/etc/kolla/config/database.conf"
|
||||
- "/etc/kolla/config/messaging.conf"
|
||||
- "/etc/kolla/config/{{ project_name }}.conf"
|
||||
- "/etc/kolla/config/{{ project_name }}/{{ service_name }}.conf"
|
||||
config_template_dest:
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_minimal"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_augment"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ service_name }}.conf_augment"
|
||||
config_dest: "{{ node_config_directory }}/{{ service_name }}/ironic.conf"
|
||||
when: inventory_hostname in groups['ironic-conductor']
|
||||
|
||||
- name: Copying Ironic conductor JSON configuration file
|
||||
template:
|
||||
src: "roles/ironic/templates/ironic-conductor.json.j2"
|
||||
dest: "{{ node_config_directory }}/ironic-conductor/config.json"
|
||||
|
||||
- include: ../../config.yml
|
||||
vars:
|
||||
service_name: "ironic-discoverd"
|
||||
config_source:
|
||||
- "roles/ironic/templates/discoverd.conf.j2"
|
||||
- "/etc/kolla/config/global.conf"
|
||||
- "/etc/kolla/config/database.conf"
|
||||
- "/etc/kolla/config/messaging.conf"
|
||||
- "/etc/kolla/config/{{ project_name }}/discoverd.conf"
|
||||
config_template_dest:
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/discoverd.conf_minimal"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
|
||||
- "{{ node_templates_directory }}/{{ service_name }}/discoverd.conf_augment"
|
||||
config_dest: "{{ node_config_directory }}/{{ service_name }}/discoverd.conf"
|
||||
when: inventory_hostname in groups['ironic-discoverd']
|
||||
|
||||
- name: Copying Ironic discoverd JSON configuration file
|
||||
template:
|
||||
src: "roles/ironic/templates/ironic-discoverd.json.j2"
|
||||
dest: "{{ node_config_directory }}/ironic-discoverd/config.json"
|
||||
|
||||
- name: Copying Ironic PXE JSON configuration file
|
||||
template:
|
||||
src: "roles/ironic/templates/ironic-pxe.json.j2"
|
||||
dest: "{{ node_config_directory }}/ironic-pxe/config.json"
|
8
ansible/roles/ironic/tasks/main.yml
Normal file
8
ansible/roles/ironic/tasks/main.yml
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
- include: register.yml
|
||||
|
||||
- include: config.yml
|
||||
|
||||
- include: bootstrap.yml
|
||||
|
||||
- include: start.yml
|
37
ansible/roles/ironic/tasks/register.yml
Normal file
37
ansible/roles/ironic/tasks/register.yml
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
- name: Creating the Ironic service and endpoint
|
||||
command: docker exec -t kolla_ansible /usr/bin/ansible localhost
|
||||
-m kolla_keystone_service
|
||||
-a "service_name=ironic
|
||||
service_type=baremetal
|
||||
description='Ironic bare metal provisioning service'
|
||||
endpoint_region={{ openstack_region_name }}
|
||||
admin_url='http://{{ ironic_admin_address }}:{{ ironic_api_port }}'
|
||||
internal_url='http://{{ ironic_internal_address }}:{{ ironic_api_port }}'
|
||||
public_url='http://{{ ironic_public_address }}:{{ ironic_api_port }}'
|
||||
region_name={{ openstack_region_name }}
|
||||
auth={{ '{{ openstack_ironic_auth }}' }}"
|
||||
-e "{'openstack_ironic_auth':{{ openstack_ironic_auth }}}"
|
||||
register: ironic_endpoint
|
||||
changed_when: "{{ ironic_endpoint.stdout.find('localhost | SUCCESS => ') != -1 and (ironic_endpoint.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
|
||||
until: ironic_endpoint.stdout.split()[2] == 'SUCCESS'
|
||||
retries: 10
|
||||
delay: 5
|
||||
run_once: True
|
||||
|
||||
- name: Creating the Ironic project, user, and role
|
||||
command: docker exec -t kolla_ansible /usr/bin/ansible localhost
|
||||
-m kolla_keystone_user
|
||||
-a "project=service
|
||||
user=ironic
|
||||
password={{ ironic_keystone_password }}
|
||||
role=admin
|
||||
region_name={{ openstack_region_name }}
|
||||
auth={{ '{{ openstack_ironic_auth }}' }}"
|
||||
-e "{'openstack_ironic_auth':{{ openstack_ironic_auth }}}"
|
||||
register: ironic_user
|
||||
changed_when: "{{ ironic_user.stdout.find('localhost | SUCCESS => ') != -1 and (ironic_user.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
|
||||
until: ironic_user.stdout.split()[2] == 'SUCCESS'
|
||||
retries: 10
|
||||
delay: 5
|
||||
run_once: True
|
77
ansible/roles/ironic/tasks/start.yml
Normal file
77
ansible/roles/ironic/tasks/start.yml
Normal file
@ -0,0 +1,77 @@
|
||||
---
|
||||
- name: Starting Ironic-api container
|
||||
docker:
|
||||
docker_api_version: "{{ docker_api_version }}"
|
||||
net: host
|
||||
pull: "{{ docker_pull_policy }}"
|
||||
restart_policy: "{{ docker_restart_policy }}"
|
||||
restart_policy_retry: "{{ docker_restart_policy_retry }}"
|
||||
state: reloaded
|
||||
registry: "{{ docker_registry }}"
|
||||
username: "{{ docker_registry_username }}"
|
||||
password: "{{ docker_registry_password }}"
|
||||
insecure_registry: "{{ docker_insecure_registry }}"
|
||||
name: ironic-api
|
||||
image: "{{ ironic_api_image_full }}"
|
||||
volumes: "{{ node_config_directory }}/ironic-api/:/opt/kolla/config_files/:ro"
|
||||
env:
|
||||
KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
|
||||
when: inventory_hostname in groups['ironic-api']
|
||||
|
||||
- name: Starting Ironic-conductor container
|
||||
docker:
|
||||
docker_api_version: "{{ docker_api_version }}"
|
||||
net: host
|
||||
pull: "{{ docker_pull_policy }}"
|
||||
restart_policy: "{{ docker_restart_policy }}"
|
||||
restart_policy_retry: "{{ docker_restart_policy_retry }}"
|
||||
state: reloaded
|
||||
registry: "{{ docker_registry }}"
|
||||
username: "{{ docker_registry_username }}"
|
||||
password: "{{ docker_registry_password }}"
|
||||
insecure_registry: "{{ docker_insecure_registry }}"
|
||||
name: ironic-conductor
|
||||
image: "{{ ironic_conductor_image_full }}"
|
||||
volumes: "{{ node_config_directory }}/ironic-conductor/:/opt/kolla/config_files/:ro"
|
||||
env:
|
||||
KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
|
||||
when: inventory_hostname in groups['ironic-conductor']
|
||||
|
||||
- name: Starting Ironic-discoverd container
|
||||
docker:
|
||||
docker_api_version: "{{ docker_api_version }}"
|
||||
net: host
|
||||
pull: "{{ docker_pull_policy }}"
|
||||
restart_policy: "{{ docker_restart_policy }}"
|
||||
restart_policy_retry: "{{ docker_restart_policy_retry }}"
|
||||
state: reloaded
|
||||
registry: "{{ docker_registry }}"
|
||||
username: "{{ docker_registry_username }}"
|
||||
password: "{{ docker_registry_password }}"
|
||||
insecure_registry: "{{ docker_insecure_registry }}"
|
||||
privileged: True
|
||||
name: ironic-discoverd
|
||||
image: "{{ ironic_discoverd_image_full }}"
|
||||
volumes: "{{ node_config_directory }}/ironic-discoverd/:/opt/kolla/config_files/:ro"
|
||||
env:
|
||||
KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
|
||||
when: inventory_hostname in groups['ironic-discoverd']
|
||||
|
||||
- name: Starting Ironic-pxe container
|
||||
docker:
|
||||
docker_api_version: "{{ docker_api_version }}"
|
||||
net: host
|
||||
pull: "{{ docker_pull_policy }}"
|
||||
restart_policy: "{{ docker_restart_policy }}"
|
||||
restart_policy_retry: "{{ docker_restart_policy_retry }}"
|
||||
state: reloaded
|
||||
registry: "{{ docker_registry }}"
|
||||
username: "{{ docker_registry_username }}"
|
||||
password: "{{ docker_registry_password }}"
|
||||
insecure_registry: "{{ docker_insecure_registry }}"
|
||||
name: ironic-pxe
|
||||
image: "{{ ironic_pxe_image_full }}"
|
||||
volumes: "{{ node_config_directory }}/ironic-pxe/:/opt/kolla/config_files/:ro"
|
||||
env:
|
||||
KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
|
||||
when: inventory_hostname in groups['ironic-pxe']
|
11
ansible/roles/ironic/templates/discoverd.conf.j2
Normal file
11
ansible/roles/ironic/templates/discoverd.conf.j2
Normal file
@ -0,0 +1,11 @@
|
||||
[discoverd]
|
||||
database = inspector.sqlite3
|
||||
os_auth_url = http://{{ kolla_internal_address }}:{{ keystone_public_port }}/v2.0
|
||||
os_username = {{ openstack_auth.username }}
|
||||
os_password = {{ openstack_auth.password }}
|
||||
os_tenant_name = {{ openstack_auth.project_name }}
|
||||
identity_uri = {{ openstack_auth.auth_url }}
|
||||
|
||||
# Note: this will be in the firewall section once upgraded to inspector
|
||||
# unsure of the correct interface here
|
||||
dnsmasq_interface = {{ api_interface }}
|
11
ansible/roles/ironic/templates/ironic-api.json.j2
Normal file
11
ansible/roles/ironic/templates/ironic-api.json.j2
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"command": "/usr/bin/ironic-api",
|
||||
"config_files": [
|
||||
{
|
||||
"source": "/opt/kolla/config_files/ironic.conf",
|
||||
"dest": "/etc/ironic/ironic.conf",
|
||||
"owner": "ironic",
|
||||
"perm": "0600"
|
||||
}
|
||||
]
|
||||
}
|
11
ansible/roles/ironic/templates/ironic-conductor.json.j2
Normal file
11
ansible/roles/ironic/templates/ironic-conductor.json.j2
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"command": "/usr/bin/ironic-conductor",
|
||||
"config_files": [
|
||||
{
|
||||
"source": "/opt/kolla/config_files/ironic.conf",
|
||||
"dest": "/etc/ironic/ironic.conf",
|
||||
"owner": "ironic",
|
||||
"perm": "0600"
|
||||
}
|
||||
]
|
||||
}
|
11
ansible/roles/ironic/templates/ironic-discoverd.json.j2
Normal file
11
ansible/roles/ironic/templates/ironic-discoverd.json.j2
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"command": "/usr/bin/ironic-discoverd --config-file /etc/ironic-discoverd/discoverd.conf",
|
||||
"config_files": [
|
||||
{
|
||||
"source": "/opt/kolla/config_files/discoverd.conf",
|
||||
"dest": "/etc/ironic-discoverd/discoverd.conf",
|
||||
"owner": "root",
|
||||
"perm": "0600"
|
||||
}
|
||||
]
|
||||
}
|
4
ansible/roles/ironic/templates/ironic-pxe.json.j2
Normal file
4
ansible/roles/ironic/templates/ironic-pxe.json.j2
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"command": "/usr/sbin/in.tftpd --verbose --foreground --user root --address 0.0.0.0:69 --map-file /tftpboot/map-file /tftpboot",
|
||||
"config_files": []
|
||||
}
|
30
ansible/roles/ironic/templates/ironic.conf.j2
Normal file
30
ansible/roles/ironic/templates/ironic.conf.j2
Normal file
@ -0,0 +1,30 @@
|
||||
[DEFAULT]
|
||||
debug = {{ ironic_logging_debug }}
|
||||
verbose = {{ ironic_logging_verbose }}
|
||||
|
||||
admin_token = {{ keystone_admin_token }}
|
||||
|
||||
[database]
|
||||
connection = mysql://{{ ironic_database_user }}:{{ ironic_database_password }}@{{ ironic_database_address }}/{{ ironic_database_name }}
|
||||
|
||||
[keystone_authtoken]
|
||||
auth_uri = http://{{ kolla_internal_address }}:{{ keystone_public_port }}
|
||||
auth_url = http://{{ kolla_internal_address }}:{{ keystone_admin_port }}
|
||||
auth_plugin = password
|
||||
project_domain_id = default
|
||||
user_domain_id = default
|
||||
project_name = service
|
||||
username = {{ ironic_keystone_user }}
|
||||
password = {{ ironic_keystone_password }}
|
||||
|
||||
[glance]
|
||||
glance_host = {{ kolla_internal_address }}
|
||||
|
||||
[neutron]
|
||||
url = http://{{ kolla_internal_address }}:{{ neutron_server_port }}
|
||||
|
||||
[oslo_messaging_rabbit]
|
||||
rabbit_host = {{ kolla_internal_address }}
|
||||
rabbit_userid = {{ rabbitmq_user }}
|
||||
rabbit_password = {{ rabbitmq_password }}
|
||||
rabbit_ha_queues = true
|
4
ansible/roles/neutron/tasks/ironic-check.yml
Normal file
4
ansible/roles/neutron/tasks/ironic-check.yml
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
# TODO(SamYaple): run verification checks at start of playbook
|
||||
- fail: msg="neutron_plugin_agent must use openvswitch with Ironic"
|
||||
when: enable_ironic | bool and neutron_plugin_agent != "openvswitch"
|
@ -1,4 +1,7 @@
|
||||
---
|
||||
# enforce ironic usage only with openvswtich
|
||||
- include: ironic-check.yml
|
||||
|
||||
- include: register.yml
|
||||
|
||||
- include: config.yml
|
||||
|
@ -1,8 +1,14 @@
|
||||
# ml2_conf.ini
|
||||
[ml2]
|
||||
{% if enable_ironic | bool %}
|
||||
type_drivers = flat
|
||||
tenant_network_types = flat
|
||||
mechanism_drivers = openvswitch
|
||||
{% else %}
|
||||
# Changing type_drivers after bootstrap can lead to database inconsistencies
|
||||
type_drivers = flat,vlan,vxlan
|
||||
tenant_network_types = vxlan
|
||||
{% endif %}
|
||||
|
||||
{% if neutron_plugin_agent == "openvswitch" %}
|
||||
mechanism_drivers = openvswitch,l2population
|
||||
@ -11,7 +17,11 @@ mechanism_drivers = linuxbridge,l2population
|
||||
{% endif %}
|
||||
|
||||
[ml2_type_vlan]
|
||||
{% if enable_ironic | bool %}
|
||||
network_vlan_ranges = physnet1
|
||||
{% else %}
|
||||
network_vlan_ranges =
|
||||
{% endif %}
|
||||
|
||||
[ml2_type_flat]
|
||||
flat_networks = physnet1
|
||||
|
@ -30,7 +30,6 @@ linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver
|
||||
linuxnet_interface_driver = nova.network.linux_net.BridgeInterfaceDriver
|
||||
{% endif %}
|
||||
|
||||
compute_driver = libvirt.LibvirtDriver
|
||||
allow_resize_to_same_host = true
|
||||
|
||||
# Though my_ip is not used directly, lots of other variables use $my_ip
|
||||
@ -46,6 +45,27 @@ novncproxy_port = {{ nova_novncproxy_port }}
|
||||
novncproxy_base_url = http://{{ kolla_internal_address }}:{{ nova_novncproxy_port }}/vnc_auto.html
|
||||
{% endif %}
|
||||
|
||||
{% if enable_ironic | bool %}
|
||||
compute_driver = nova.virt.ironic.IronicDriver
|
||||
scheduler_host_manager = nova.scheduler.ironic_host_manager.IronicHostManager
|
||||
ram_allocation_ratio = 1.0
|
||||
reserved_host_memory_mb = 0
|
||||
compute_manager = ironic.nova.compute.manager.ClusteredComputeManager
|
||||
scheduler_use_baremetal_filters = True
|
||||
{% else %}
|
||||
compute_driver = libvirt.LibvirtDriver
|
||||
{% endif %}
|
||||
|
||||
{% if enable_ironic == 'yes' %}
|
||||
[ironic]
|
||||
#(TODO) remember to update this once discoverd is replaced by inspector
|
||||
admin_username = {{ ironic_keystone_user }}
|
||||
admin_password = {{ ironic_keystone_password }}
|
||||
admin_url = {{ openstack_auth.auth_url }}
|
||||
admin_tenant_name = {{ openstack_auth.project_name }}
|
||||
api_endpoint = http://{{ kolla_internal_address }}:{{ ironic_api_port }}/v1
|
||||
{% endif %}
|
||||
|
||||
[oslo_messaging_rabbit]
|
||||
rabbit_host = {{ kolla_internal_address }}
|
||||
rabbit_userid = {{ rabbitmq_user }}
|
||||
|
@ -51,3 +51,7 @@
|
||||
- hosts: [murano-api, murano-engine]
|
||||
roles:
|
||||
- { role: murano, tags: murano, when: enable_murano | bool }
|
||||
|
||||
- hosts: [ironic-api, ironic-conductor, ironic-discoverd, ironic-pxe]
|
||||
roles:
|
||||
- {role: ironic, tags: ironic, when: enable_ironic | bool }
|
||||
|
42
doc/ironic-guide.rst
Normal file
42
doc/ironic-guide.rst
Normal file
@ -0,0 +1,42 @@
|
||||
Ironic in Kolla
|
||||
===============
|
||||
|
||||
Overview
|
||||
--------
|
||||
Currently Kolla can deploy the Ironic services:
|
||||
|
||||
- ironic-api
|
||||
- ironic-conductor
|
||||
- ironic-discoverd
|
||||
|
||||
As well as a required PXE service, deployed as ironic-pxe.
|
||||
|
||||
Current status
|
||||
--------------
|
||||
The Ironic implementation is "tech preview", so currently instances can only be
|
||||
deployed on baremetal. Further work will be done to allow scheduling for both
|
||||
virtualized and baremetal deployments. Most probably at that time discoverd
|
||||
will be replaced by ironic-inspector.
|
||||
|
||||
Post-deployment configuration
|
||||
-----------------------------
|
||||
Configuration based off upstream documentation_.
|
||||
|
||||
Again, remember that enabling Ironic reconfigures nova compute (driver and
|
||||
scheduler) as well as changes neutron network settings. Further neutron setup
|
||||
is required as outlined below.
|
||||
|
||||
Create the flat network to launch the instances:
|
||||
::
|
||||
|
||||
neutron net-create --tenant-id $TENANT_ID sharednet1 --shared \
|
||||
--provider:network_type flat --provider:physical_network physnet1
|
||||
|
||||
neutron subnet-create sharednet1 $NETWORK_CIDR --name $SUBNET_NAME \
|
||||
--ip-version=4 --gateway=$GATEWAY_IP --allocation-pool \
|
||||
start=$START_IP,end=$END_IP --enable-dhcp
|
||||
|
||||
And then the above ID is used to set cleaning_network_uuid in the neutron
|
||||
section of ironic.conf.
|
||||
|
||||
.. _documentation: http://docs.openstack.org/developer/ironic/deploy/install-guide.html
|
@ -4,15 +4,16 @@ MAINTAINER Kolla Project (https://launchpad.net/kolla)
|
||||
{% if install_type == 'binary' %}
|
||||
{% if base_distro in ['centos', 'fedora', 'oraclelinux', 'rhel'] %}
|
||||
|
||||
RUN yum -y install \
|
||||
openstack-ironic-api \
|
||||
# Install delorean version even though version number is less
|
||||
# http://lists.openstack.org/pipermail/openstack-dev/2015-August/073100.html
|
||||
RUN VER_TO_GET=$(yum --showduplicates list openstack-ironic-api | awk '/delorean/ {print $2}') \
|
||||
&& yum -y install openstack-ironic-api-$VER_TO_GET \
|
||||
&& yum clean all
|
||||
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
COPY start.sh /
|
||||
COPY config-external.sh /opt/kolla/
|
||||
|
||||
CMD ["/start.sh"]
|
||||
|
||||
|
@ -1,10 +1,13 @@
|
||||
#!/bin/bash
|
||||
set -o errexit
|
||||
|
||||
CMD="/usr/bin/ironic-api"
|
||||
ARGS=""
|
||||
|
||||
source /opt/kolla/kolla-common.sh
|
||||
set_configs
|
||||
|
||||
exec $CMD $ARGS
|
||||
# Bootstrap and exit if KOLLA_BOOTSTRAP variable is set. This catches all cases
|
||||
# of the KOLLA_BOOTSTRAP variable being set, including empty.
|
||||
if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
|
||||
su -s /bin/sh -c "ironic-dbsync upgrade" ironic
|
||||
exit 0
|
||||
fi
|
||||
|
||||
exec $CMD
|
||||
|
@ -10,6 +10,7 @@ RUN yum -y install \
|
||||
python-oslo-log \
|
||||
python-oslo-concurrency \
|
||||
python-oslo-policy \
|
||||
python-oslo-versionedobjects \
|
||||
&& yum clean all
|
||||
|
||||
{% endif %}
|
||||
|
@ -4,15 +4,16 @@ MAINTAINER Kolla Project (https://launchpad.net/kolla)
|
||||
{% if install_type == 'binary' %}
|
||||
{% if base_distro in ['centos', 'fedora', 'oraclelinux', 'rhel'] %}
|
||||
|
||||
RUN yum -y install \
|
||||
openstack-ironic-conductor \
|
||||
# Install delorean version even though version number is less
|
||||
# http://lists.openstack.org/pipermail/openstack-dev/2015-August/073100.html
|
||||
RUN VER_TO_GET=$(yum --showduplicates list openstack-ironic-conductor | awk '/delorean/ {print $2}') \
|
||||
&& yum -y install openstack-ironic-conductor-$VER_TO_GET \
|
||||
&& yum clean all
|
||||
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
COPY start.sh /
|
||||
COPY config-external.sh /opt/kolla/
|
||||
|
||||
CMD ["/start.sh"]
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
SOURCE="/opt/kolla/ironic-api/ironic.conf"
|
||||
TARGET="/etc/ironic/ironic.conf"
|
||||
OWNER="ironic"
|
||||
|
||||
if [[ -f "$SOURCE" ]]; then
|
||||
cp $SOURCE $TARGET
|
||||
chown ${OWNER}: $TARGET
|
||||
chmod 0644 $TARGET
|
||||
fi
|
@ -1,10 +1,6 @@
|
||||
#!/bin/bash
|
||||
set -o errexit
|
||||
|
||||
CMD="/usr/bin/ironic-conductor"
|
||||
ARGS=""
|
||||
|
||||
source /opt/kolla/kolla-common.sh
|
||||
set_configs
|
||||
|
||||
exec $CMD $ARGS
|
||||
exec $CMD
|
||||
|
@ -4,15 +4,22 @@ MAINTAINER Kolla Project (https://launchpad.net/kolla)
|
||||
{% if install_type == 'binary' %}
|
||||
{% if base_distro in ['centos', 'fedora', 'oraclelinux', 'rhel'] %}
|
||||
|
||||
RUN yum -y install \
|
||||
openstack-ironic-discoverd \
|
||||
&& yum clean all
|
||||
RUN pip install ironic-discoverd
|
||||
# discoverd no longer in delorean 9/28/2015, switch to inspector on TODO
|
||||
#RUN yum -y install \
|
||||
# openstack-ironic-discoverd \
|
||||
# && yum clean all
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% elif install_type == 'source' %}
|
||||
|
||||
RUN echo '{{ install_type }} not yet available for {{ base_distro }}' \
|
||||
&& /bin/false
|
||||
|
||||
{% endif %}
|
||||
|
||||
COPY start.sh /
|
||||
COPY config-external.sh /opt/kolla/
|
||||
|
||||
CMD ["/start.sh"]
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
SOURCE="/opt/kolla/ironic-discoverd/discoverd.conf"
|
||||
TARGET="/etc/ironic-discoverd/discoverd.conf"
|
||||
OWNER="ironic"
|
||||
|
||||
if [[ -f "$SOURCE" ]]; then
|
||||
cp $SOURCE $TARGET
|
||||
chown ${OWNER}: $TARGET
|
||||
chmod 0644 $TARGET
|
||||
fi
|
@ -1,10 +1,6 @@
|
||||
#!/bin/bash
|
||||
set -o errexit
|
||||
|
||||
CMD="/usr/bin/ironic-discoverd"
|
||||
ARGS=""
|
||||
|
||||
source /opt/kolla/kolla-common.sh
|
||||
set_configs
|
||||
|
||||
exec $CMD $ARGS
|
||||
exec $CMD
|
||||
|
35
docker/ironic/ironic-pxe/Dockerfile.j2
Normal file
35
docker/ironic/ironic-pxe/Dockerfile.j2
Normal file
@ -0,0 +1,35 @@
|
||||
FROM {{ namespace }}/{{ base_distro }}-{{ install_type }}-base:{{ tag }}
|
||||
MAINTAINER Kolla Project (https://launchpad.net/kolla)
|
||||
|
||||
{% if install_type == 'binary' %}
|
||||
{% if base_distro in ['centos', 'fedora', 'oraclelinux', 'rhel'] %}
|
||||
|
||||
RUN yum -y install tftp-server syslinux-tftpboot \
|
||||
&& yum clean all
|
||||
|
||||
# PXE configuration
|
||||
RUN mkdir -p /tftpboot \
|
||||
&& cp /var/lib/tftpboot/chain.c32 /tftpboot \
|
||||
&& echo 're ^(/tftpboot/) /tftpboot/\2' > /tftpboot/map-file \
|
||||
&& echo 're ^/tftpboot/ /tftpboot/' >> /tftpboot/map-file \
|
||||
&& echo 're ^(^/) /tftpboot/\1' >> /tftpboot/map-file \
|
||||
&& echo 're ^([^/]) /tftpboot/\1' >> /tftpboot/map-file
|
||||
|
||||
{% elif base_distro in ['ubuntu', 'debian'] %}
|
||||
RUN echo '{{ install_type }} not yet available for {{ base_distro }}' \
|
||||
&& /bin/false
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% elif install_type == 'source' %}
|
||||
|
||||
RUN echo '{{ install_type }} not yet available for {{ base_distro }}' \
|
||||
&& /bin/false
|
||||
|
||||
{% endif %}
|
||||
|
||||
COPY start.sh /
|
||||
|
||||
CMD ["/start.sh"]
|
||||
|
||||
{{ include_footer }}
|
6
docker/ironic/ironic-pxe/start.sh
Executable file
6
docker/ironic/ironic-pxe/start.sh
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
set -o errexit
|
||||
|
||||
source /opt/kolla/kolla-common.sh
|
||||
|
||||
exec $CMD
|
0
etc/kolla/config/discoverd.conf
Normal file
0
etc/kolla/config/discoverd.conf
Normal file
0
etc/kolla/config/ironic.conf
Normal file
0
etc/kolla/config/ironic.conf
Normal file
0
etc/kolla/config/ironic/discoverd.conf
Normal file
0
etc/kolla/config/ironic/discoverd.conf
Normal file
0
etc/kolla/config/ironic/ironic-api.conf
Normal file
0
etc/kolla/config/ironic/ironic-api.conf
Normal file
0
etc/kolla/config/ironic/ironic-conductor.conf
Normal file
0
etc/kolla/config/ironic/ironic-conductor.conf
Normal file
@ -53,6 +53,9 @@ heat_domain_admin_password: "password"
|
||||
murano_database_password: "password"
|
||||
murano_keystone_password: "password"
|
||||
|
||||
ironic_database_password: "password"
|
||||
ironic_keystone_password: "password"
|
||||
|
||||
|
||||
####################
|
||||
# RabbitMQ options
|
||||
|
@ -39,7 +39,9 @@ class BuildTest(base.BaseTestCase):
|
||||
|
||||
# these are images that are known to not build properly
|
||||
excluded_images = ["gnocchi-base",
|
||||
"murano-base"]
|
||||
"murano-base",
|
||||
"ironic-pxe",
|
||||
"ironic-discoverd"]
|
||||
|
||||
failures = 0
|
||||
for image, result in bad_results.iteritems():
|
||||
|
Loading…
Reference in New Issue
Block a user