127 lines
3.7 KiB
Python
127 lines
3.7 KiB
Python
# Copyright 2016 Red Hat, Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# 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.
|
|
|
|
|
|
import docker
|
|
|
|
from ansible.module_utils._text import to_native
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
|
|
|
|
ANSIBLE_METADATA = {
|
|
'metadata_version': '1.1',
|
|
'status': ['preview'],
|
|
'supported_by': 'community'
|
|
}
|
|
|
|
|
|
def get_docker_containers(module, container_list):
|
|
from requests.exceptions import ConnectionError
|
|
if len(container_list) == 0:
|
|
pass
|
|
client = docker.from_env()
|
|
try:
|
|
containers = client.containers.list()
|
|
docker_list = [{'container_name': i.attrs['Name'].strip('/')} for i
|
|
in containers if i.attrs['Name'].strip('/') in
|
|
container_list]
|
|
|
|
return docker_list
|
|
except docker.errors.APIError as e:
|
|
module.fail_json(
|
|
msg='Error listing containers: {}'.format(to_native(e)))
|
|
except ConnectionError as e:
|
|
module.fail_json(
|
|
msg='Error connecting to Docker: {}'.format(to_native(e))
|
|
)
|
|
|
|
|
|
def get_systemd_services(module, service_unit_list):
|
|
if len(service_unit_list) == 0:
|
|
pass
|
|
systemctl_path = \
|
|
module.get_bin_path("systemctl",
|
|
opt_dirs=["/usr/bin", "/usr/local/bin"])
|
|
if systemctl_path is None:
|
|
return None
|
|
systemd_list = []
|
|
for i in service_unit_list:
|
|
rc, stdout, stderr = \
|
|
module.run_command("{} is-enabled {}".format(systemctl_path, i),
|
|
use_unsafe_shell=True)
|
|
if stdout == "enabled\n":
|
|
state_val = "enabled"
|
|
else:
|
|
state_val = "disabled"
|
|
systemd_list.append({"name": i, "state": state_val})
|
|
return systemd_list
|
|
|
|
|
|
def run_module():
|
|
|
|
module_args = dict(service_map=dict(type=dict, required=True),
|
|
services=dict(type=list, required=True),
|
|
)
|
|
|
|
module = AnsibleModule(
|
|
argument_spec=module_args,
|
|
supports_check_mode=True
|
|
)
|
|
|
|
service_map = module.params.get('service_map')
|
|
service_names = module.params.get('services')
|
|
|
|
services_to_restart = {i: service_map[i] for i in service_names}
|
|
|
|
container_list = []
|
|
for name in service_names:
|
|
try:
|
|
for item in services_to_restart[name]['container_name']:
|
|
container_list.append(item)
|
|
except KeyError:
|
|
# be tolerant if only a systemd unit is defined for the service
|
|
pass
|
|
|
|
service_unit_list = []
|
|
for svc_name in service_names:
|
|
try:
|
|
for i in services_to_restart[svc_name]['systemd_unit']:
|
|
service_unit_list.append(i)
|
|
except KeyError:
|
|
# be tolerant if only a container name is defined for the service
|
|
pass
|
|
|
|
result = dict(
|
|
ansible_facts=dict(
|
|
docker_containers_to_restart=get_docker_containers(
|
|
module, container_list),
|
|
systemd_services_to_restart=get_systemd_services(
|
|
module, service_unit_list),
|
|
)
|
|
)
|
|
|
|
if module.check_mode:
|
|
return result
|
|
|
|
module.exit_json(**result)
|
|
|
|
|
|
def main():
|
|
run_module()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|