Merge "Update ironic.conf for swift and keystone compat"
This commit is contained in:
commit
7e7962ae1f
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
# Verbosity Options
|
# Verbosity Options
|
||||||
debug: False
|
debug: False
|
||||||
verbose: True
|
|
||||||
|
|
||||||
# These variables are used in 'developer mode' in order to allow the role
|
# These variables are used in 'developer mode' in order to allow the role
|
||||||
# to build an environment directly from a git source without the presence
|
# to build an environment directly from a git source without the presence
|
||||||
@ -73,19 +72,35 @@ ironic_service_project_name: "service"
|
|||||||
ironic_service_project_domain_id: default
|
ironic_service_project_domain_id: default
|
||||||
ironic_service_user_domain_id: default
|
ironic_service_user_domain_id: default
|
||||||
ironic_service_role_name: "admin"
|
ironic_service_role_name: "admin"
|
||||||
|
|
||||||
ironic_service_in_ldap: False
|
ironic_service_in_ldap: False
|
||||||
|
|
||||||
|
# Ironic image store information
|
||||||
|
ironic_swift_image_container: glance_images
|
||||||
|
ironic_swift_api_version: v1
|
||||||
|
# The ironic swift auth account and swift endpoints will be generated using the
|
||||||
|
# known swift data as provided by swift stat. If you wish to set either of these
|
||||||
|
# items to something else define these variables.
|
||||||
|
# ironic_swift_auth_account: AUTH_1234567890
|
||||||
|
# ironic_swift_endpoint: https://localhost:8080
|
||||||
|
|
||||||
# Is this Ironic installation working standalone?
|
# Is this Ironic installation working standalone?
|
||||||
# If you're wanting Ironic to work without being integrated to other OpenStack
|
# If you're wanting Ironic to work without being integrated to other OpenStack
|
||||||
# services, set this to True, and update the dhcp configuration appropriately
|
# services, set this to True, and update the dhcp configuration appropriately
|
||||||
ironic_standalone: False
|
ironic_standalone: False
|
||||||
|
|
||||||
|
# Enables or disables automated cleaning. Automated cleaning
|
||||||
|
# is a configurable set of steps, such as erasing disk drives,
|
||||||
|
# that are performed on the node to ensure it is in a baseline
|
||||||
|
# state and ready to be deployed to.
|
||||||
|
ironic_automated_clean: false
|
||||||
|
|
||||||
# Database
|
# Database
|
||||||
ironic_galera_user: ironic
|
ironic_galera_user: ironic
|
||||||
ironic_galera_database: ironic
|
ironic_galera_database: ironic
|
||||||
|
|
||||||
|
## Keystone authentication middleware
|
||||||
|
ironic_keystone_auth_plugin: password
|
||||||
|
|
||||||
# Integrated Openstack configuration
|
# Integrated Openstack configuration
|
||||||
ironic_openstack_driver_list: agent_ipmitool
|
ironic_openstack_driver_list: agent_ipmitool
|
||||||
ironic_openstack_auth_strategy: keystone
|
ironic_openstack_auth_strategy: keystone
|
||||||
@ -102,6 +117,11 @@ ironic_standalone_dhcp_provider: none
|
|||||||
ironic_standalone_sync_power_state_interval: -1
|
ironic_standalone_sync_power_state_interval: -1
|
||||||
ironic_standalone_db_connection_string: "mysql+pymysql://{{ ironic_galera_user }}:{{ ironic_galera_password }}@{{ ironic_galera_address }}/ironic"
|
ironic_standalone_db_connection_string: "mysql+pymysql://{{ ironic_galera_user }}:{{ ironic_galera_password }}@{{ ironic_galera_address }}/ironic"
|
||||||
|
|
||||||
|
# Ironic db tuning
|
||||||
|
ironic_db_max_overflow: 10
|
||||||
|
ironic_db_max_pool_size: 120
|
||||||
|
ironic_db_pool_timeout: 30
|
||||||
|
|
||||||
# Common configuration
|
# Common configuration
|
||||||
ironic_node_name: ironic
|
ironic_node_name: ironic
|
||||||
|
|
||||||
@ -114,6 +134,8 @@ ironic_bin: "{{ ironic_venv_bin }}"
|
|||||||
|
|
||||||
ironic_venv_download_url: http://127.0.0.1/venvs/untagged/ubuntu/ironic.tgz
|
ironic_venv_download_url: http://127.0.0.1/venvs/untagged/ubuntu/ironic.tgz
|
||||||
|
|
||||||
|
ironic_tftp_server_address: "{{ ansible_ssh_host }}"
|
||||||
|
|
||||||
ironic_requires_pip_packages:
|
ironic_requires_pip_packages:
|
||||||
- virtualenv
|
- virtualenv
|
||||||
- virtualenv-tools
|
- virtualenv-tools
|
||||||
@ -124,6 +146,7 @@ ironic_pip_packages:
|
|||||||
- PyMySQL
|
- PyMySQL
|
||||||
- ironic
|
- ironic
|
||||||
- python-ironicclient
|
- python-ironicclient
|
||||||
|
- python-swiftclient
|
||||||
|
|
||||||
ironic_api_apt_packages:
|
ironic_api_apt_packages:
|
||||||
- apache2
|
- apache2
|
||||||
@ -164,7 +187,6 @@ ironic_wsgi_processes: "{{ (_ironic_wsgi_processes | int > 1) | ternary(_ironic_
|
|||||||
ironic_glance_auth_strategy: "{{ ironic_openstack_auth_strategy }}"
|
ironic_glance_auth_strategy: "{{ ironic_openstack_auth_strategy }}"
|
||||||
|
|
||||||
# Neutron
|
# Neutron
|
||||||
# neutron_service_adminurl:
|
|
||||||
ironic_neutron_auth_strategy: "{{ ironic_openstack_auth_strategy }}"
|
ironic_neutron_auth_strategy: "{{ ironic_openstack_auth_strategy }}"
|
||||||
|
|
||||||
### Config Overrides
|
### Config Overrides
|
||||||
|
@ -21,7 +21,9 @@
|
|||||||
ironic_dhcp_provider: "{{ ironic_standalone_dhcp_provider }}"
|
ironic_dhcp_provider: "{{ ironic_standalone_dhcp_provider }}"
|
||||||
ironic_sync_power_state_interval: "{{ ironic_standalone_sync_power_state_interval }}"
|
ironic_sync_power_state_interval: "{{ ironic_standalone_sync_power_state_interval }}"
|
||||||
ironic_db_connection_string: "{{ ironic_standalone_db_connection_string }}"
|
ironic_db_connection_string: "{{ ironic_standalone_db_connection_string }}"
|
||||||
when: ironic_standalone
|
when: ironic_standalone | bool
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
- name: Setup ironic for integrated Openstack usage
|
- name: Setup ironic for integrated Openstack usage
|
||||||
set_fact:
|
set_fact:
|
||||||
@ -31,7 +33,9 @@
|
|||||||
ironic_dhcp_provider: "{{ ironic_openstack_dhcp_provider }}"
|
ironic_dhcp_provider: "{{ ironic_openstack_dhcp_provider }}"
|
||||||
ironic_sync_power_state_interval: "{{ ironic_openstack_sync_power_state_interval }}"
|
ironic_sync_power_state_interval: "{{ ironic_openstack_sync_power_state_interval }}"
|
||||||
ironic_db_connection_string: "{{ ironic_openstack_db_connection_string }}"
|
ironic_db_connection_string: "{{ ironic_openstack_db_connection_string }}"
|
||||||
when: not ironic_standalone
|
when: not ironic_standalone | bool
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
- name: Get ironic command path
|
- name: Get ironic command path
|
||||||
command: which ironic
|
command: which ironic
|
||||||
@ -49,6 +53,72 @@
|
|||||||
tags:
|
tags:
|
||||||
- ironic-command-bin
|
- ironic-command-bin
|
||||||
|
|
||||||
|
- name: Post swift tempURL secret key
|
||||||
|
shell: |
|
||||||
|
. ~/openrc
|
||||||
|
{{ ironic_bin }}/swift \
|
||||||
|
--os-username "service:{{ glance_service_user_name }}" \
|
||||||
|
--os-password {{ glance_service_password }} \
|
||||||
|
--os-auth-url {{ keystone_service_internalurl }} \
|
||||||
|
--os-identity-api-version {{ keystone_service_internalurl.split('/v')[-1] }} \
|
||||||
|
post -m temp-url-key:{{ ironic_swift_temp_url_secret_key }}
|
||||||
|
when:
|
||||||
|
- inventory_hostname == groups['ironic_all'][0]
|
||||||
|
- not ironic_standalone | bool
|
||||||
|
tags:
|
||||||
|
- ironic-swift-auth
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Get swift account
|
||||||
|
shell: |
|
||||||
|
. ~/openrc
|
||||||
|
{{ ironic_bin }}/swift \
|
||||||
|
--os-username "service:{{ glance_service_user_name }}" \
|
||||||
|
--os-password {{ glance_service_password }} \
|
||||||
|
--os-auth-url {{ keystone_service_internalurl }} \
|
||||||
|
--os-identity-api-version {{ keystone_service_internalurl.split('/v')[-1] }} \
|
||||||
|
stat -v | awk '/StorageURL\:/ {print $2}'
|
||||||
|
register: swift_storage_url
|
||||||
|
when:
|
||||||
|
- (ironic_swift_auth_account is undefined) or (ironic_swift_endpoint is undefined)
|
||||||
|
- not ironic_standalone | bool
|
||||||
|
tags:
|
||||||
|
- ironic-swift-auth
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Validate swift output
|
||||||
|
fail:
|
||||||
|
msg: |
|
||||||
|
No StorageURL output found using the `swift stat` command and either
|
||||||
|
the ``ironic_swift_auth_account`` or ``ironic_swift_auth_account``
|
||||||
|
variables are undefined. Ensure swift is functional and/or define
|
||||||
|
those variables.
|
||||||
|
when:
|
||||||
|
- (ironic_swift_auth_account is undefined) and (ironic_swift_endpoint is undefined)
|
||||||
|
- not ironic_standalone | bool
|
||||||
|
- not swift_storage_url.stdout
|
||||||
|
tags:
|
||||||
|
- ironic-swift-auth
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Set the swift auth facts
|
||||||
|
set_fact:
|
||||||
|
ironic_swift_auth_account: "{{ swift_storage_url.stdout.split('/v1/')[-1] }}"
|
||||||
|
when:
|
||||||
|
- ironic_swift_auth_account is undefined
|
||||||
|
- not ironic_standalone | bool
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Set the swift endpoint facts
|
||||||
|
set_fact:
|
||||||
|
ironic_swift_endpoint: "{{ swift_storage_url.stdout.split('/v1/')[0] }}"
|
||||||
|
when:
|
||||||
|
- ironic_swift_endpoint is undefined
|
||||||
|
- not ironic_standalone | bool
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
- name: Generate ironic config
|
- name: Generate ironic config
|
||||||
config_template:
|
config_template:
|
||||||
src: "{{ item.src }}"
|
src: "{{ item.src }}"
|
||||||
|
@ -66,6 +66,7 @@
|
|||||||
- { path: "{{ ironic_system_home_folder }}/.ssh", mode: "0700" }
|
- { path: "{{ ironic_system_home_folder }}/.ssh", mode: "0700" }
|
||||||
- { path: "{{ ironic_system_home_folder }}/images" }
|
- { path: "{{ ironic_system_home_folder }}/images" }
|
||||||
- { path: "{{ ironic_system_home_folder }}/master_images" }
|
- { path: "{{ ironic_system_home_folder }}/master_images" }
|
||||||
|
- { path: "{{ ironic_system_home_folder }}/cache/api", mode: "0700" }
|
||||||
- { path: "/var/lock/ironic" }
|
- { path: "/var/lock/ironic" }
|
||||||
- { path: "/var/run/ironic" }
|
- { path: "/var/run/ironic" }
|
||||||
- { path: "/var/www/cgi-bin", owner: root, group: root }
|
- { path: "/var/www/cgi-bin", owner: root, group: root }
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -7,14 +7,26 @@
|
|||||||
# needed by the functional test playbook below
|
# needed by the functional test playbook below
|
||||||
- name: Install httplib2 so we can use the uri module
|
- name: Install httplib2 so we can use the uri module
|
||||||
pip:
|
pip:
|
||||||
name: httplib2
|
name: "{{ item }}"
|
||||||
|
with_items:
|
||||||
|
- httplib2
|
||||||
|
- python-openstackclient
|
||||||
|
- name: Get auth token
|
||||||
|
shell: >
|
||||||
|
. /root/openrc && openstack token issue --format yaml | awk '/^id\:/ {print $2}'
|
||||||
|
register: get_keystone_token
|
||||||
|
- name: set token
|
||||||
|
set_fact:
|
||||||
|
keystone_token: "{{ get_keystone_token.stdout }}"
|
||||||
- name: Check the ironic-api
|
- name: Check the ironic-api
|
||||||
uri:
|
uri:
|
||||||
url: "{{ ironic_service_publicuri }}"
|
url: "{{ ironic_service_publicuri }}"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
status_code: 200
|
status_code: 200
|
||||||
- name: list chassis
|
- name: list chassis
|
||||||
uri:
|
uri:
|
||||||
url: "{{ ironic_service_publicuri }}/v1/chassis"
|
url: "{{ ironic_service_publicuri }}/v1/chassis"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
status_code: 200
|
status_code: 200
|
||||||
return_content: yes
|
return_content: yes
|
||||||
register: chassis_list
|
register: chassis_list
|
||||||
@ -22,6 +34,7 @@
|
|||||||
assert: that="chassis_list.json.chassis == []"
|
assert: that="chassis_list.json.chassis == []"
|
||||||
- name: list drivers
|
- name: list drivers
|
||||||
uri:
|
uri:
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
url: "{{ ironic_service_publicuri }}/v1/drivers"
|
url: "{{ ironic_service_publicuri }}/v1/drivers"
|
||||||
status_code: 200
|
status_code: 200
|
||||||
return_content: yes
|
return_content: yes
|
||||||
@ -31,6 +44,7 @@
|
|||||||
- name: list nodes
|
- name: list nodes
|
||||||
uri:
|
uri:
|
||||||
url: "{{ ironic_service_publicuri }}/v1/nodes"
|
url: "{{ ironic_service_publicuri }}/v1/nodes"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
status_code: 200
|
status_code: 200
|
||||||
return_content: yes
|
return_content: yes
|
||||||
register: node_list
|
register: node_list
|
||||||
@ -42,6 +56,7 @@
|
|||||||
method: POST
|
method: POST
|
||||||
HEADER_Content-Type: "application/json"
|
HEADER_Content-Type: "application/json"
|
||||||
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
body_format: json
|
body_format: json
|
||||||
body: "{\"name\": \"restnode\", \"driver\": \"agent_ipmitool\", \"driver_info\": {\"ipmi_address\": \"1.2.3.4\"}}"
|
body: "{\"name\": \"restnode\", \"driver\": \"agent_ipmitool\", \"driver_info\": {\"ipmi_address\": \"1.2.3.4\"}}"
|
||||||
status_code: 201
|
status_code: 201
|
||||||
@ -58,15 +73,17 @@
|
|||||||
method: POST
|
method: POST
|
||||||
HEADER_Content-Type: "application/json"
|
HEADER_Content-Type: "application/json"
|
||||||
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
body_format: json
|
body_format: json
|
||||||
body: " {\"node_uuid\": \"{{ node_response.json.uuid }}\", \"address\": \"00:00:00:00:00:01\"}"
|
body: " {\"node_uuid\": \"{{ node_response.json.uuid }}\", \"address\": \"00:00:00:00:00:01\"}"
|
||||||
status_code: 201
|
status_code: 201
|
||||||
return_content: yes
|
return_content: yes
|
||||||
- name: list ports
|
- name: list ports
|
||||||
uri:
|
uri:
|
||||||
|
url: "{{ ironic_service_publicuri }}/v1/ports"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
HEADER_Content-Type: "application/json"
|
HEADER_Content-Type: "application/json"
|
||||||
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
||||||
url: "{{ ironic_service_publicuri }}/v1/ports"
|
|
||||||
body: " {\"node\": \"{{ node_response.json.uuid }}\"}"
|
body: " {\"node\": \"{{ node_response.json.uuid }}\"}"
|
||||||
body_format: json
|
body_format: json
|
||||||
return_content: yes
|
return_content: yes
|
||||||
@ -82,15 +99,17 @@
|
|||||||
method: POST
|
method: POST
|
||||||
HEADER_Content-Type: "application/json"
|
HEADER_Content-Type: "application/json"
|
||||||
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
body_format: json
|
body_format: json
|
||||||
body: " {\"node_uuid\": \"{{ node_response.json.uuid }}\", \"address\": \"00:00:00:00:00:02\"}"
|
body: " {\"node_uuid\": \"{{ node_response.json.uuid }}\", \"address\": \"00:00:00:00:00:02\"}"
|
||||||
status_code: 201
|
status_code: 201
|
||||||
return_content: yes
|
return_content: yes
|
||||||
- name: list ports again
|
- name: list ports again
|
||||||
uri:
|
uri:
|
||||||
|
url: "{{ ironic_service_publicuri }}/v1/ports"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
HEADER_Content-Type: "application/json"
|
HEADER_Content-Type: "application/json"
|
||||||
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
||||||
url: "{{ ironic_service_publicuri }}/v1/ports"
|
|
||||||
body: " {\"node\": \"{{ node_response.json.uuid }}\"}"
|
body: " {\"node\": \"{{ node_response.json.uuid }}\"}"
|
||||||
body_format: json
|
body_format: json
|
||||||
return_content: yes
|
return_content: yes
|
||||||
@ -104,6 +123,7 @@
|
|||||||
url: "{{ ironic_service_publicuri }}/v1/nodes/restnode/validate"
|
url: "{{ ironic_service_publicuri }}/v1/nodes/restnode/validate"
|
||||||
method: GET
|
method: GET
|
||||||
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
status_code: 200
|
status_code: 200
|
||||||
return_content: yes
|
return_content: yes
|
||||||
register: validate_node
|
register: validate_node
|
||||||
@ -123,6 +143,7 @@
|
|||||||
- "validate_node.json.raid.result == true"
|
- "validate_node.json.raid.result == true"
|
||||||
- name: update a node
|
- name: update a node
|
||||||
uri:
|
uri:
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
url: "{{ ironic_service_publicuri }}/v1/nodes/restnode"
|
url: "{{ ironic_service_publicuri }}/v1/nodes/restnode"
|
||||||
body: " [{\"path\": \"/name\", \"value\": \"renamednode\", \"op\": \"replace\"}]"
|
body: " [{\"path\": \"/name\", \"value\": \"renamednode\", \"op\": \"replace\"}]"
|
||||||
method: PATCH
|
method: PATCH
|
||||||
@ -139,6 +160,7 @@
|
|||||||
method: DELETE
|
method: DELETE
|
||||||
HEADER_Content-Type: "application/json"
|
HEADER_Content-Type: "application/json"
|
||||||
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
HEADER_X-OpenStack-Ironic-API-Version: "1.9"
|
||||||
|
HEADER_X-Auth-Token: "{{ keystone_token }}"
|
||||||
status_code: 204
|
status_code: 204
|
||||||
return_content: yes
|
return_content: yes
|
||||||
vars_files:
|
vars_files:
|
||||||
|
@ -19,6 +19,7 @@ galera_root_user: root
|
|||||||
galera_root_password: "secrete"
|
galera_root_password: "secrete"
|
||||||
rabbitmq_servers: 10.100.100.101:5672
|
rabbitmq_servers: 10.100.100.101:5672
|
||||||
rabbitmq_use_ssl: False
|
rabbitmq_use_ssl: False
|
||||||
|
rabbitmq_port: 5672
|
||||||
memcached_servers: 127.0.0.1
|
memcached_servers: 127.0.0.1
|
||||||
memcached_encryption_key: "secrete"
|
memcached_encryption_key: "secrete"
|
||||||
keystone_venv_tag: "testing"
|
keystone_venv_tag: "testing"
|
||||||
@ -29,7 +30,7 @@ keystone_service_password: "secrete"
|
|||||||
keystone_galera_address: 10.100.100.101
|
keystone_galera_address: 10.100.100.101
|
||||||
keystone_galera_database: keystone
|
keystone_galera_database: keystone
|
||||||
keystone_galera_user: keystone
|
keystone_galera_user: keystone
|
||||||
keystone_container_mysql_password: "SuperSecrete"
|
keystone_container_mysql_password: "secrete"
|
||||||
keystone_auth_admin_token: "SuperSecreteTestToken"
|
keystone_auth_admin_token: "SuperSecreteTestToken"
|
||||||
keystone_admin_user_name: admin
|
keystone_admin_user_name: admin
|
||||||
keystone_admin_tenant_name: admin
|
keystone_admin_tenant_name: admin
|
||||||
@ -62,8 +63,20 @@ ironic_service_password: "secrete"
|
|||||||
ironic_galera_address: 10.100.100.101
|
ironic_galera_address: 10.100.100.101
|
||||||
ironic_galera_database: ironic
|
ironic_galera_database: ironic
|
||||||
ironic_galera_user: ironic
|
ironic_galera_user: ironic
|
||||||
ironic_galera_password: "SuperSecrete"
|
ironic_galera_password: "secrete"
|
||||||
ironic_rabbitmq_password: "secrete"
|
ironic_rabbitmq_password: "secrete"
|
||||||
ironic_rabbitmq_userid: ironic
|
ironic_rabbitmq_userid: ironic
|
||||||
ironic_rabbitmq_vhost: /ironic
|
ironic_rabbitmq_vhost: /ironic
|
||||||
ironic_standalone: True
|
ironic_standalone: True
|
||||||
|
ironic_swift_endpoint: "http://localhost:8080"
|
||||||
|
ironic_swift_auth_account: "AUTH_1234567890"
|
||||||
|
ironic_swift_temp_url_secret_key: secrete
|
||||||
|
ironic_rabbitmq_userid: ironic
|
||||||
|
ironic_rabbitmq_password: secrete
|
||||||
|
ironic_rabbitmq_vhost: /ironic
|
||||||
|
glance_api_servers: http://localhost:9292
|
||||||
|
neutron_service_adminurl: http://localhost:9696
|
||||||
|
neutron_service_region: RegionOne
|
||||||
|
neutron_service_password: secrete
|
||||||
|
neutron_service_project_name: ironic
|
||||||
|
neutron_service_user_name: ironic
|
||||||
|
Loading…
Reference in New Issue
Block a user