External Ceph support - Implementation Glance

Most simple implementation of external ceph support.

We use INI merge to configure RBD backend for Glance and copy
ceph.conf and keyring provided by the user into the container.

Set_configs.py had to be extended to support globbing (wildcards) in
order to copy ceph keyring file which is named depending on the cephx
user name.

Partially-Implements Blueprint: external-ceph
Partially-Implements Blueprint: selectable-ceph

Change-Id: Iacadbd8ec9956e9f075206ea03b28f044cb6ffb8
This commit is contained in:
Mathias Ewald 2016-07-13 10:00:27 +00:00
parent 27f1cad74f
commit f16a45180c
7 changed files with 48 additions and 26 deletions

View File

@ -219,6 +219,9 @@ nova_keystone_user: "nova"
enable_nova_fake: "no" enable_nova_fake: "no"
num_nova_fake_per_node: 5 num_nova_fake_per_node: 5
# Control usage of ceph per service
glance_enable_ceph: "{{ enable_ceph }}"
#################### ####################
# RabbitMQ options # RabbitMQ options
#################### ####################

View File

@ -1,10 +1,16 @@
--- ---
- include: ceph.yml - include: ceph.yml
when: when:
- enable_ceph | bool - (enable_ceph | bool) and (glance_enable_ceph | bool)
- inventory_hostname in groups['ceph-mon'] or - inventory_hostname in groups['ceph-mon'] or
inventory_hostname in groups['glance-api'] or inventory_hostname in groups['glance-api'] or
inventory_hostname in groups['glance-registry'] inventory_hostname in groups['glance-registry']
- include: external_ceph.yml
when:
- (enable_ceph | bool == False) and (glance_enable_ceph | bool)
- inventory_hostname in groups['glance-api'] or
inventory_hostname in groups['glance-registry']
- include: register.yml - include: register.yml
when: inventory_hostname in groups['glance-api'] when: inventory_hostname in groups['glance-api']

View File

@ -0,0 +1,13 @@
---
- name: Ensuring config directory exists
file:
path: "{{ node_config_directory }}/glance-api"
state: "directory"
when: inventory_hostname in groups['glance-api']
- name: Copy over ceph files
copy:
src: "{{ item }}"
dest: "{{ node_config_directory }}/glance-api/"
with_fileglob:
- "{{ node_custom_config }}/glance/ceph*"

View File

@ -39,7 +39,7 @@ memcached_servers = {% for host in groups['memcached'] %}{{ hostvars[host]['ansi
flavor = keystone flavor = keystone
[glance_store] [glance_store]
{% if enable_ceph | bool %} {% if enable_ceph | bool and glance_enable_ceph | bool %}
default_store = rbd default_store = rbd
stores = rbd stores = rbd
rbd_store_user = glance rbd_store_user = glance

View File

@ -6,18 +6,13 @@
"dest": "/etc/glance/glance-api.conf", "dest": "/etc/glance/glance-api.conf",
"owner": "glance", "owner": "glance",
"perm": "0600" "perm": "0600"
}{% if enable_ceph | bool %}, }{% if glance_enable_ceph | bool %},
{ {
"source": "{{ container_config_directory }}/ceph.client.glance.keyring", "source": "{{ container_config_directory }}/ceph.*",
"dest": "/etc/ceph/ceph.client.glance.keyring", "dest": "/etc/ceph/",
"owner": "glance", "owner": "glance",
"perm": "0600" "perm": "0700"
}, }
{ {% endif %}
"source": "{{ container_config_directory }}/ceph.conf",
"dest": "/etc/ceph/ceph.conf",
"owner": "glance",
"perm": "0600"
}{% endif %}
] ]
} }

View File

@ -13,6 +13,7 @@
# limitations under the License. # limitations under the License.
import argparse import argparse
import glob
import json import json
import logging import logging
import os import os
@ -45,15 +46,15 @@ def validate_config(config):
def validate_source(data): def validate_source(data):
source = data.get('source') source = data.get('source')
exists = os.path.exists(source) # Only check existance if no wildcard found
if '*' not in source:
if not exists: if not os.path.exists(source):
if data.get('optional'): if data.get('optional'):
LOG.info("%s does not exist, but is not required", source) LOG.info("%s does not exist, but is not required", source)
return False return False
else: else:
LOG.error("The source to copy does not exist: %s", source) LOG.error("The source to copy does not exist: %s", source)
sys.exit(1) sys.exit(1)
return True return True
@ -82,8 +83,9 @@ def copy_files(data):
if source != source_path: if source != source_path:
# Source is file # Source is file
LOG.info("Copying %s to %s", source, dest) for file in glob.glob(source):
shutil.copy(source, dest) LOG.info("Copying %s to %s", file, dest)
shutil.copy(file, dest)
else: else:
# Source is a directory # Source is a directory
for src in os.listdir(source_path): for src in os.listdir(source_path):

View File

@ -125,6 +125,9 @@ neutron_external_interface: "eth1"
#enable_neutron_qos: "no" #enable_neutron_qos: "no"
#enable_swift: "no" #enable_swift: "no"
# Control usage of ceph per service. This allows to configure external ceph
# when ceph is not deployed by Kolla.
#glance_enable_ceph: "{{ enable_ceph }}"
################### ###################
# Ceph options # Ceph options