全コンポーネントを連携させることが目標。
- OpenStack/Essex Configuration 01:DB, Queue
- OpenStack/Essex Configuration 02:KeyStone
- OpenStack/Essex Configuration 03:Swift
- OpenStack/Essex Configuration 04:Glance
- OpenStack/Essex Configuration 05:Nova
- OpenStack/Essex Configuration 06:Horizon
OpenStack/Essex RPMs
- OpenStack/Essex RPM Nova/Horizon
- OpenStack/Essex RPM Swift/Keystone/Glance
パッケージの導入
[root@opst-gl ~]# yum install openstack-glance.noarch
[root@opst-gl ~]# yum install openstack-swift-client
[root@opst-gl ~]# yum install openstack-keystone
[root@opst-gl ~]# yum install MySQL-python
swift連携する場合、swift-clientが必要になる。
またkeystone連携のためにopenstack-keystone
glance-api.conf
[glance@opst-gl glance]$ cp glance-api.conf.sample glance-api.conf
[DEFAULT] # Show more verbose log output (sets INFO log level output) verbose = True # Show debugging output in logs (sets DEBUG log level output) debug = True # Which backend store should Glance use by default is not specified # in a request to add a new image to Glance? Default: 'file' # Available choices are 'file', 'swift', and 's3' #default_store = file default_store = swift # Address to bind the API server bind_host = 0.0.0.0 # Port the bind the API server to bind_port = 9292 # Log to this file. Make sure you do not set the same log # file for both the API and registry servers! log_file = /var/log/glance/api.log # Backlog requests when creating socket backlog = 4096 # Number of Glance API worker processes to start. # On machines with more than one CPU increasing this value # may improve performance (especially if using SSL with # compression turned on). It is typically recommended to set # this value to the number of CPUs present on your machine. workers = 0 # Role used to identify an authenticated user as administrator #admin_role = admin # ================= Syslog Options ============================ # Send logs to syslog (/dev/log) instead of to file specified # by `log_file` use_syslog = False # Facility to use. If unset defaults to LOG_USER. # syslog_log_facility = LOG_LOCAL0 # ================= SSL Options =============================== # Certificate file to use when starting API server securely # cert_file = /path/to/certfile # Private key file to use when starting API server securely # key_file = /path/to/keyfile # ================= Security Options ========================== # AES key for encrypting store 'location' metadata, including # -- if used -- Swift or S3 credentials # Should be set to a random string of length 16, 24 or 32 bytes # metadata_encryption_key = <16, 24 or 32 char registry metadata key> # ============ Registry Options =============================== # Address to find the registry server registry_host = 0.0.0.0 #registry_host = 192.168.128.120 # Port the registry server is listening on registry_port = 9191 # What protocol to use when connecting to the registry server? # Set to https for secure HTTP communication registry_client_protocol = http # The path to the key file to use in SSL connections to the # registry server, if any. Alternately, you may set the # GLANCE_CLIENT_KEY_FILE environ variable to a filepath of the key file # registry_client_key_file = /path/to/key/file # The path to the cert file to use in SSL connections to the # registry server, if any. Alternately, you may set the # GLANCE_CLIENT_CERT_FILE environ variable to a filepath of the cert file # registry_client_cert_file = /path/to/cert/file # The path to the certifying authority cert file to use in SSL connections # to the registry server, if any. Alternately, you may set the # GLANCE_CLIENT_CA_FILE environ variable to a filepath of the CA cert file # registry_client_ca_file = /path/to/ca/file # ============ Notification System Options ===================== # Notifications can be sent when images are create, updated or deleted. # There are three methods of sending notifications, logging (via the # log_file directive), rabbit (via a rabbitmq queue), qpid (via a Qpid # message queue), or noop (no notifications sent, the default) notifier_strategy = noop # Configuration options if sending notifications via rabbitmq (these are # the defaults) #rabbit_host = localhost #rabbit_port = 5672 #rabbit_use_ssl = false #rabbit_userid = guest #rabbit_password = guest #rabbit_virtual_host = / #rabbit_notification_exchange = glance #rabbit_notification_topic = glance_notifications # Configuration options if sending notifications via Qpid (these are # the defaults) qpid_notification_exchange = glance qpid_notification_topic = glance_notifications qpid_host = 192.168.128.100 qpid_port = 5672 qpid_username = glance-que qpid_password = glance-que qpid_sasl_mechanisms = qpid_reconnect_timeout = 0 qpid_reconnect_limit = 0 qpid_reconnect_interval_min = 0 qpid_reconnect_interval_max = 0 qpid_reconnect_interval = 0 qpid_heartbeat = 5 # Set to 'ssl' to enable SSL qpid_protocol = tcp qpid_tcp_nodelay = True # ============ Filesystem Store Options ======================== # Directory that the Filesystem backend store # writes image data to filesystem_store_datadir = /var/lib/glance/images/ # ============ Swift Store Options ============================= # Version of the authentication service to use # Valid versions are '2' for keystone and '1' for swauth and rackspace swift_store_auth_version = 2 # Address where the Swift authentication service lives # Valid schemes are 'http://' and 'https://' # If no scheme specified, default to 'https://' # For swauth, use something like '127.0.0.1:8080/v1.0/' swift_store_auth_address = http://192.168.128.110:35357/v2.0/ # User to authenticate against the Swift authentication service # If you use Swift authentication service, set it to 'account':'user' # where 'account' is a Swift storage account and 'user' # is a user in that account swift_store_user = service01:glance # Auth key for the user authenticating against the # Swift authentication service swift_store_key = glance # Container within the account that the account should use # for storing images in Swift swift_store_container = glance # Do we create the container if it does not exist? swift_store_create_container_on_put = True # What size, in MB, should Glance start chunking image files # and do a large object manifest in Swift? By default, this is # the maximum object size in Swift, which is 5GB swift_store_large_object_size = 5120 # When doing a large object manifest, what size, in MB, should # Glance write chunks to Swift? This amount of data is written # to a temporary disk buffer during the process of chunking # the image file, and the default is 200MB swift_store_large_object_chunk_size = 200 # Whether to use ServiceNET to communicate with the Swift storage servers. # (If you aren't RACKSPACE, leave this False!) # # To use ServiceNET for authentication, prefix hostname of # `swift_store_auth_address` with 'snet-'. # Ex. https://example.com/v1.0/ -> https://snet-example.com/v1.0/ swift_enable_snet = False # ============ S3 Store Options ============================= # Address where the S3 authentication service lives # Valid schemes are 'http://' and 'https://' # If no scheme specified, default to 'http://' s3_store_host = 127.0.0.1:8080/v1.0/ # User to authenticate against the S3 authentication service s3_store_access_key = <20-char AWS access key> # Auth key for the user authenticating against the # S3 authentication service s3_store_secret_key = <40-char AWS secret key> # Container within the account that the account should use # for storing images in S3. Note that S3 has a flat namespace, # so you need a unique bucket name for your glance images. An # easy way to do this is append your AWS access key to "glance". # S3 buckets in AWS *must* be lowercased, so remember to lowercase # your AWS access key if you use it in your bucket name below! s3_store_bucket = <lowercased 20-char aws access key>glance # Do we create the bucket if it does not exist? s3_store_create_bucket_on_put = False # When sending images to S3, the data will first be written to a # temporary buffer on disk. By default the platform's temporary directory # will be used. If required, an alternative directory can be specified here. # s3_store_object_buffer_dir = /path/to/dir # ============ RBD Store Options ============================= # Ceph configuration file path # If using cephx authentication, this file should # include a reference to the right keyring # in a client.<USER> section rbd_store_ceph_conf = /etc/ceph/ceph.conf # RADOS user to authenticate as (only applicable if using cephx) rbd_store_user = glance # RADOS pool in which images are stored rbd_store_pool = images # Images will be chunked into objects of this size (in megabytes). # For best performance, this should be a power of two rbd_store_chunk_size = 8 # ============ Delayed Delete Options ============================= # Turn on/off delayed delete delayed_delete = False # Delayed delete time in seconds scrub_time = 43200 # Directory that the scrubber will use to remind itself of what to delete # Make sure this is also set in glance-scrubber.conf scrubber_datadir = /var/lib/glance/scrubber # =============== Image Cache Options ============================= # Base directory that the Image Cache uses image_cache_dir = /var/lib/glance/image-cache/ [paste_deploy] flavor = keystone
glance-api-paste.ini
[glance@opst-gl glance]$ cp glance-api-paste.ini.sample glance-api-paste.ini
# Default minimal pipeline [pipeline:glance-api] pipeline = versionnegotiation context apiv1app # Use the following pipeline for keystone auth # i.e. in glance-api.conf: # [paste_deploy] # flavor = keystone # [pipeline:glance-api-keystone] pipeline = versionnegotiation authtoken context apiv1app # Use the following pipeline to enable transparent caching of image files # i.e. in glance-api.conf: # [paste_deploy] # flavor = caching # [pipeline:glance-api-caching] pipeline = versionnegotiation context cache apiv1app # Use the following pipeline for keystone auth with caching # i.e. in glance-api.conf: # [paste_deploy] # flavor = keystone+caching # [pipeline:glance-api-keystone+caching] pipeline = versionnegotiation authtoken context cache apiv1app # Use the following pipeline to enable the Image Cache Management API # i.e. in glance-api.conf: # [paste_deploy] # flavor = cachemanagement # [pipeline:glance-api-cachemanagement] pipeline = versionnegotiation context cache cachemanage apiv1app # Use the following pipeline for keystone auth with cache management # i.e. in glance-api.conf: # [paste_deploy] # flavor = keystone+cachemanagement # [pipeline:glance-api-keystone+cachemanagement] pipeline = versionnegotiation authtoken context cache cachemanage apiv1app [app:apiv1app] paste.app_factory = glance.common.wsgi:app_factory glance.app_factory = glance.api.v1.router:API [filter:versionnegotiation] paste.filter_factory = glance.common.wsgi:filter_factory glance.filter_factory = glance.api.middleware.version_negotiation:VersionNegotiationFilter [filter:cache] paste.filter_factory = glance.common.wsgi:filter_factory glance.filter_factory = glance.api.middleware.cache:CacheFilter [filter:cachemanage] paste.filter_factory = glance.common.wsgi:filter_factory glance.filter_factory = glance.api.middleware.cache_manage:CacheManageFilter [filter:context] paste.filter_factory = glance.common.wsgi:filter_factory glance.filter_factory = glance.common.context:ContextMiddleware [filter:authtoken] paste.filter_factory = keystone.middleware.auth_token:filter_factory service_protocol = http service_host = 192.168.128.110 service_port = 5000 auth_host = 192.168.128.110 auth_port = 35357 auth_protocol = http auth_uri = http://192.168.128.110:5000/ admin_tenant_name = service01 admin_user = glance admin_password = glance
glance-registry.conf
[glance@opst-gl glance]$ cp glance-registry.conf.sample glance-registry.conf
[DEFAULT] # Show more verbose log output (sets INFO log level output) verbose = True # Show debugging output in logs (sets DEBUG log level output) debug = True # Address to bind the registry server bind_host = 0.0.0.0 # Port the bind the registry server to bind_port = 9191 # Log to this file. Make sure you do not set the same log # file for both the API and registry servers! log_file = /var/log/glance/registry.log # Backlog requests when creating socket backlog = 4096 # SQLAlchemy connection string for the reference implementation # registry server. Any valid SQLAlchemy connection string is fine. # See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine #sql_connection = sqlite:///glance.sqlite sql_connection = mysql://glance:db-glance-pass@192.168.128.100/glance # Period in seconds after which SQLAlchemy should reestablish its connection # to the database. # # MySQL uses a default `wait_timeout` of 8 hours, after which it will drop # idle connections. This can result in 'MySQL Gone Away' exceptions. If you # notice this, you can lower this value to ensure that SQLAlchemy reconnects # before MySQL can drop the connection. sql_idle_timeout = 3600 # Limit the api to return `param_limit_max` items in a call to a container. If # a larger `limit` query param is provided, it will be reduced to this value. api_limit_max = 1000 # If a `limit` query param is not provided in an api request, it will # default to `limit_param_default` limit_param_default = 25 # Role used to identify an authenticated user as administrator #admin_role = admin # ================= Syslog Options ============================ # Send logs to syslog (/dev/log) instead of to file specified # by `log_file` use_syslog = False # Facility to use. If unset defaults to LOG_USER. # syslog_log_facility = LOG_LOCAL1 # ================= SSL Options =============================== # Certificate file to use when starting registry server securely # cert_file = /path/to/certfile # Private key file to use when starting registry server securely # key_file = /path/to/keyfile # [paste_deploy] flavor = keystone
glance-registry-paste.ini
[glance@opst-gl glance]$ cp glance-registry-paste.ini.sample glance-registry-paste.ini
# Default minimal pipeline [pipeline:glance-registry] pipeline = context registryapp # Use the following pipeline for keystone auth # i.e. in glance-registry.conf: # [paste_deploy] # flavor = keystone # [pipeline:glance-registry-keystone] pipeline = authtoken context registryapp [app:registryapp] paste.app_factory = glance.common.wsgi:app_factory glance.app_factory = glance.registry.api.v1:API [filter:context] context_class = glance.registry.context.RequestContext paste.filter_factory = glance.common.wsgi:filter_factory glance.filter_factory = glance.common.context:ContextMiddleware [filter:authtoken] paste.filter_factory = keystone.middleware.auth_token:filter_factory service_protocol = http service_host = 192.168.128.110 service_port = 5000 auth_host = 192.168.128.110 auth_port = 35357 auth_protocol = http auth_uri = http://192.168.128.110:5000/ admin_tenant_name = service01 admin_user = glance admin_password = glance
その他
以下はコピーするだけで、特に編集せず。
[glance@opst-gl glance]$ cp glance-cache.conf.sample glance-cache.conf
[glance@opst-gl glance]$ cp glance-cache-paste.ini.sample glance-cache-paste.ini
[glance@opst-gl glance]$ cp glance-scrubber.conf.sample glance-scrubber.conf
[glance@opst-gl glance]$ cp glance-scrubber-paste.ini.sample glance-scrubber-paste.ini
起動
[glance@opst-gl glance]$ glance-api &
[glance@opst-gl glance]$ glance-registry &
便利スクリプト
glanceコマンドはadminユーザのトークンを必要とするので、簡単に取得するスクリプトを準備しておく。
[glance@opst-gl ~]$ cat get_token.sh
#!/bin/bash ADMIN_USER=admin ADMIN_TENANT=admin ADMIN_PASSWORD=admin HOST_IP=192.168.128.110 TOKEN=`curl -s -d "{\"auth\":{\"passwordCredentials\": {\"username\": \"$ADMIN_USER\", \"password\": \"$ADMIN_PASSWORD\"}, \"tenantName\": \"$ADMIN_TENANT\"}}" -H "Content-type: application/json" http://$HOST_IP:5000/v2.0/tokens | python -c "import sys; import json; tok = json.loads(sys.stdin.read()); print tok['access']['token']['id'];"` echo $TOKEN
[glance@opst-gl ~]$ ./get_token.sh
eae874e2d34042928c1bd3da7f48d5c2
イメージの投入
devstackのスクリプトを流用して利用する。
[glance@opst-gl ~]$ cat add_image.sh
#!/bin/bash FILES=`pwd` LIBVIRT_TYPE=${LIBVIRT_TYPE:-kvm} mkdir -p $FILES/images # get TOKEN source get_token.sh # set image url image_url="http://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-uec.tar.gz" IMAGE_FNAME=`basename "$image_url"` if [ ! -f $FILES/$IMAGE_FNAME ]; then wget -c $image_url -O $FILES/$IMAGE_FNAME fi [ "${IMAGE_FNAME%.tar.gz}" != "$IMAGE_FNAME" ] && IMAGE_NAME="${IMAGE_FNAME%.tar.gz}" || IMAGE_NAME="${IMAGE_FNAME%.tgz}" xdir="$FILES/images/$IMAGE_NAME" rm -Rf "$xdir"; mkdir "$xdir" tar -zxf $FILES/$IMAGE_FNAME -C "$xdir" KERNEL=$(for f in "$xdir/"*-vmlinuz*; do [ -f "$f" ] && echo "$f" && break; done; true) RAMDISK=$(for f in "$xdir/"*-initrd*; do [ -f "$f" ] && echo "$f" && break; done; true) IMAGE=$(for f in "$xdir/"*.img; do [ -f "$f" ] && echo "$f" && break; done; true) [ -n "$IMAGE_NAME" ] IMAGE_NAME=$(basename "$IMAGE" ".img") # add KERNEL IMAGE # RVAL=`glance add --silent-upload -A $TOKEN name="$IMAGE_NAME-kernel" is_public=true container_format=aki disk_format=aki < "$KERNEL"` KERNEL_ID=`echo $RVAL | cut -d":" -f2 | tr -d " "` # # add RAMDISK IMAGE # RVAL=`glance add --silent-upload -A $TOKEN name="$IMAGE_NAME-ramdisk" is_public=true container_format=ari disk_format=ari < "$RAMDISK"` RAMDISK_ID=`echo $RVAL | cut -d":" -f2 | tr -d " "` # # add IMAGE # glance add -A $TOKEN name="${IMAGE_NAME%.img}" is_public=true container_format=ami disk_format=ami ${KERNEL_ID:+kernel_id=$KERNEL_ID} ${RAMDISK_ID:+ramdisk_id=$RAMDISK_ID} < <(zcat --force "${IMAGE}")
[glance@opst-gl ~]$ ./add_image.sh
確認
[glance@opst-gl ~]$ glance -A `./get_token.sh` index
ID Name Disk Format Container Format Size ------------------------------------ ------------------------------ -------------------- -------------------- -------------- e18e5589-3dc6-428e-a5aa-b2e994f33730 cirros-0.3.0-x86_64-blank ami ami 25165824 31260fa0-574c-43b4-be68-5e6956d5a304 cirros-0.3.0-x86_64-blank-ramd ari ari 2254249 e3ffec92-7930-4838-86f6-c199158472ef cirros-0.3.0-x86_64-blank-kern aki aki 4731440
[glance@opst-gl ~]$ glance -A `./get_token.sh` show e18e5589-3dc6-428e-a5aa-b2e994f33730
URI: http://0.0.0.0:9292/v1/images/e18e5589-3dc6-428e-a5aa-b2e994f33730 Id: e18e5589-3dc6-428e-a5aa-b2e994f33730 Public: Yes Protected: No Name: cirros-0.3.0-x86_64-blank Status: active Size: 25165824 Disk format: ami Container format: ami Minimum Ram Required (MB): 0 Minimum Disk Required (GB): 0 Owner: e3f5826b96f74985b5ad673de64e0afd Property 'kernel_id': e3ffec92-7930-4838-86f6-c199158472ef Property 'ramdisk_id': 31260fa0-574c-43b4-be68-5e6956d5a304
0 件のコメント:
コメントを投稿