diff --git a/defaults/main.yml b/defaults/main.yml index 79333ff4..3b937fbb 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -67,11 +67,6 @@ swift_keystone_auth_plugin: "password" ## Swift default variables swift_dispersion_user: dispersion swift_operator_role: swiftoperator -swift_default_replication_number: 3 -swift_default_min_part_hours: 1 -swift_default_host_zone: 0 -swift_default_host_region: 1 -swift_default_drive_weight: 100 swift_allow_versions: True # This will allow all users to create containers and upload to swift if set to True swift_allow_all_users: False diff --git a/files/swift_rings.py b/files/swift_rings.py deleted file mode 100644 index f415a448..00000000 --- a/files/swift_rings.py +++ /dev/null @@ -1,255 +0,0 @@ -#!/usr/bin/env python -# Copyright 2014, 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. - -from __future__ import print_function -from optparse import OptionParser -from os.path import exists -from swift.cli.ringbuilder import main as rb_main - -import json -import pickle -import sys -import threading - - -USAGE = "usage: %prog -f -r " - -DEVICE_KEY = "%(ip)s:%(port)d/%(device)s" - - -class RingValidationError(Exception): - pass - - -def create_buildfile(build_file, part_power, repl, min_part_hours, - update=False, data=None, validate=False): - if update: - # build file exists, so lets just update the existing build file - if not data: - data = get_build_file_data(build_file) - if data is None: - data = {} - - if repl != data.get('replicas') and not validate: - run_and_wait(rb_main, ["swift-ring-builder", build_file, - "set_replicas", repl]) - if min_part_hours != data.get('min_part_hours') and not validate: - run_and_wait(rb_main, ["swift-ring-builder", build_file, - "set_min_part_hours", min_part_hours]) - if part_power != data.get('part_power'): - raise RingValidationError('Part power cannot be changed! ' - 'you must rebuild the ring if you need ' - 'to change it.\nRing part power: %s ' - 'Inventory part power: %s' - % (data.get('part_power'), part_power)) - - elif not validate: - run_and_wait(rb_main, ["swift-ring-builder", build_file, "create", - part_power, repl, min_part_hours]) - - -def change_host_weight(build_file, host_search_str, weight): - run_and_wait(rb_main, ["swift-ring-builder", build_file, "set_weight", - host_search_str, weight]) - - -def remove_host_from_ring(build_file, host): - run_and_wait(rb_main, ["swift-ring-builder", build_file, "remove", - host]) - - -def update_host_in_ring(build_file, new_host, old_host, validate=False): - if new_host.get('zone', 0) != old_host['zone']: - devstr = DEVICE_KEY % new_host - raise RingValidationError('Cannot update zone on %s, this can only be ' - 'done when the drive is added' % devstr) - if new_host.get('region', 1) != old_host['region']: - devstr = DEVICE_KEY % new_host - raise RingValidationError('Cannot update region on %s, this can only ' - 'be done when the drive is added' % devstr) - - try: - r_ip = new_host.get('repl_ip', new_host['ip']) - r_port = new_host.get('repl_port', new_host['port']) - weight = new_host.get('weight') - - old_r_ip = old_host['replication_ip'] - old_r_port = old_host['replication_port'] - - if r_ip != old_r_ip or r_port != old_r_port: - host_d = {'r_ip': r_ip, 'r_port': r_port} - host_d.update(new_host) - host_str = ( - "%(ip)s:%(port)dR%(r_ip)s:%(r_port)d/%(device)s" % host_d - ) - if not validate: - run_and_wait(rb_main, ["swift-ring-builder", build_file, - "set_info", DEVICE_KEY % new_host, - host_str]) - except Exception as ex: - raise RingValidationError(ex) - - if weight != old_host['weight'] and not validate: - change_host_weight(build_file, DEVICE_KEY % new_host, weight) - - -def add_host_to_ring(build_file, host, validate=False): - host_str = "" - try: - if host.get('region') is not None: - host_str += 'r%(region)d' % host - host_str += "z%d" % (host.get('zone')) - host_str += "-%(ip)s:%(port)d" % host - if host.get('repl_ip'): - r_ip = host['repl_ip'] - r_port = host.get('repl_port', host['port']) - host_str += "R%s:%d" % (r_ip, r_port) - elif host.get('repl_port'): - r_ip = host.get('repl_ip', host['ip']) - r_port = host['repl_port'] - host_str += "R%s:%d" % (r_ip, r_port) - host_str += "/%(device)s" % host - weight = host.get('weight') - except Exception as ex: - raise RingValidationError(ex) - if not validate: - run_and_wait(rb_main, ["swift-ring-builder", build_file, 'add', - host_str, str(weight)]) - - -def run_and_wait(func, *args): - t = threading.Thread(target=func, args=args) - t.start() - return t.join() - - -def get_build_file_data(build_file): - build_file_data = None - if exists(build_file): - try: - with open(build_file) as bf_stream: - build_file_data = pickle.load(bf_stream) - except Exception as ex: - print("Error: failed to load build file '%s': %s" % (build_file, - ex)) - build_file_data = None - return build_file_data - - -def build_ring(build_name, repl, min_part_hours, part_power, hosts, - region=None, validate=False): - # Create the build file - build_file = "%s.builder" % build_name - build_file_data = get_build_file_data(build_file) - - update = build_file_data is not None - create_buildfile( - build_file, - part_power, - repl, - min_part_hours, - update, - data=build_file_data, - validate=validate - ) - - old_hosts = {} - if update: - for i, dev in enumerate(build_file_data['devs']): - if dev is not None: - if region is None or int(region) == int(dev['region']): - old_hosts[DEVICE_KEY % dev] = i - for host in hosts: - host_key = DEVICE_KEY % host - if region is None or int(region) == int(host['region']): - if host_key in old_hosts: - old_host = build_file_data['devs'][old_hosts[host_key]] - update_host_in_ring(build_file, host, old_host, - validate=validate) - old_hosts.pop(host_key) - else: - add_host_to_ring(build_file, host, validate=validate) - - if old_hosts and not validate: - # There are still old hosts, these hosts must've been removed - for host in old_hosts: - remove_host_from_ring(build_file, host) - - # Rebalance ring - if not validate: - if not hosts: - run_and_wait( - rb_main, ["swift-ring-builder", build_file, "write_ring"] - ) - else: - run_and_wait( - rb_main, ["swift-ring-builder", build_file, "rebalance"] - ) - - -def main(setup, region): - # load the json file - try: - with open(setup) as json_stream: - _contents_file = json.load(json_stream) - except Exception as ex: - print("Failed to load json string %s" % ex) - return 1 - - hosts = _contents_file['drives'] - kargs = {'validate': True, 'hosts': hosts, 'region': region} - ring_call = [ - _contents_file['builder_file'], - _contents_file['repl_number'], - _contents_file['min_part_hours'], - _contents_file['part_power'] - ] - - try: - build_ring(*ring_call, **kargs) - except RingValidationError as ex: - print(ex) - return 2 - - # If the validation passes lets go ahead and build the rings. - kargs.pop('validate') - build_ring(*ring_call, **kargs) - - -if __name__ == "__main__": - parser = OptionParser(USAGE) - parser.add_option( - "-f", - "--file", - dest="setup", - help="Specify the swift ring contents file.", - metavar="FILE" - ) - parser.add_option( - "-r", - "--region", - help="Specify the region to manage for the ring file.", - dest="region", - type='int', - metavar="REGION" - ) - - options, _args = parser.parse_args(sys.argv[1:]) - if options.setup and not exists(options.setup): - print("Swift ring contents file not found or doesn't exist") - parser.print_help() - sys.exit(1) - - sys.exit(main(options.setup, options.region)) diff --git a/tasks/main.yml b/tasks/main.yml index e58722a8..243d2c30 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -17,15 +17,6 @@ - include: swift_install.yml - include: swift_post_install.yml -- include: swift_key_setup.yml - tags: - - swift-key - - swift-key-distribute - -- include: swift_rings.yml - tags: - - swift-rings - - include: swift_storage_hosts.yml when: > inventory_hostname in groups['swift_hosts'] diff --git a/tasks/swift_key_distribute.yml b/tasks/swift_key_distribute.yml deleted file mode 100644 index f812921d..00000000 --- a/tasks/swift_key_distribute.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -# Copyright 2014, 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: Create authorized keys file from host vars - authorized_key: - user: "{{ swift_system_user_name }}" - key: "{{ hostvars[item]['swift_pubkey'] }}" - with_items: groups['swift_all'] - tags: - - swift-key - - swift-key-create - - swift-key-distribute diff --git a/tasks/swift_key_populate.yml b/tasks/swift_key_populate.yml deleted file mode 100644 index 10c55362..00000000 --- a/tasks/swift_key_populate.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- -# Copyright 2014, 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: Get public key contents and store as var - command: | - cat {{ swift_system_home_folder }}/.ssh/id_rsa.pub - register: swift_pub - changed_when: false - tags: - - swift-key - - swift-key-create - -- name: Register a fact for the swift pub key - set_fact: - swift_pubkey: "{{ swift_pub.stdout }}" - tags: - - swift-key - - swift-key-create diff --git a/tasks/swift_key_setup.yml b/tasks/swift_key_setup.yml deleted file mode 100644 index bfd10060..00000000 --- a/tasks/swift_key_setup.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -# Copyright 2014, 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. - -- include: swift_key_populate.yml - tags: - - swift-key - - swift-key-create - -- include: swift_key_distribute.yml - tags: - - swift-key - - swift-key-create - - swift-key-distribute diff --git a/tasks/swift_pre_install.yml b/tasks/swift_pre_install.yml index f9e7c01a..3a23fc32 100644 --- a/tasks/swift_pre_install.yml +++ b/tasks/swift_pre_install.yml @@ -29,7 +29,7 @@ - "{{ swift_system_home_folder }}/.ssh/authorized_keys" - "{{ swift_system_home_folder }}/.ssh/id_rsa" - "{{ swift_system_home_folder }}/.ssh/id_rsa.pub" - when: swift_recreate_keys == True + when: swift_recreate_keys | bool tags: - swift-key - swift-key-create diff --git a/tasks/swift_rings.yml b/tasks/swift_rings.yml deleted file mode 100644 index 125a7753..00000000 --- a/tasks/swift_rings.yml +++ /dev/null @@ -1,34 +0,0 @@ ---- -# Copyright 2014, 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. - -- include: swift_rings_md5sum.yml - -- include: swift_storage_address.yml - -- include: swift_rings_check.yml - when: > - inventory_hostname == groups['swift_hosts'][0] - -- include: swift_rings_build.yml - when: > - inventory_hostname == groups['swift_hosts'][0] - -- include: swift_rings_distribute.yml - -- include: swift_rings_md5sum.yml - -- include: swift_rings_check.yml - when: > - inventory_hostname == groups['swift_hosts'][0] diff --git a/tasks/swift_rings_build.yml b/tasks/swift_rings_build.yml deleted file mode 100644 index 0bade2f0..00000000 --- a/tasks/swift_rings_build.yml +++ /dev/null @@ -1,76 +0,0 @@ ---- -# Copyright 2014, 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: "Copy the swift_rings.py file" - copy: - src: swift_rings.py - dest: "/etc/swift/scripts/swift_rings.py" - owner: "{{ swift_system_user_name }}" - group: "{{ swift_system_group_name }}" - mode: "0700" - tags: - - swift-rings - - swift-rings-scripts - -- name: "Build ring-contents files" - template: - src: ring.contents.j2 - dest: "/etc/swift/scripts/{{ item.type }}.contents" - owner: "{{ swift_system_user_name }}" - group: "{{ swift_system_group_name }}" - with_items: - - { item: "{{ swift.account }}", port: "{{ swift_account_port }}", type: "account" } - - { item: "{{ swift.container }}", port: "{{ swift_container_port}}", type: "container" } - tags: - - swift-rings - - swift-rings-contents - -- name: "Build ring-contents files for storage policies" - template: - src: ring.contents.j2 - dest: "/etc/swift/scripts/object-{{ item[0].policy.index }}.contents" - owner: "{{ swift_system_user_name }}" - group: "{{ swift_system_group_name }}" - with_nested: - - "{{ swift.storage_policies }}" - - [{ type: 'object', port: "{{ swift_object_port }}" }] - tags: - - swift-rings - - swift-rings-contents - -- name: "build rings for account/container from contents files" - command: "/usr/bin/python /etc/swift/scripts/swift_rings.py -f /etc/swift/scripts/{{ item }}.contents" - with_items: - - account - - container - sudo: yes - sudo_user: "{{ swift_system_user_name }}" - args: - chdir: /etc/swift/ring_build_files/ - tags: - - swift-rings - - swift-rings-build - -- name: "build rings for storage policies from contents files" - command: "/usr/bin/python /etc/swift/scripts/swift_rings.py -f /etc/swift/scripts/object-{{ item.policy.index }}.contents" - with_items: - - "{{ swift.storage_policies }}" - sudo: yes - sudo_user: "{{ swift_system_user_name }}" - args: - chdir: /etc/swift/ring_build_files/ - tags: - - swift-rings - - swift-rings-build diff --git a/tasks/swift_rings_check.yml b/tasks/swift_rings_check.yml deleted file mode 100644 index aacfc6de..00000000 --- a/tasks/swift_rings_check.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- -# Copyright 2014, 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: Get md5sum of local builder files - shell: | - cat /etc/swift/ring_build_files/*.builder 2>/dev/null | md5sum | cut -d " " -f1 - register: md5sum - tags: - - swift-ring-check - -- name: Get empty md5sum - shell: | - echo -n | md5sum | cut -d " " -f1 - register: empty_md5sum - tags: - - swift-ring-check - -# Fail if the remote hosts builder files is not empty AND -# does not match the md5sum of the local host. -- name: Verify md5sum of builder files - fail: - msg: > - "The builder files on the remote host {{ item }} do not match the {{ md5sum.stdout }}, - and are not empty on the remote host" - when: > - ("{{ hostvars[item]['builder_md5sum'] }}" != "{{ empty_md5sum.stdout }}") and - ("{{ hostvars[item]['builder_md5sum'] }}" != "{{ md5sum.stdout }}") - with_items: groups['swift_all'] - tags: - - swift-ring-check diff --git a/tasks/swift_rings_distribute.yml b/tasks/swift_rings_distribute.yml deleted file mode 100644 index c39499b0..00000000 --- a/tasks/swift_rings_distribute.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- -# Copyright 2014, 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: "Get swift rings" - shell: | - rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \ - -avz \ - {{ swift_system_user_name }}@{{ hostvars[groups['swift_hosts'][0]]['swift_storage_address'] }}:/etc/swift/ring_build_files/ \ - /etc/swift/ - sudo: yes - sudo_user: "{{ swift_system_user_name }}" - tags: - - swift-get-rings - -# This task will backup the swift rings files on each node -# This task will prevent an issue if swift_hosts[0] were removed/changes -- name: "Copy swift rings to /etc/swift/ring_build_files for backup" - shell: | - rsync -e 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \ - -avz \ - {{ swift_system_user_name }}@{{ hostvars[groups['swift_hosts'][0]]['swift_storage_address'] }}:/etc/swift/ring_build_files/ \ - /etc/swift/ring_build_files/ - sudo: yes - sudo_user: "{{ swift_system_user_name }}" - tags: - - swift-get-rings diff --git a/tasks/swift_rings_md5sum.yml b/tasks/swift_rings_md5sum.yml deleted file mode 100644 index 10ac699e..00000000 --- a/tasks/swift_rings_md5sum.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -# Copyright 2014, 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: Get md5sum of builder files - shell: | - cat /etc/swift/*.builder 2>/dev/null | md5sum | cut -d " " -f1 - register: md5sum - tags: - - swift-md5sum - -- name: Register a fact for the md5sum - set_fact: - builder_md5sum: "{{ md5sum.stdout }}" - tags: - - swift-md5sum diff --git a/tasks/swift_storage_address.yml b/tasks/swift_storage_address.yml deleted file mode 100644 index 5938acc2..00000000 --- a/tasks/swift_storage_address.yml +++ /dev/null @@ -1,37 +0,0 @@ ---- -# Copyright 2014, 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. - -# We need the storage network for replication of the ring -# We find the IP on the "storage_bridge" network for storage hosts -- name: Register a fact for the default storage IP swift hosts - set_fact: - swift_storage_address: "{{ hostvars[inventory_hostname]['swift_vars']['storage_ip'] | default(hostvars[inventory_hostname]['ansible_' + swift.storage_network|replace('-','_')]['ipv4']['address'] | default(hostvars[inventory_hostname]['ansible_ssh_host'])) }}" - when: inventory_hostname in groups['swift_hosts'] and - swift.storage_network is defined - -# For proxy servers this is mapped to an interface that isn't the bridge -- name: Register a fact for the default storage IP on proxy servers - set_fact: - swift_storage_address: "{{ item.value.address }}" - with_dict: container_networks - when: inventory_hostname in groups['swift_proxy'] and - swift.storage_network is defined and - item.value.bridge == swift.storage_network - -# A catchall, and for remote hosts the IP is just the ansible_ssh_host IP -- name: Register a fact for the default storage IP when no storage-network is defined or for remote hosts - set_fact: - swift_storage_address: "{{ hostvars[inventory_hostname]['ansible_ssh_host'] }}" - when: swift.storage_network is not defined diff --git a/templates/ring.contents.j2 b/templates/ring.contents.j2 deleted file mode 100644 index d12ce0b7..00000000 --- a/templates/ring.contents.j2 +++ /dev/null @@ -1,96 +0,0 @@ -{### Check if this is an object storage policy #} -{% if item[1] is defined %} -{% set port = item[1]['port'] %} -{% set type = item[1]['type'] %} -{% set item = item[0]['policy'] %} -{### If the index is 0 then it needs to be object without index #} -{% if item.index == 0 %} -{% set builder_file = type %} -{% else %} -{% set builder_file = type + '-' + item.index|string %} -{% endif %} -{% set name = item.name %} -{### Otherwise this should be account or container rings #} -{### Make the port/type/item/builder_file/name vals uniform across rings #} -{% elif item.port is defined %} -{% set port = item.port %} -{% set type = item.type %} -{% set item = item.item %} -{% set builder_file = type %} -{% set name = type %} -{% endif %} -{### Lets get the min_part_hours, part_power and repl_number vals #} -{% set min_part_hours = item.min_part_hours | default(swift.min_part_hours | default(swift_default_min_part_hours)) %} -{% set part_power = item.part_power | default(swift.part_power) %} -{% if (item.policy_type is defined) and (item.policy_type == "erasure_coding") %} -{% set repl_number = item.ec_num_data_fragments + item.ec_num_parity_fragments %} -{% else %} -{% set repl_number = item.repl_number | default(swift.repl_number | default(swift_default_replication_number)) %} -{% endif %} -{### Create the builder dict #} -{% set builder = {} %} -{### This is a hacky way of updating the builder dict #} -{% set _update = builder.update({'min_part_hours':min_part_hours}) %} -{% set _update = builder.update({'repl_number':repl_number}) %} -{% set _update = builder.update({'part_power':part_power}) %} -{% set _update = builder.update({'builder_file':builder_file}) %} -{### Now we need to add the drives #} -{### Create an update the builder dict to have drives as an empty list #} -{% set _update = builder.update({'drives':[]}) %} -{### Lets get the default groups for drives and find the default storage_policy #} -{% set def_groups = [ 'account', 'container' ] %} -{% for policy in swift.storage_policies %} -{% if policy.policy.default is defined and policy.policy.default == True %} -{% set _update = def_groups.append(policy.policy.name) %} -{% endif %} -{% endfor %} -{### Loop through the swift_hosts #} -{% for host in groups['swift_hosts'] %} -{### Set the default storage_ip #} -{% set def_storage_ip = hostvars[host]['swift_storage_address'] %} -{### Set the default replication_ip #} -{% set def_repl_ip = def_storage_ip %} -{% if swift.replication_network is defined %} -{% set repl_bridge = 'ansible_' + swift.replication_network|replace('-', '_') %} -{% set def_repl_ip = hostvars[host][repl_bridge]['ipv4']['address'] | default(def_storage_ip) %} -{% endif %} -{### Default swift_vars to an empty dict if not defined #} -{### swift_vars needs to exist for swift_vars[setting] checks to wrok #} -{% if hostvars[host]['swift_vars'] is defined %} -{% set swift_vars = hostvars[host]['swift_vars'] %} -{% else %} -{% set swift_vars = {} %} -{% endif %} -{### Get the drives use swift global as default #} -{% set drives = swift_vars.drives | default(swift.drives | default([])) %} -{### Loop through the drives #} -{% for drive in drives %} -{### Check if groups is defined per host or drive #} -{% set groups = drive.groups | default(swift_vars.groups | default(swift.groups | default(def_groups))) %} -{### Only build the device if it is part of the group we're building the ring for #} -{% if name in groups %} -{### Build an empty device which we'll update with the appropriate details #} -{% set device = {} %} -{% set weight = drive.weight | default(swift_vars.weight | default(swift.weight | default(swift_default_drive_weight))) %} -{% set region = drive.region | default(swift_vars.region | default(swift.region | default(swift_default_host_region))) %} -{% set zone = drive.zone | default(swift_vars.zone | default(swift.zone | default(swift_default_host_zone))) %} -{% set repl_ip = drive.repl_ip | default(swift_vars.repl_ip | default(def_repl_ip)) %} -{% set repl_port = drive.repl_port | default(swift_vars.repl_port | default(port)) %} -{% set storage_ip = drive.storage_ip | default(def_storage_ip) %} -{% set storage_port = drive.storage_port | default(swift_vars.storage_port | default(port)) %} -{### Update the device with the appropriate values #} -{% set _update = device.update({'device':drive.name}) %} -{% set _update = device.update({'weight': weight}) %} -{% set _update = device.update({'region': region}) %} -{% set _update = device.update({'zone': zone}) %} -{% set _update = device.update({'repl_ip': repl_ip}) %} -{% set _update = device.update({'repl_port': repl_port|int}) %} -{% set _update = device.update({'ip': storage_ip}) %} -{% set _update = device.update({'port': storage_port|int}) %} -{### Append the device to the drives list of the builder dict #} -{% set _update = builder.drives.append(device) %} -{% endif %} -{% endfor %} -{% endfor %} -{### Output the builder file #} -{{ builder | to_nice_json }}