+++ /dev/null
-Name: ceph-iscsi-ansible
-Version: 2.0
-Release: 1%{?dist}
-Summary: Ansible playbooks for deploying LIO iscsi gateways in front of a Ceph cluster
-License: ASL 2.0
-URL: https://github.com/pcuzner/ceph-iscsi-ansible
-Source0: https://github.com/pcuzner/ceph-iscsi-ansible/archive/%{version}/%{name}-%{version}.tar.gz
-BuildArch: noarch
-
-Requires: ansible >= 1.9
-Requires: ceph-ansible >= 1.0.5
-
-%description
-Ansible playbooks that define nodes as iSCSI gateways (LIO). Once complete, the
-LIO instance on each node provides an ISCSI endpoint for clients to connect to.
-The playbook defines the front-end iSCSI environment (target -> tpgN ->
-NodeACLS/client), as well as the underlying rbd definition for the rbd images
-to be exported over iSCSI.
-
-ceph-iscsi-gw.yml ......... defines the LIO configuration(defined by
- group_vars/ceph-iscsi-gw.yml)
-purge-iscsi-gateways.yml .. deletes the LIO configuration, and optionally rbd's
- from the environment
-
-NB: The playbooks are dependent upon the ceph-iscsi-config package being
-installed/available to the hosts that will become iSCSI gateways.
-
-%prep
-%setup -q
-
-%build
-
-%install
-mkdir -p %{buildroot}%{_datarootdir}/ceph-ansible
-
-for f in group_vars library roles ceph-iscsi-gw.yml purge-iscsi-gateways.yml; do
- cp -a $f %{buildroot}%{_datarootdir}/ceph-ansible
-done
-
-%files
-%doc LICENSE
-%doc README
-%{_datarootdir}/ceph-ansible/ceph-iscsi-gw.yml
-%{_datarootdir}/ceph-ansible/purge-iscsi-gateways.yml
-%{_datarootdir}/ceph-ansible/group_vars/ceph-iscsi-gw.sample
-%{_datarootdir}/ceph-ansible/roles/ceph-iscsi-gw
-%{_datarootdir}/ceph-ansible/library/igw*
-%exclude %{_datarootdir}/ceph-ansible/library/igw*.pyo
-%exclude %{_datarootdir}/ceph-ansible/library/igw*.pyc
-
-%changelog
-* Fri Jan 13 2017 Paul Cuzner <pcuzner@redhat.com> - 2.0-1
-- converted from device-mapper/krbd to TCMU based rbd configurations
-- renamed iscsi-gateway config file to use .cfg extension
-- renamed purge playbook to match naming in ceph-ansible
-
-* Fri Nov 04 2016 Paul Cuzner <pcuzner@redhat.com> - 1.5-1
-- playbook now seeds the configuration directory on ansible host (rhbz 1390026)
-- resolve a 1.4 regression affecting the igw_purge module
-- fail gracefully if bogus client name is given (rhbz 1390023)
-
-* Thu Oct 27 2016 Paul Cuzner <pcuzner@redhat.com> - 1.4-1
-- clients can now be added without images or chap defined using null strings
-- changed parameters for client definition to position for other auth mechanisms
-- adapt purge module to use revised disk naming scheme within config object
-- updated group_vars sample to reflect name changes
-- added state= setting to LUN definitions (enabling disks to be add/removed)
-- fix syntax issue during ceph.conf seed process
-- documentation added to the Ansible modules
-
-* Fri Oct 21 2016 Paul Cuzner <pcuzner@redhat.com> - 1.3-1
-- removed rsync rpm dependency (BZ 1386090)
-- ceph.conf pulled from seed monitor, then pushed to gateways using copy task
-- add a template based config file to each gateway for runtime info
-- add additional variables allowing non-default ceph cluster names/keyrings (BZ 1386617)
-
-* Sat Oct 15 2016 Paul Cuzner <pcuzner@redhat.com> - 1.2-1
-- documented the passwordless ssh requirement for the seed_monitor node
-- fix BZ 1384505 mask the target service preventing manual start/stop
-- fix BZ 1384858 when the admin updates ansible hosts but not the gateway_ip_list variable
-
-* Wed Oct 12 2016 Paul Cuzner <pcuzner@redhat.com> - 1.1-1
-- updated playbook to modify lvm.conf to exclude the dm devices created for mapped rbds
-
-* Mon Oct 10 2016 Paul Cuzner <pcuzner@redhat.com> - 1.0-1
-- fix : allow client_connections and rbd_devices to be be empty to skip those steps
-- add usage guidelines to the group_vars/ceph-iscsi-gw.sample file
-- added variable to allow pre-req checks to be bypassed during a run
-- updated list of rpm pre-req that ansible checks for
-- add synchronize task to the playbook to copy admin keyring to gateway node(s)
-- updated igw_purge module to allow for the deletion of the alua port groups
-
-* Thu Oct 06 2016 Paul Cuzner <pcuzner@redhat.com> - 0.8-1
-- fix : purge_gateways.yml was missing
-- removed packages directory to clean up the source archive
-- spec file updates (dependencies)
-
-* Wed Oct 05 2016 Paul Cuzner <pcuzner@redhat.com> - 0.7-1
-- removed service dependencies for rbdmap/target (replaced by rbd-target-gw form ceph-iscsi-config rpm)
-- removed target overrides files
-- updated playbook to add skip_partx yes to multipath.conf
-
-* Mon Oct 03 2016 Paul Cuzner <pcuzner@redhat.com> - 0.6-1
-- changed the main function to have an ansible prefix to allow the code to know where it is invoked from
-- updated the purge module to support image names being prefixed by a pool i.e. pool/image
-
-* Tue Sep 27 2016 Paul Cuzner <pcuzner@redhat.com> - 0.5-1
-- initial rpm package
-
+++ /dev/null
-#!/usr/bin/env python
-
-__author__ = 'pcuzner@redhat.com'
-
-DOCUMENTATION = """
----
-module: igw_client
-short_description: Manage iscsi gateway client definitions
-description:
- - This module calls the 'client' configuration management module installed
- on the iscsi gateway node to handle the definition of iscsi clients on the
- gateway(s). This definition will setup iscsi authentication (e.g. chap),
- and mask the required rbd images to the client.
-
- The 'client' configuration module is provided by ceph-iscsi-config
- rpm which is installed on the gateway nodes.
-
- To support module debugging, this module logs to
- /var/log/ansible-module-igw_config.log on the target machine(s).
-
-option:
- client_iqn:
- description:
- - iqn of the client machine which should be connected or removed from the
- iscsi gateway environment
- required: true
-
- image_list:
- description:
- - comma separated string providing the rbd images that this
- client definition should have. The rbd images provided must use the
- following format <pool_name>.<rbd_image_name>
- e.g. rbd.disk1,rbd.disk2
- required: true
-
- chap:
- description:
- - chap credentials for the client to authenticate to the gateways
- to gain access to the exported rbds (LUNs). The credentials is a string
- value of the form 'username/password'. The iscsi client must then use
- these settings to gain access to any LUN resources.
- required: true
-
- state:
- description:
- - desired state for this client - absent or present
- required: true
-
-requirements: ['ceph-iscsi-config']
-
-author:
- - 'Paul Cuzner'
-
-"""
-
-import os # noqa E402
-import logging # noqa E402
-from logging.handlers import RotatingFileHandler # noqa E402
-from ansible.module_utils.basic import * # noqa E402
-
-from ceph_iscsi_config.client import GWClient # noqa E402
-import ceph_iscsi_config.settings as settings # noqa E402
-
-
-# the main function is called ansible_main to allow the call stack
-# to be checked to determine whether the call to the ceph_iscsi_config
-# modules is from ansible or not
-def ansible_main():
-
- fields = {
- "client_iqn": {"required": True, "type": "str"},
- "image_list": {"required": True, "type": "str"},
- "chap": {"required": True, "type": "str"},
- "state": {
- "required": True,
- "choices": ['present', 'absent'],
- "type": "str"
- },
- }
-
- module = AnsibleModule(argument_spec=fields, # noqa F405
- supports_check_mode=False)
-
- client_iqn = module.params['client_iqn']
-
- if module.params['image_list']:
- image_list = module.params['image_list'].split(',')
- else:
- image_list = []
-
- chap = module.params['chap']
- desired_state = module.params['state']
-
- logger.info("START - Client configuration started : {}".format(client_iqn))
-
- # The client is defined using the GWClient class. This class handles
- # client attribute updates, rados configuration object updates and LIO
- # settings. Since the logic is external to this custom module, clients
- # can be created/deleted by other methods in the same manner.
- client = GWClient(logger, client_iqn, image_list, chap)
- if client.error:
- module.fail_json(msg=client.error_msg)
-
- client.manage(desired_state)
- if client.error:
- module.fail_json(msg=client.error_msg)
-
- logger.info("END - Client configuration complete - {} "
- "changes made".format(client.change_count))
-
- changes_made = True if client.change_count > 0 else False
-
- module.exit_json(changed=changes_made,
- meta={"msg": "Client definition completed {} "
- "changes made".format(client.change_count)})
-
-
-if __name__ == '__main__':
-
- module_name = os.path.basename(__file__).replace('ansible_module_', '')
- logger = logging.getLogger(os.path.basename(module_name))
- logger.setLevel(logging.DEBUG)
- handler = RotatingFileHandler('/var/log/ansible-module-igw_config.log',
- maxBytes=5242880,
- backupCount=7)
- log_fmt = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s : '
- '%(message)s')
- handler.setFormatter(log_fmt)
- logger.addHandler(handler)
-
- # initialise global variables used by all called modules
- # e.g. ceph conffile, keyring etc
- settings.init()
-
- ansible_main()
+++ /dev/null
-#!/usr/bin/env python
-__author__ = 'pcuzner@redhat.com'
-
-
-DOCUMENTATION = """
----
-module: igw_gateway
-short_description: Manage the iscsi gateway definition
-description:
- - This module calls the 'gateway' configuration management module installed
- on the iscsi gateway node(s) to handle the definition of iscsi gateways.
- The module will configure;
- * the iscsi target and target portal group (TPG)
- * rbd maps to the gateway and registration of those rbds as LUNs to the
- kernels LIO subsystem
-
- The actual configuration modules are provided by ceph-iscsi-config rpm
- which is installed on the gateway nodes.
-
- To support module debugging, this module logs to
- /var/log/ansible-module-igw_config.log on the target machine(s).
-
-option:
- gateway_iqn:
- description:
- - iqn that all gateway nodes will use to present a common system image
- name to iscsi clients
- required: true
-
- gateway_ip_list:
- description:
- - comma separated string providing the IP addresses that will be used
- as iSCSI portal IPs to accept iscsi client connections. Each IP address
- should equate to an IP on a gateway node - typically dedicated to iscsi
- traffic. The order of the IP addresses determines the TPG sequence
- within the target definition - so once defined, new gateways can be
- added but *must* be added to the end of this list to preserve the tpg
- sequence
-
- e.g. 192.168.122.101,192.168.122.103
- required: true
-
- mode:
- description:
- - mode in which to run the gateway module. Two modes are supported
- target ... define the iscsi target iqn, tpg's and portals
- map ...... map luns to the tpg's, and also define the ALUA path setting
- for each LUN (activeOptimized/activenonoptimized)
- required: true
-
-
-requirements: ['ceph-iscsi-config']
-
-author:
- - 'Paul Cuzner'
-
-"""
-
-import os # noqa E402
-import logging # noqa E402
-
-from logging.handlers import RotatingFileHandler # noqa E402
-from ansible.module_utils.basic import * # noqa E402
-
-import ceph_iscsi_config.settings as settings # noqa E402
-
-from ceph_iscsi_config.gateway import GWTarget # noqa E402
-from ceph_iscsi_config.utils import valid_ip # noqa E402
-
-
-# the main function is called ansible_main to allow the call stack
-# to be checked to determine whether the call to the ceph_iscsi_config
-# modules is from ansible or not
-def ansible_main():
- # Configures the gateway on the host. All images defined are added to
- # the default tpg for later allocation to clients
- fields = {"gateway_iqn": {"required": True, "type": "str"},
- "gateway_ip_list": {"required": True}, # "type": "list"},
- "mode": {
- "required": True,
- "choices": ['target', 'map']
- }
- }
-
- module = AnsibleModule(argument_spec=fields, # noqa F405
- supports_check_mode=False)
-
- gateway_iqn = module.params['gateway_iqn']
- gateway_ip_list = module.params['gateway_ip_list'].split(',')
- mode = module.params['mode']
-
- if not valid_ip(gateway_ip_list):
- module.fail_json(msg="Invalid gateway IP address(es) provided - port "
- "22 check failed ({})".format(gateway_ip_list))
-
- logger.info("START - GATEWAY configuration started - mode {}".format(mode))
-
- gateway = GWTarget(logger, gateway_iqn, gateway_ip_list)
- if gateway.error:
- logger.critical("(ansible_main) Gateway init failed - "
- "{}".format(gateway.error_msg))
- module.fail_json(msg="iSCSI gateway initialisation failed "
- "({})".format(gateway.error_msg))
-
- gateway.manage(mode)
-
- if gateway.error:
- logger.critical("(main) Gateway creation or load failed, "
- "unable to continue")
- module.fail_json(msg="iSCSI gateway creation/load failure "
- "({})".format(gateway.error_msg))
-
- logger.info("END - GATEWAY configuration complete")
- module.exit_json(changed=gateway.changes_made,
- meta={"msg": "Gateway setup complete"})
-
-
-if __name__ == '__main__':
-
- module_name = os.path.basename(__file__).replace('ansible_module_', '')
- logger = logging.getLogger(os.path.basename(module_name))
- logger.setLevel(logging.DEBUG)
- handler = RotatingFileHandler('/var/log/ansible-module-igw_config.log',
- maxBytes=5242880,
- backupCount=7)
- log_fmt = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s : '
- '%(message)s')
- handler.setFormatter(log_fmt)
- logger.addHandler(handler)
-
- # initialise global variables used by all called modules
- # e.g. ceph conffile, keyring etc
- settings.init()
-
- ansible_main()
+++ /dev/null
-#!/usr/bin/env python
-
-__author__ = 'pcuzner@redhat.com'
-
-DOCUMENTATION = """
----
-module: igw_lun
-short_description: Manage ceph rbd images to present as iscsi LUNs to clients
-description:
- - This module calls the 'lun' configuration management module installed
- on the iscsi gateway node(s). The lun module handles the creation and resize # noqa E501
- of rbd images, and then maps these rbd devices to the gateway node(s) to be
- exposed through the kernel's LIO target.
-
- To support module debugging, this module logs to /var/log/ansible-module-igw_config.log # noqa E501
- on the target machine(s).
-
-option:
- pool:
- description:
- - The ceph pool where the image should exist or be created in.
-
- NOTE - The pool *must* exist prior to the Ansible run.
-
- required: true
-
- image:
- description:
- - this is the rbd image name to create/resize - if the rbd does not exist it
- is created for you with the settings optimised for exporting over iscsi.
- required: true
-
- size:
- description:
- - The size of the rbd image to create/resize. The size is numeric suffixed by
- G or T (GB or TB). Increasing the size of a LUN is supported, but if a size
- is provided that is smaller that the current size, the request is simply ignored.
-
- e.g. 100G
- required: true
-
- host:
- description:
- - the host variable defines the name of the gateway node that will be
- the allocation host for this rbd image. RBD creation and resize can
- only be performed by one gateway, the other gateways in the
- configuration will wait for the operation to complete.
- required: true
-
- features:
- description:
- - placeholder to potentially allow different rbd features to be set at
- allocation time by Ansible. NOT CURRENTLY USED
- required: false
-
- state:
- description:
- - desired state for this LUN - absent or present. For a state='absent'
- request, the lun module will verify that the rbd image is not allocated to
- a client. As long as the rbd image is not in use, the LUN definition will be
- removed from LIO, unmapped from all gateways AND DELETED.
-
- USE WITH CARE!
- required: true
-
-requirements: ['ceph-iscsi-config']
-
-author:
- - 'Paul Cuzner'
-
-"""
-import os # noqa E402
-import logging # noqa E402
-from logging.handlers import RotatingFileHandler # noqa E402
-
-from ansible.module_utils.basic import * # noqa E402
-
-from ceph_iscsi_config.lun import LUN # noqa E402
-from ceph_iscsi_config.utils import valid_size # noqa E402
-import ceph_iscsi_config.settings as settings # noqa E402
-
-# the main function is called ansible_main to allow the call stack
-# to be checked to determine whether the call to the ceph_iscsi_config
-# modules is from ansible or not
-
-
-def ansible_main():
-
- # Define the fields needs to create/map rbd's the the host(s)
- # NB. features and state are reserved/unused
- fields = {
- "pool": {"required": False, "default": "rbd", "type": "str"},
- "image": {"required": True, "type": "str"},
- "size": {"required": True, "type": "str"},
- "host": {"required": True, "type": "str"},
- "features": {"required": False, "type": "str"},
- "state": {
- "required": False,
- "default": "present",
- "choices": ['present', 'absent'],
- "type": "str"
- },
- }
-
- # not supporting check mode currently
- module = AnsibleModule(argument_spec=fields, # noqa F405
- supports_check_mode=False)
-
- pool = module.params["pool"]
- image = module.params['image']
- size = module.params['size']
- allocating_host = module.params['host']
- desired_state = module.params['state']
-
- ################################################
- # Validate the parameters passed from Ansible #
- ################################################
- if not valid_size(size):
- logger.critical("image '{}' has an invalid size specification '{}' "
- "in the ansible configuration".format(image,
- size))
- module.fail_json(msg="(main) Unable to use the size parameter '{}' "
- "for image '{}' from the playbook - "
- "must be a number suffixed by M,G "
- "or T".format(size,
- image))
-
- # define a lun object and perform some initial parameter validation
- lun = LUN(logger, pool, image, size, allocating_host)
- if lun.error:
- module.fail_json(msg=lun.error_msg)
-
- logger.info("START - LUN configuration started for {}/{}".format(pool,
- image))
-
- # attempt to create/allocate the LUN for LIO
- lun.manage(desired_state)
- if lun.error:
- module.fail_json(msg=lun.error_msg)
-
- if lun.num_changes == 0:
- logger.info("END - No changes needed")
- else:
- logger.info("END - {} configuration changes "
- "made".format(lun.num_changes))
-
- module.exit_json(changed=(lun.num_changes > 0),
- meta={"msg": "Configuration updated"})
-
-
-if __name__ == '__main__':
-
- module_name = os.path.basename(__file__).replace('ansible_module_', '')
- logger = logging.getLogger(os.path.basename(module_name))
- logger.setLevel(logging.DEBUG)
- handler = RotatingFileHandler('/var/log/ansible-module-igw_config.log',
- maxBytes=5242880,
- backupCount=7)
- log_fmt = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s : '
- '%(message)s')
- handler.setFormatter(log_fmt)
- logger.addHandler(handler)
-
- # initialise global variables used by all called modules
- # e.g. ceph conffile, keyring etc
- settings.init()
-
- ansible_main()
+++ /dev/null
-#!/usr/bin/env python
-
-DOCUMENTATION = """
----
-module: igw_purge
-short_description: Provide a purge capability to remove an iSCSI gateway
-environment
-description:
- - This module handles the removal of a gateway configuration from a ceph
- environment.
- The playbook that calls this module prompts the user for the type of purge
- to perform.
- The purge options are;
- all ... purge all LIO configuration *and* delete all defined rbd images
- lio ... purge only the LIO configuration (rbd's are left intact)
-
- USE WITH CAUTION
-
- To support module debugging, this module logs to
- /var/log/ansible-module-igw_config.log on each target machine(s).
-
-option:
- mode:
- description:
- - the mode defines the type of purge requested
- gateway ... remove the LIO configuration only
- disks ... remove the rbd disks defined to the gateway
- required: true
-
-requirements: ['ceph-iscsi-config', 'python-rtslib']
-
-author:
- - 'Paul Cuzner'
-
-"""
-
-import os # noqa E402
-import logging # noqa E402
-import socket # noqa E402
-
-from logging.handlers import RotatingFileHandler # noqa E402
-from ansible.module_utils.basic import * # noqa E402
-
-import ceph_iscsi_config.settings as settings # noqa E402
-from ceph_iscsi_config.common import Config # noqa E402
-from ceph_iscsi_config.lio import LIO, Gateway # noqa E402
-from ceph_iscsi_config.utils import ip_addresses, resolve_ip_addresses # noqa E402
-
-__author__ = 'pcuzner@redhat.com'
-
-
-def delete_group(module, image_list, cfg):
-
- logger.debug("RBD Images to delete are : {}".format(','.join(image_list)))
- pending_list = list(image_list)
-
- for rbd_path in image_list:
- delete_rbd(module, rbd_path)
- disk_key = rbd_path.replace('/', '.', 1)
- cfg.del_item('disks', disk_key)
- pending_list.remove(rbd_path)
- cfg.changed = True
-
- if cfg.changed:
- cfg.commit()
-
- return pending_list
-
-
-def delete_rbd(module, rbd_path):
-
- logger.debug("issuing delete for {}".format(rbd_path))
- rm_cmd = 'rbd --no-progress --conf {} rm {}'.format(settings.config.cephconf, # noqa E501
- rbd_path)
- rc, rm_out, err = module.run_command(rm_cmd, use_unsafe_shell=True)
- logger.debug("delete RC = {}, {}".format(rc, rm_out, err))
- if rc != 0:
- logger.error("Could not fully cleanup image {}. Manually run the rbd "
- "command line tool to remove.".format(rbd_path))
-
-
-def is_cleanup_host(config):
- """
- decide which gateway host should be responsible for any non-specific
- updates to the config object
- :param config: configuration dict from the rados pool
- :return: boolean indicating whether the addition cleanup should be
- performed by the running host
- """
- cleanup = False
-
- if 'ip_list' in config.config["gateways"]:
-
- gw_1 = config.config["gateways"]["ip_list"][0]
-
- local_ips = ip_addresses()
- usable_ips = resolve_ip_addresses(gw_1)
- for ip in usable_ips:
- if ip in local_ips:
- cleanup = True
- break
-
- return cleanup
-
-
-def ansible_main():
-
- fields = {"mode": {"required": True,
- "type": "str",
- "choices": ["gateway", "disks"]
- }
- }
-
- module = AnsibleModule(argument_spec=fields, # noqa F405
- supports_check_mode=False)
-
- run_mode = module.params['mode']
- changes_made = False
-
- logger.info("START - GATEWAY configuration PURGE started, run mode "
- "is {}".format(run_mode))
- cfg = Config(logger)
- this_host = socket.gethostname().split('.')[0]
- perform_cleanup_tasks = is_cleanup_host(cfg)
-
- #
- # Purge gateway configuration, if the config has gateways
- if run_mode == 'gateway' and len(cfg.config['gateways'].keys()) > 0:
-
- lio = LIO()
- gateway = Gateway(cfg)
-
- if gateway.session_count() > 0:
- module.fail_json(msg="Unable to purge - gateway still has active "
- "sessions")
-
- gateway.drop_target(this_host)
- if gateway.error:
- module.fail_json(msg=gateway.error_msg)
-
- lio.drop_lun_maps(cfg, perform_cleanup_tasks)
- if lio.error:
- module.fail_json(msg=lio.error_msg)
-
- if gateway.changed or lio.changed:
-
- # each gateway removes it's own entry from the config
- cfg.del_item("gateways", this_host)
-
- if perform_cleanup_tasks:
- cfg.reset = True
-
- # drop all client definitions from the configuration object
- client_names = cfg.config["clients"].keys()
- for client in client_names:
- cfg.del_item("clients", client)
-
- cfg.del_item("gateways", "iqn")
- cfg.del_item("gateways", "created")
- cfg.del_item("gateways", "ip_list")
-
- cfg.commit()
-
- changes_made = True
-
- elif run_mode == 'disks' and len(cfg.config['disks'].keys()) > 0:
- #
- # Remove the disks on this host, that have been registered in the
- # config object
- #
- # if the owner field for a disk is set to this host, this host can
- # safely delete it
- # nb. owner gets set at rbd allocation and mapping time
- images_left = []
-
- # delete_list will contain a list of pool/image names where the owner
- # is this host
- delete_list = [key.replace('.', '/', 1) for key in cfg.config['disks']
- if cfg.config['disks'][key]['owner'] == this_host]
-
- if delete_list:
- images_left = delete_group(module, delete_list, cfg)
-
- # if the delete list still has entries we had problems deleting the
- # images
- if images_left:
- module.fail_json(msg="Problems deleting the following rbd's : "
- "{}".format(','.join(images_left)))
-
- changes_made = cfg.changed
-
- logger.debug("ending lock state variable {}".format(cfg.config_locked))
-
- logger.info("END - GATEWAY configuration PURGE complete")
-
- module.exit_json(changed=changes_made,
- meta={"msg": "Purge of iSCSI settings ({}) "
- "complete".format(run_mode)})
-
-
-if __name__ == '__main__':
-
- module_name = os.path.basename(__file__).replace('ansible_module_', '')
- logger = logging.getLogger(os.path.basename(module_name))
- logger.setLevel(logging.DEBUG)
- handler = RotatingFileHandler('/var/log/ansible-module-igw_config.log',
- maxBytes=5242880,
- backupCount=7)
- log_fmt = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s : '
- '%(message)s')
- handler.setFormatter(log_fmt)
- logger.addHandler(handler)
-
- settings.init()
-
- ansible_main()