@ -1,15 +0,0 @@ | |||
======================== | |||
Module - advanced_format | |||
======================== | |||
This module provides for the following ansible plugin: | |||
* advanced_format | |||
.. ansibleautoplugin:: | |||
:module: library/advanced_format.py | |||
:documentation: true | |||
:examples: true | |||
@ -1,15 +0,0 @@ | |||
============================= | |||
Module - check_package_update | |||
============================= | |||
This module provides for the following ansible plugin: | |||
* check_package_update | |||
.. ansibleautoplugin:: | |||
:module: library/check_package_update.py | |||
:documentation: true | |||
:examples: true | |||
@ -1,15 +0,0 @@ | |||
===================== | |||
Module - haproxy_conf | |||
===================== | |||
This module provides for the following ansible plugin: | |||
* haproxy_conf | |||
.. ansibleautoplugin:: | |||
:module: library/haproxy_conf.py | |||
:documentation: true | |||
:examples: true | |||
@ -1,15 +0,0 @@ | |||
============== | |||
Module - hiera | |||
============== | |||
This module provides for the following ansible plugin: | |||
* hiera | |||
.. ansibleautoplugin:: | |||
:module: library/hiera.py | |||
:documentation: true | |||
:examples: true | |||
@ -1,14 +0,0 @@ | |||
==================== | |||
Module - reportentry | |||
==================== | |||
This module provides for the following ansible plugin: | |||
* reportentry | |||
.. ansibleautoplugin:: | |||
:module: library/reportentry.py | |||
:documentation: true | |||
:examples: true |
@ -1,15 +0,0 @@ | |||
============================= | |||
Module - validations_read_ini | |||
============================= | |||
This module provides for the following ansible plugin: | |||
* validations_read_ini | |||
.. ansibleautoplugin:: | |||
:module: library/validations_read_ini.py | |||
:documentation: true | |||
:examples: true | |||
@ -1,15 +0,0 @@ | |||
============= | |||
Module - warn | |||
============= | |||
This module provides for the following ansible plugin: | |||
* warn | |||
.. ansibleautoplugin:: | |||
:module: library/warn.py | |||
:documentation: true | |||
:examples: true | |||
@ -1,7 +0,0 @@ | |||
============================ | |||
advanced_format_512e_support | |||
============================ | |||
.. ansibleautoplugin:: | |||
:role: roles/advanced_format_512e_support | |||
@ -1,6 +0,0 @@ | |||
============================= | |||
check_latest_packages_version | |||
============================= | |||
.. ansibleautoplugin:: | |||
:role: roles/check_latest_packages_version |
@ -1,7 +0,0 @@ | |||
=== | |||
dns | |||
=== | |||
.. ansibleautoplugin:: | |||
:role: roles/dns | |||
@ -1,7 +0,0 @@ | |||
======= | |||
haproxy | |||
======= | |||
.. ansibleautoplugin:: | |||
:role: roles/haproxy | |||
@ -1,7 +0,0 @@ | |||
===== | |||
no_op | |||
===== | |||
.. ansibleautoplugin:: | |||
:role: roles/no_op | |||
@ -1,7 +0,0 @@ | |||
=== | |||
ntp | |||
=== | |||
.. ansibleautoplugin:: | |||
:role: roles/ntp | |||
@ -1,7 +0,0 @@ | |||
============== | |||
service_status | |||
============== | |||
.. ansibleautoplugin:: | |||
:role: roles/service_status | |||
@ -1,7 +0,0 @@ | |||
============== | |||
undercloud_cpu | |||
============== | |||
.. ansibleautoplugin:: | |||
:role: roles/undercloud_cpu | |||
@ -1,7 +0,0 @@ | |||
============== | |||
undercloud_ram | |||
============== | |||
.. ansibleautoplugin:: | |||
:role: roles/undercloud_ram | |||
@ -1,7 +0,0 @@ | |||
======================= | |||
undercloud_selinux_mode | |||
======================= | |||
.. ansibleautoplugin:: | |||
:role: roles/undercloud_selinux_mode | |||
@ -1,6 +0,0 @@ | |||
================ | |||
validate_selinux | |||
================ | |||
.. ansibleautoplugin:: | |||
:role: roles/validate_selinux |
@ -1,8 +0,0 @@ | |||
=============== | |||
xfs_check_ftype | |||
=============== | |||
.. ansibleautoplugin:: | |||
:role: roles/xfs_check_ftype | |||
@ -1,97 +0,0 @@ | |||
#!/usr/bin/env 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. | |||
from os import path | |||
from yaml import safe_load as yaml_safe_load | |||
from ansible.module_utils.basic import AnsibleModule | |||
DOCUMENTATION = ''' | |||
--- | |||
module: advanced_format | |||
short_description: Check for advanced disk format | |||
description: | |||
- Check whether a drive uses advanced format | |||
options: | |||
drive: | |||
required: true | |||
description: | |||
- drive name | |||
type: str | |||
author: "Martin Andre (@mandre)" | |||
''' | |||
EXAMPLES = ''' | |||
- hosts: webservers | |||
tasks: | |||
- name: Detect whether the drive uses Advanced Format | |||
advanced_format: drive=vda | |||
''' | |||
def read_int(module, file_path): | |||
'''Read a file and convert its value to int. | |||
Raise ansible failure otherwise. | |||
''' | |||
try: | |||
with open(file_path) as f: | |||
file_contents = f.read() | |||
return int(file_contents) | |||
except IOError: | |||
module.fail_json(msg="Cannot open '%s'" % file_path) | |||
except ValueError: | |||
module.fail_json(msg="The '%s' file doesn't contain an integer value" % | |||
file_path) | |||
def main(): | |||
module = AnsibleModule( | |||
argument_spec=yaml_safe_load(DOCUMENTATION)['options'] | |||
) | |||
drive = module.params.get('drive') | |||
queue_path = path.join('/sys/class/block', drive, 'queue') | |||
physical_block_size_path = path.join(queue_path, 'physical_block_size') | |||
logical_block_size_path = path.join(queue_path, 'logical_block_size') | |||
physical_block_size = read_int(module, physical_block_size_path) | |||
logical_block_size = read_int(module, logical_block_size_path) | |||
if physical_block_size == logical_block_size: | |||
module.exit_json( | |||
changed=False, | |||
msg="The disk %s probably doesn't use Advance Format." % drive, | |||
) | |||
else: | |||
module.exit_json( | |||
# NOTE(shadower): we're marking this as `changed`, to make it | |||
# visually stand out when running via Ansible directly instead of | |||
# using the API. | |||
# | |||
# The API & UI is planned to look for the `warnings` field and | |||
# display it differently. | |||
changed=True, | |||
warnings=["Physical and logical block sizes of drive %s differ " | |||
"(%s vs. %s). This can mean the disk uses Advance " | |||
"Format." % | |||
(drive, physical_block_size, logical_block_size)], | |||
) | |||
if __name__ == '__main__': | |||
main() |
@ -1,145 +0,0 @@ | |||
#!/usr/bin/env python | |||
# Copyright 2017 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. | |||
""" Check for available updates for a given package.""" | |||
import collections | |||
import subprocess | |||
from ansible.module_utils.basic import AnsibleModule | |||
from yaml import safe_load as yaml_safe_load | |||
DOCUMENTATION = ''' | |||
--- | |||
module: check_package_update | |||
short_description: Check for available updates for a given package | |||
description: | |||
- Check for available updates for a given package | |||
options: | |||
package: | |||
required: true | |||
description: | |||
- The name of the package you want to check | |||
type: str | |||
pkg_mgr: | |||
required: true | |||
description: | |||
- Supported Package Manager, DNF or YUM | |||
type: str | |||
author: "Florian Fuchs" | |||
''' | |||
EXAMPLES = ''' | |||
- hosts: webservers | |||
tasks: | |||
- name: Get available updates for packages | |||
check_package_update: | |||
package: python-tripleoclient | |||
pkg_mgr: "{{ ansible_pkg_mgr}}" | |||
''' | |||
SUPPORTED_PKG_MGRS = ( | |||
'yum', | |||
'dnf', | |||
) | |||
PackageDetails = collections.namedtuple('PackageDetails', | |||
['name', 'version', 'release', 'arch']) | |||
def get_package_details(output): | |||
if output: | |||
return PackageDetails( | |||
output.split('|')[0], | |||
output.split('|')[1], | |||
output.split('|')[2], | |||
output.split('|')[3], | |||
) | |||
def _command(command): | |||
# Return the result of a subprocess call | |||
# as [stdout, stderr] | |||
process = subprocess.Popen(command, | |||
stdout=subprocess.PIPE, | |||
stderr=subprocess.PIPE, | |||
universal_newlines=True) | |||
return process.communicate() | |||
def check_update(module, package, pkg_mgr): | |||
if pkg_mgr not in SUPPORTED_PKG_MGRS: | |||
module.fail_json( | |||
msg='Package manager "{}" is not supported.'.format(pkg_mgr)) | |||
return | |||
installed_stdout, installed_stderr = _command( | |||
['rpm', '-qa', '--qf', | |||
'%{NAME}|%{VERSION}|%{RELEASE}|%{ARCH}', | |||
package]) | |||
# Fail the module if for some reason we can't lookup the current package. | |||
if installed_stderr != '': | |||
module.fail_json(msg=installed_stderr) | |||
return | |||
elif not installed_stdout: | |||
module.fail_json( | |||
msg='"{}" is not an installed package.'.format(package)) | |||
return | |||
installed = get_package_details(installed_stdout) | |||
pkg_mgr_option = 'available' | |||
if pkg_mgr == 'dnf': | |||
pkg_mgr_option = '--available' | |||
available_stdout, available_stderr = _command( | |||
[pkg_mgr, '-q', 'list', pkg_mgr_option, installed.name]) | |||
if available_stdout: | |||
new_pkg_info = available_stdout.split('\n')[1].rstrip().split()[:2] | |||
new_ver, new_rel = new_pkg_info[1].split('-') | |||
module.exit_json( | |||
changed=False, | |||
name=installed.name, | |||
current_version=installed.version, | |||
current_release=installed.release, | |||
new_version=new_ver, | |||
new_release=new_rel) | |||
else: | |||
module.exit_json( | |||
changed=False, | |||
name=installed.name, | |||
current_version=installed.version, | |||
current_release=installed.release, | |||
new_version=None, | |||
new_release=None) | |||
def main(): | |||
module = AnsibleModule( | |||
argument_spec=yaml_safe_load(DOCUMENTATION)['options'] | |||
) | |||
check_update(module, | |||
module.params.get('package'), | |||
module.params.get('pkg_mgr')) | |||
if __name__ == '__main__': | |||
main() |
@ -1,89 +0,0 @@ | |||
#!/usr/bin/env python | |||
# -*- coding: utf-8 -*- | |||
# 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 re | |||
from ansible.module_utils.basic import AnsibleModule | |||
from yaml import safe_load as yaml_safe_load | |||
DOCUMENTATION = ''' | |||
--- | |||
module: haproxy_conf | |||
short_description: Gather the HAProxy config | |||
description: | |||
- Gather the HAProxy config | |||
options: | |||
path: | |||
required: true | |||
description: | |||
- file path to the config file | |||
type: str | |||
author: "Tomas Sedovic" | |||
''' | |||
EXAMPLES = ''' | |||
- hosts: webservers | |||
tasks: | |||
- name: Gather the HAProxy config | |||
haproxy_conf: path=/etc/haproxy/haproxy.cfg | |||
''' | |||
# ConfigParser chokes on both mariadb and haproxy files. Luckily They have | |||
# a syntax approaching ini config file so they are relatively easy to parse. | |||
# This generic ini style config parser is not perfect -- it can ignore some | |||
# valid options -- but good enough for our use case. | |||
def generic_ini_style_conf_parser(file_path, section_regex, option_regex): | |||
config = {} | |||
current_section = None | |||
with open(file_path) as config_file: | |||
for line in config_file: | |||
match_section = re.match(section_regex, line) | |||
if match_section: | |||
current_section = match_section.group(1) | |||
config[current_section] = {} | |||
match_option = re.match(option_regex, line) | |||
if match_option and current_section: | |||
option = re.sub(r'\s+', ' ', match_option.group(1)) | |||
config[current_section][option] = match_option.group(2) | |||
return config | |||
def parse_haproxy_conf(file_path): | |||
section_regex = r'^(\w+)' | |||
option_regex = r'^(?:\s+)(\w+(?:\s+\w+)*?)\s+([\w/]*)$' | |||
return generic_ini_style_conf_parser(file_path, section_regex, | |||
option_regex) | |||
def main(): | |||
module = AnsibleModule( | |||
argument_spec=yaml_safe_load(DOCUMENTATION)['options'] | |||
) | |||
haproxy_conf_path = module.params.get('path') | |||
try: | |||
config = parse_haproxy_conf(haproxy_conf_path) | |||
except IOError: | |||
module.fail_json(msg="Could not open the haproxy conf file at: '%s'" % | |||
haproxy_conf_path) | |||
module.exit_json(changed=False, ansible_facts={u'haproxy_conf': config}) | |||
if __name__ == '__main__': | |||
main() |
@ -1,64 +0,0 @@ | |||
#!/usr/bin/env 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 subprocess | |||
from ansible.module_utils.basic import AnsibleModule | |||
from yaml import safe_load as yaml_safe_load | |||
DOCUMENTATION = ''' | |||
--- | |||
module: hiera | |||
short_description: Get data from hiera | |||
description: | |||
- Get data from hiera | |||
options: | |||
name: | |||
required: true | |||
description: | |||
- Name to lookup | |||
type: str | |||
author: "Martin Andre (@mandre)" | |||
''' | |||
EXAMPLES = ''' | |||
- hosts: webservers | |||
tasks: | |||
- name: Lookup foo | |||
hiera: name=foo | |||
''' | |||
def main(): | |||
module = AnsibleModule( | |||
argument_spec=yaml_safe_load(DOCUMENTATION)['options'] | |||
) | |||
name = module.params.get('name') | |||
cmd = ['/usr/bin/hiera', '-c', '/etc/puppet/hiera.yaml', name] | |||
result = subprocess.check_output(cmd, universal_newlines=True).rstrip() | |||
if result == 'nil': | |||
module.fail_json(msg="Failed to retrieve hiera data for {}" | |||
.format(name)) | |||
module.exit_json(changed=False, | |||
ansible_facts={name: result}) | |||
if __name__ == '__main__': | |||
main() |
@ -1,89 +0,0 @@ | |||
# -*- coding: utf-8 -*- | |||
# 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 ansible.module_utils.basic import AnsibleModule | |||
from yaml import safe_load as yaml_safe_load | |||
DOCUMENTATION = ''' | |||
--- | |||
module: reportentry | |||
short_description: Print a custom report | |||
description: | |||
- Print a custom report | |||
options: | |||
report_status: | |||
required: true | |||
description: | |||
- The report status. Should be 'OK', 'ERROR' or 'SKIPPED'. | |||
choices: | |||
- 'OK' | |||
- 'ERROR' | |||
- 'SKIPPED' | |||
type: str | |||
report_reason: | |||
required: true | |||
description: | |||
- The reason of the report | |||
type: str | |||
report_recommendations: | |||
required: true | |||
description: | |||
- A list of recommendations to do. | |||
type: list | |||
author: "Gael Chamoulaud" | |||
''' | |||
EXAMPLES = ''' | |||
- hosts: undercloud | |||
tasks: | |||
- name: Report DNS setup in undercloud.conf | |||
reportentry: | |||
report_status: "ERROR" | |||
report_reason: "DNS is not setup correctly in undercloud.conf" | |||
report_recommendations: | |||
- "Please set the 'undercloud_nameservers' param in undercloud.conf" | |||
''' | |||
def format_msg_report(status, reason, recommendations): | |||
msg = ("[{}] '{}'\n".format(status, reason)) | |||
if recommendations: | |||
for rec in recommendations: | |||
msg += " - RECOMMENDATION: {}\n".format(rec) | |||
return msg | |||
def main(): | |||
module = AnsibleModule( | |||
argument_spec=yaml_safe_load(DOCUMENTATION)['options'] | |||
) | |||
status = module.params.get('report_status') | |||
msg = format_msg_report(module.params.get('report_status'), | |||
module.params.get('report_reason'), | |||
module.params.get('report_recommendations')) | |||
if status == 'ERROR': | |||
module.fail_json(msg=msg) | |||
elif status == "SKIPPED": | |||
module.exit_json(changed=False, | |||
warnings=msg) | |||
else: | |||
module.exit_json(changed=False, | |||
msg=msg) | |||
if __name__ == '__main__': | |||
main() |
@ -1,166 +0,0 @@ | |||
#!/usr/bin/env python | |||
# -*- coding: utf-8 -*- | |||
# 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. | |||
# Ansible module to read a value from an Ini file. | |||
# Usage: | |||
# - validations_read_ini: path=/path/to/file.ini section=default key=something | |||
# register: my_ini | |||
# | |||
# This will read the `path/to/file.ini` file and read the `Hello!` value under: | |||
# [default] | |||
# something = Hello! | |||
# | |||
# You can register the result and use it later with `{{ my_ini.value }}` | |||
try: | |||
import configparser as ConfigParser | |||
except ImportError: | |||
import ConfigParser | |||
from enum import Enum | |||
import os | |||
from ansible.module_utils.basic import AnsibleModule | |||
from yaml import safe_load as yaml_safe_load | |||
# Possible return values | |||
class ReturnValue(Enum): | |||
OK = 0 | |||
INVALID_FORMAT = 1 | |||
KEY_NOT_FOUND = 2 | |||
def check_file(path, ignore_missing): | |||
'''Validate entered path''' | |||
if not (os.path.exists(path) and os.path.isfile(path)): | |||
return "Could not open the ini file: '{}'".format(path) | |||
else: | |||
return '' | |||
def get_result(path, section, key, default=None): | |||
'''Get value based on section and key''' | |||
msg = '' | |||
value = None | |||
config = ConfigParser.SafeConfigParser() | |||
try: | |||
config.read(path) | |||
except Exception: | |||
msg = "The file '{}' is not in a valid INI format.".format(path) | |||
ret = ReturnValue.INVALID_FORMAT | |||
return (ret, msg, value) | |||
try: | |||
value = config.get(section, key) | |||
msg = ("The key '{}' under the section '{}' in file {} " | |||
"has the value: '{}'").format(key, section, path, value) | |||
ret = ReturnValue.OK | |||
return (ret, msg, value) | |||
except ConfigParser.Error: | |||
if default: | |||
msg = ("There is no key '{}' under section '{}' in file {}. Using" | |||
" default value '{}'".format(key, section, path, default)) | |||
ret = ReturnValue.OK | |||
value = default | |||
else: | |||
value = None | |||
msg = "There is no key '{}' under the section '{}' in file {}.".format( | |||
key, section, path) | |||
ret = ReturnValue.KEY_NOT_FOUND | |||
return (ret, msg, value) | |||
DOCUMENTATION = ''' | |||
--- | |||
module: validations_read_ini | |||
short_description: Get data from an ini file | |||
description: | |||
- Get data from an ini file | |||
options: | |||
path: | |||
required: true | |||
description: | |||
- File path | |||
type: str | |||
section: | |||
required: true | |||
description: | |||
- Section to look up | |||
type: str | |||
key: | |||
required: true | |||
description: | |||
- Section key to look up | |||
type: str | |||
default: | |||
required: false | |||
description: | |||
- Default value if key isn't found | |||
ignore_missing_file: | |||
required: false | |||
description: | |||
- Flag if a missing file should be ignored | |||
type: bool | |||
author: "Tomas Sedovic" | |||
''' | |||
EXAMPLES = ''' | |||
- hosts: webservers | |||
tasks: | |||
- name: Lookup bar value | |||
validations_read_ini: path=config.ini section=foo key=bar ignore_missing_file=True | |||
''' | |||
def main(): | |||
module = AnsibleModule( | |||
argument_spec=yaml_safe_load(DOCUMENTATION)['options'] | |||
) | |||
ini_file_path = module.params.get('path') | |||
ignore_missing = module.params.get('ignore_missing_file') | |||
# Check that file exists | |||
msg = check_file(ini_file_path, ignore_missing) | |||
if msg != '': | |||
# Opening file failed | |||
if ignore_missing: | |||
module.exit_json(msg=msg, changed=False, value=None) | |||
else: | |||
module.fail_json(msg=msg) | |||
else: | |||
# Try to parse the result from ini file | |||
section = module.params.get('section') | |||
key = module.params.get('key') | |||
default = module.params.get('default') | |||
ret, msg, value = get_result(ini_file_path, section, key, default) | |||
if ret == ReturnValue.INVALID_FORMAT: | |||
module.fail_json(msg=msg) | |||
elif ret == ReturnValue.KEY_NOT_FOUND: | |||
module.exit_json(msg=msg, changed=False, value=None) | |||
elif ret == ReturnValue.OK: | |||
module.exit_json(msg=msg, changed=False, value=value) | |||
if __name__ == '__main__': | |||
main() |
@ -1,55 +0,0 @@ | |||
#!/usr/bin/env python | |||
# Copyright 2017 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. | |||
from ansible.module_utils.basic import AnsibleModule | |||
from yaml import safe_load as yaml_safe_load | |||
DOCUMENTATION = ''' | |||
--- | |||
module: warn | |||
short_description: Add warning to playbook output | |||
description: | |||
- Add warning to playbook output | |||
options: | |||
msg: | |||
required: true | |||
description: | |||
- The warning text | |||
type: str | |||
author: "Martin Andre (@mandre)" | |||
''' | |||
EXAMPLES = ''' | |||
- hosts: webservers | |||
tasks: | |||
- name: Output warning message | |||
warn: msg="Warning!" | |||
''' | |||
def main(): | |||
module = AnsibleModule( | |||
argument_spec=yaml_safe_load(DOCUMENTATION)['options'] | |||
) | |||
msg = module.params.get('msg') | |||
module.exit_json(changed=False, | |||
warnings=[msg]) | |||
if __name__ == '__main__': | |||
main() |
@ -1,13 +0,0 @@ | |||
--- | |||
- hosts: undercloud | |||
vars: | |||
metadata: | |||
name: Advanced Format 512e Support | |||
description: > | |||
Detect whether the undercloud disks use Advanced Format. If they do, | |||
the overcloud images may fail to upload to Glance. | |||
groups: | |||
- prep | |||
- pre-deployment | |||
roles: | |||
- advanced_format_512e_support |
@ -1,12 +0,0 @@ | |||
--- | |||
- hosts: undercloud, allovercloud | |||
vars: | |||
metadata: | |||
name: XFS ftype check | |||
description: > | |||
Check if there is at least 1 XFS volume | |||
with ftype=0 in any deployed node. | |||
groups: | |||
- pre-upgrade | |||
roles: | |||
- xfs_check_ftype |
@ -1,13 +0,0 @@ | |||
--- | |||
- hosts: undercloud | |||
gather_facts: true | |||
vars: | |||
metadata: | |||
name: Check if latest version of packages is installed | |||
description: > | |||
Makes sure python-tripleoclient is at its latest version | |||
before starting an upgrade. | |||
groups: | |||
- pre-upgrade | |||
roles: | |||
- check_latest_packages_version |
@ -1,12 +0,0 @@ | |||
--- | |||
- hosts: undercloud, allovercloud | |||
vars: | |||
metadata: | |||
name: Verify DNS | |||
description: > | |||
Verify that the DNS resolution works | |||
groups: | |||
- pre-deployment | |||
server_to_lookup: example.com | |||
roles: | |||
- dns |
@ -1,17 +0,0 @@ | |||
--- | |||
- hosts: "{{ controller_rolename | default('Controller') }}" | |||
vars: | |||
metadata: | |||
name: HAProxy configuration | |||
description: Verify the HAProxy configuration has recommended values. | |||
groups: | |||
- post-deployment | |||
config_file: '/var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg' | |||
global_maxconn_min: 20480 | |||
defaults_maxconn_min: 4096 | |||
defaults_timeout_queue: '2m' | |||
defaults_timeout_client: '2m' | |||
defaults_timeout_server: '2m' | |||
defaults_timeout_check: '10s' | |||
roles: | |||
- haproxy |
@ -1,12 +0,0 @@ | |||
--- | |||
- hosts: undercloud, allovercloud | |||
vars: | |||
metadata: | |||
name: NO-OP validation | |||
description: > | |||
A simple validation doing nothing in order to test that | |||
the validations framework works. | |||
groups: | |||
- no-op | |||
roles: | |||
- no_op |
@ -1,14 +0,0 @@ | |||
--- | |||
- hosts: allovercloud | |||
vars: | |||
metadata: | |||
name: Verify all deployed nodes have their clock synchronised | |||
description: > | |||
Each overcloud node should have their clocks synchronised. | |||
The deployment should configure and run chronyd. This validation verifies | |||
that it is indeed running and connected to an NTP server on all nodes. | |||
groups: | |||
- post-deployment | |||
roles: | |||
- ntp |
@ -1,16 +0,0 @@ | |||
--- | |||
- hosts: undercloud, allovercloud | |||
vars: | |||
metadata: | |||
name: Ensure services state | |||
description: > | |||
Detect services status on the target host and fails if we find | |||
a failed service. | |||
groups: | |||
- prep | |||
- pre-deployment | |||
- pre-upgrade | |||
- post-deployment | |||
- post-upgrade | |||
roles: | |||
- service_status |
@ -1,16 +0,0 @@ | |||
--- | |||
- hosts: undercloud | |||
gather_facts: true | |||
vars: | |||
metadata: | |||
name: Verify undercloud fits the CPU core requirements | |||
description: > | |||
Make sure that the undercloud has enough CPU cores. | |||
https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/15/html/director_installation_and_usage/planning-your-undercloud#determining-environment-scale | |||
groups: | |||
- prep | |||
- pre-introspection | |||
min_undercloud_cpu_count: 8 | |||
roles: | |||
- undercloud_cpu |
@ -1,17 +0,0 @@ | |||
--- | |||
- hosts: undercloud | |||
gather_facts: true | |||
vars: | |||
metadata: | |||
name: Verify the undercloud fits the RAM requirements | |||
description: > | |||
Verify that the undercloud has enough RAM. | |||
https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/15/html/director_installation_and_usage/planning-your-undercloud#determining-environment-scale | |||
groups: | |||
- prep | |||
- pre-introspection | |||
- pre-upgrade | |||
min_undercloud_ram_gb: 24 | |||
roles: | |||
- undercloud_ram |
@ -1,13 +0,0 @@ | |||
--- | |||
- hosts: undercloud | |||
gather_facts: true | |||
vars: | |||
metadata: | |||
name: Undercloud SELinux Enforcing Mode Check | |||
description: > | |||
Check if the Undercloud is running SELinux in Enforcing mode. | |||
groups: | |||
- prep | |||
- pre-introspection | |||
roles: | |||
- undercloud_selinux_mode |
@ -1,21 +0,0 @@ | |||
--- | |||
- hosts: all | |||
vars: | |||
metadata: | |||
name: validate-selinux | |||
description: >- | |||
Ensures we don't have any SELinux denials on the system | |||
groups: | |||
- pre-deployment | |||
- post-deployment | |||
- pre-upgrade | |||
- post-upgrade | |||
validate_selinux_working_dir: /tmp | |||
validate_selinux_audit_source: /var/log/audit/audit.log | |||
validate_selinux_skip_list_dest: "{{ validate_selinux_working_dir }}/denials-skip-list.txt" | |||
validate_selinux_filtered_denials_dest: "{{ validate_selinux_working_dir }}/denials-filtered.log" | |||
validate_selinux_strict: false | |||
validate_selinux_filter: "None" | |||
validate_selinux_skip_list: {} | |||
roles: | |||
- validate_selinux |
@ -1,37 +0,0 @@ | |||
# Molecule managed | |||
# Copyright 2019 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. | |||
{% if item.registry is defined %} | |||
FROM {{ item.registry.url }}/{{ item.image }} | |||
{% else %} | |||
FROM {{ item.image }} | |||
{% endif %} | |||
RUN if [ $(command -v apt-get) ]; then apt-get update && apt-get install -y python sudo bash ca-certificates && apt-get clean; \ | |||
elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install sudo python*-devel python*-dnf bash {{ item.pkg_extras | default('') }} && dnf clean all; \ | |||
elif [ $(command -v yum) ]; then yum makecache fast && yum install -y python sudo yum-plugin-ovl python-setuptools bash {{ item.pkg_extras | default('') }} && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \ | |||
elif [ $(command -v zypper) ]; then zypper refresh && zypper install -y python sudo bash python-xml {{ item.pkg_extras | default('') }} && zypper clean -a; \ | |||
elif [ $(command -v apk) ]; then apk update && apk add --no-cache python sudo bash ca-certificates {{ item.pkg_extras | default('') }}; \ | |||
elif [ $(command -v xbps-install) ]; then xbps-install -Syu && xbps-install -y python sudo bash ca-certificates {{ item.pkg_extras | default('') }} && xbps-remove -O; fi | |||
{% for pkg in item.easy_install | default([]) %} | |||
# install pip for centos where there is no python-pip rpm in default repos | |||
RUN easy_install {{ pkg }} | |||
{% endfor %} | |||
CMD ["sh", "-c", "while true; do sleep 10000; done"] |
@ -1,26 +0,0 @@ | |||
--- | |||
# Copyright 2019 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. | |||
- name: Converge | |||
hosts: all | |||
gather_facts: false | |||
tasks: | |||
- name: Warn developers about the lack of molecule testing | |||
fail: | |||
msg: >- | |||
This role needs molecule tests! |
@ -1,46 +0,0 @@ | |||
--- | |||
driver: | |||
name: docker | |||
log: true | |||
platforms: | |||
- name: centos7 | |||
hostname: centos7 | |||
image: centos:7 | |||
pkg_extras: python-setuptools python-enum34 python-netaddr ruby epel-release PyYAML | |||
easy_install: | |||
- pip | |||
volumes: | |||
- /etc/ci/mirror_info.sh:/etc/ci/mirror_info.sh:ro | |||
environment: &env | |||
http_proxy: "{{ lookup('env', 'http_proxy') }}" | |||
https_proxy: "{{ lookup('env', 'https_proxy') }}" | |||
- name: centos8 | |||
hostname: centos8 | |||
image: centos:8 | |||
pkg_extras: python*-setuptools python*-enum34 python*-netaddr ruby python*-PyYAML | |||
volumes: | |||
- /etc/ci/mirror_info.sh:/etc/ci/mirror_info.sh:ro | |||
environment: | |||
<<: *env | |||
provisioner: | |||
name: ansible | |||
log: true | |||
env: | |||
ANSIBLE_STDOUT_CALLBACK: yaml | |||
ANSIBLE_LIBRARY: "../../../../library" | |||
scenario: | |||
test_sequence: | |||
- destroy | |||
- create | |||
- prepare | |||
- converge | |||
- verify | |||
- destroy | |||
verifier: | |||
name: testinfra |
@ -1,10 +0,0 @@ | |||
--- | |||
- name: List the available drives | |||
register: drive_list | |||
command: "ls /sys/class/block/" | |||
changed_when: false | |||
- name: Detect whether the drive uses Advanced Format | |||
advanced_format: drive={{ item }} | |||
when: item is match("^sd.$") | |||
with_items: "{{ drive_list.stdout_lines }}" |
@ -1,9 +0,0 @@ | |||
--- | |||
metadata: | |||
name: Advanced Format 512e Support | |||
description: > | |||
Detect whether the undercloud disks use Advanced Format. If they do, | |||
the overcloud images may fail to upload to Glance. | |||
groups: | |||
- prep | |||
- pre-deployment |
@ -1,10 +0,0 @@ | |||
--- | |||
tripleoclient: >- | |||
{%- if ansible_distribution == 'RedHat' and ansible_distribution_major_version == '8' -%} | |||
python3-tripleoclient | |||
{%- else -%} | |||
python2-tripleoclient | |||
{%- endif -%} | |||
packages: | |||
- "{{ tripleoclient }}" |
@ -1,37 +0,0 @@ | |||
# Molecule managed | |||
# Copyright 2019 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. | |||
{% if item.registry is defined %} | |||
FROM {{ item.registry.url }}/{{ item.image }} | |||
{% else %} | |||
FROM {{ item.image }} | |||
{% endif %} | |||
RUN if [ $(command -v apt-get) ]; then apt-get update && apt-get install -y python sudo bash ca-certificates && apt-get clean; \ | |||
elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install sudo python*-devel python*-dnf bash {{ item.pkg_extras | default('') }} && dnf clean all; \ | |||
elif [ $(command -v yum) ]; then yum makecache fast && yum install -y python sudo yum-plugin-ovl python-setuptools bash {{ item.pkg_extras | default('') }} && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \ | |||
elif [ $(command -v zypper) ]; then zypper refresh && zypper install -y python sudo bash python-xml {{ item.pkg_extras | default('') }} && zypper clean -a; \ | |||
elif [ $(command -v apk) ]; then apk update && apk add --no-cache python sudo bash ca-certificates {{ item.pkg_extras | default('') }}; \ | |||
elif [ $(command -v xbps-install) ]; then xbps-install -Syu && xbps-install -y python sudo bash ca-certificates {{ item.pkg_extras | default('') }} && xbps-remove -O; fi | |||
{% for pkg in item.easy_install | default([]) %} | |||
# install pip for centos where there is no python-pip rpm in default repos | |||
RUN easy_install {{ pkg }} | |||
{% endfor %} | |||
CMD ["sh", "-c", "while true; do sleep 10000; done"] |
@ -1,51 +0,0 @@ | |||
--- | |||
# Copyright 2019 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. | |||
- name: Converge | |||
hosts: all | |||
tasks: | |||
- name: Validate No Available Update for patch rpm | |||
include_role: | |||
name: check_latest_packages_version | |||
vars: | |||
packages: | |||
- patch | |||
- name: Working Detection of Update for Pam package | |||
block: | |||
- include_role: | |||
name: check_latest_packages_version | |||
vars: | |||
packages: | |||
- pam | |||
rescue: | |||
- name: Clear host errors | |||
meta: clear_host_errors | |||
- debug: | |||
msg: The validation works! End the playbook run | |||
- name: End play | |||
meta: end_play | |||
- name: Fail the test | |||
fail: | |||
msg: | | |||
The check_latest_packages_version role should have detected | |||
that packages have available updates. |
@ -1,46 +0,0 @@ | |||
--- | |||
driver: | |||
name: docker | |||
log: true | |||
platforms: | |||
- name: centos7 | |||
hostname: centos7 | |||
image: centos:7 | |||
pkg_extras: python-setuptools PyYAML | |||
easy_install: | |||
- pip | |||
volumes: | |||
- /etc/ci/mirror_info.sh:/etc/ci/mirror_info.sh:ro | |||
environment: &env | |||
http_proxy: "{{ lookup('env', 'http_proxy') }}" | |||
https_proxy: "{{ lookup('env', 'https_proxy') }}" | |||
- name: centos8 | |||
hostname: centos8 | |||
image: centos:8 | |||
pkg_extras: python*-setuptools python*-PyYAML | |||
volumes: | |||
- /etc/ci/mirror_info.sh:/etc/ci/mirror_info.sh:ro | |||
environment: | |||
<<: *env | |||
provisioner: | |||
name: ansible | |||
log: true | |||
env: | |||
ANSIBLE_STDOUT_CALLBACK: yaml | |||
ANSIBLE_LIBRARY: "../../../../library" | |||
scenario: | |||
test_sequence: | |||
- destroy | |||
- create | |||
- prepare | |||
- converge | |||
- verify | |||
- destroy | |||
verifier: | |||
name: testinfra |
@ -1,25 +0,0 @@ | |||
--- | |||
# Copyright 2019 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. | |||
- name: Prepare | |||
hosts: all | |||
gather_facts: false | |||
tasks: | |||
- name: install patch rpm | |||
package: | |||
name: patch |
@ -1,16 +0,0 @@ | |||
--- | |||
- name: Get available updates for packages | |||
check_package_update: | |||
package: "{{ item }}" | |||
pkg_mgr: "{{ ansible_pkg_mgr }}" | |||
with_items: "{{ packages }}" | |||
register: updates | |||
- name: Check if current version is the latest one | |||
fail: | |||
msg: >- | |||
A newer version of the {{ item.name }} package is | |||
available: {{ item.new_version }}-{{ item.new_release }} | |||
(currently {{ item.current_version }}-{{ item.current_release }}) | |||
with_items: "{{ updates.results }}" | |||
when: item.new_version |
@ -1,8 +0,0 @@ | |||
--- | |||
metadata: | |||
name: Check if latest version of packages is installed | |||
description: > | |||
Makes sure python-tripleoclient is at its latest version | |||
before starting an upgrade. | |||
groups: | |||
- pre-upgrade |
@ -1,2 +0,0 @@ | |||
--- | |||
server_to_lookup: example.com |
@ -1,37 +0,0 @@ | |||
# Molecule managed | |||
# Copyright 2019 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. | |||
{% if item.registry is defined %} | |||
FROM {{ item.registry.url }}/{{ item.image }} | |||
{% else %} | |||
FROM {{ item.image }} | |||
{% endif %} | |||
RUN if [ $(command -v apt-get) ]; then apt-get update && apt-get install -y python sudo bash ca-certificates && apt-get clean; \ | |||
elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install sudo python*-devel python*-dnf bash {{ item.pkg_extras | default('') }} && dnf clean all; \ | |||
elif [ $(command -v yum) ]; then yum makecache fast && yum install -y python sudo yum-plugin-ovl python-setuptools bash {{ item.pkg_extras | default('') }} && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \ | |||
elif [ $(command -v zypper) ]; then zypper refresh && zypper install -y python sudo bash python-xml {{ item.pkg_extras | default('') }} && zypper clean -a; \ | |||
elif [ $(command -v apk) ]; then apk update && apk add --no-cache python sudo bash ca-certificates {{ item.pkg_extras | default('') }}; \ | |||
elif [ $(command -v xbps-install) ]; then xbps-install -Syu && xbps-install -y python sudo bash ca-certificates {{ item.pkg_extras | default('') }} && xbps-remove -O; fi | |||
{% for pkg in item.easy_install | default([]) %} | |||
# install pip for centos where there is no python-pip rpm in default repos | |||
RUN easy_install {{ pkg }} | |||
{% endfor %} | |||
CMD ["sh", "-c", "while true; do sleep 10000; done"] |
@ -1,47 +0,0 @@ | |||
--- | |||
# Copyright 2019 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. | |||
- name: Converge | |||
hosts: all | |||
tasks: | |||
- name: Should get a success | |||
include_role: | |||
name: dns | |||
vars: | |||
server_to_lookup: www.redhat.com | |||
- name: Should properly fail | |||
block: | |||
- include_role: | |||
name: dns | |||
vars: | |||
server_to_lookup: role.dns.domain.do-not.exists | |||
rescue: | |||
- name: Clear host errors | |||
meta: clear_host_errors | |||
- debug: | |||
msg: The validation works! End the playbook run | |||
- name: End play | |||
meta: end_play | |||
- name: Fail the test | |||
fail: | |||
msg: | | |||
The dns role should have detected a faulty DNS configuration |
@ -1,45 +0,0 @@ | |||
--- | |||
driver: | |||
name: docker | |||
log: true | |||
platforms: | |||
- name: centos7 | |||
hostname: centos7 | |||
image: centos:7 | |||
pkg_extras: python-setuptools | |||
easy_install: | |||
- pip | |||
volumes: | |||
- /etc/ci/mirror_info.sh:/etc/ci/mirror_info.sh:ro | |||
environment: &env | |||
http_proxy: "{{ lookup('env', 'http_proxy') }}" | |||
https_proxy: "{{ lookup('env', 'https_proxy') }}" | |||
- name: centos8 | |||
hostname: centos8 | |||
image: centos:8 | |||
pkg_extras: python*-setuptools | |||
volumes: | |||
- /etc/ci/mirror_info.sh:/etc/ci/mirror_info.sh:ro | |||
environment: | |||
<<: *env | |||
provisioner: | |||
name: ansible | |||
log: true | |||
env: | |||
ANSIBLE_STDOUT_CALLBACK: yaml | |||
scenario: | |||
test_sequence: | |||
- destroy | |||
- create | |||
- prepare | |||
- converge | |||
- verify | |||
- destroy | |||
verifier: | |||
name: testinfra |
@ -1,4 +0,0 @@ | |||
--- | |||
- name: Ensure DNS resolution works | |||
command: "getent hosts {{ server_to_lookup }}" | |||
changed_when: false |
@ -1,7 +0,0 @@ | |||
--- | |||
metadata: | |||
name: Verify DNS | |||
description: > | |||
Verify that the DNS resolution works | |||
groups: | |||
- pre-deployment |
@ -1,42 +0,0 @@ | |||
haproxy | |||
======= | |||
An Ansible role to check if the HAProxy configuration has recommended values. | |||
Requirements | |||
------------ | |||
This role requires an Up and Running Overcloud | |||
Role Variables | |||
-------------- | |||
- config_file: '/var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg' | |||
- global_maxconn_min: 20480 | |||
- defaults_maxconn_min: 4096 | |||
- defaults_timeout_queue: '2m' | |||
- defaults_timeout_client: '2m' | |||
- defaults_timeout_server: '2m' | |||
- defaults_timeout_check: '10s' | |||
Dependencies | |||
------------ | |||
No dependencies | |||
Example Playbook | |||
---------------- | |||
- hosts: undercloud | |||
roles: | |||
- { role: haproxy } | |||