Server IP : 85.214.239.14 / Your IP : 3.135.249.157 Web Server : Apache/2.4.62 (Debian) System : Linux h2886529.stratoserver.net 4.9.0 #1 SMP Tue Jan 9 19:45:01 MSK 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.18 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /lib/python3/dist-packages/ansible_collections/theforeman/foreman/plugins/modules/ |
Upload File : |
#!/usr/bin/python # -*- coding: utf-8 -*- # (c) 2017, Andrew Kofink <ajkofink@gmail.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. from __future__ import absolute_import, division, print_function __metaclass__ = type DOCUMENTATION = ''' --- module: repository_set version_added: 1.0.0 short_description: Enable/disable Red Hat Repositories available through subscriptions description: - Enable/disable Red Hat Repositories that are available through subscriptions author: "Andrew Kofink (@akofink)" options: name: description: - Name of the repository set required: false type: str product: description: - Name of the parent product required: false type: str label: description: - Label of the repository set, can be used in place of I(name) & I(product) required: false type: str repositories: description: - Release version and base architecture of the repositories to enable. - Some reposotory sets require only I(basearch) or only I(releasever) to be set. - See the examples how you can obtain this information using M(theforeman.foreman.resource_info). - Required when I(all_repositories) is unset or C(false). required: false type: list elements: dict suboptions: basearch: description: - Basearch of the repository to enable. type: str releasever: description: - Releasever of the repository to enable. type: str all_repositories: description: - Affect all available repositories in the repository set instead of listing them in I(repositories). - Required when I(repositories) is unset or an empty list. required: false type: bool state: description: - Whether the repositories are enabled or not required: false choices: - 'enabled' - 'disabled' default: enabled type: str extends_documentation_fragment: - theforeman.foreman.foreman - theforeman.foreman.foreman.organization ''' EXAMPLES = ''' - name: "Enable RHEL 7 RPMs repositories" theforeman.foreman.repository_set: username: "admin" password: "changeme" server_url: "https://foreman.example.com" name: "Red Hat Enterprise Linux 7 Server (RPMs)" organization: "Default Organization" product: "Red Hat Enterprise Linux Server" repositories: - releasever: "7.0" basearch: "x86_64" - releasever: "7.1" basearch: "x86_64" - releasever: "7.2" basearch: "x86_64" - releasever: "7.3" basearch: "x86_64" state: enabled - name: "Enable RHEL 7 RPMs repositories with label" theforeman.foreman.repository_set: username: "admin" password: "changeme" server_url: "https://foreman.example.com" organization: "Default Organization" label: rhel-7-server-rpms repositories: - releasever: "7.0" basearch: "x86_64" - releasever: "7.1" basearch: "x86_64" - releasever: "7.2" basearch: "x86_64" - releasever: "7.3" basearch: "x86_64" state: enabled - name: "Disable RHEL 7 Extras RPMs repository" theforeman.foreman.repository_set: username: "admin" password: "changeme" server_url: "https://foreman.example.com" name: Red Hat Enterprise Linux 7 Server - Extras (RPMs) organization: "Default Organization" product: Red Hat Enterprise Linux Server state: disabled repositories: - basearch: x86_64 - name: "Enable RHEL 8 BaseOS RPMs repository with label" theforeman.foreman.repository_set: username: "admin" password: "changeme" server_url: "https://foreman.example.com" organization: "Default Organization" label: rhel-8-for-x86_64-baseos-rpms repositories: - releasever: "8" - name: "Enable Red Hat Virtualization Manager RPMs repository with label" theforeman.foreman.repository_set: username: "admin" password: "changeme" server_url: "https://foreman.example.com" organization: "Default Organization" label: "rhel-7-server-rhv-4.2-manager-rpms" repositories: - basearch: x86_64 state: enabled - name: "Enable Red Hat Virtualization Manager RPMs repository without specifying basearch" theforeman.foreman.repository_set: username: "admin" password: "changeme" server_url: "https://foreman.example.com" organization: "Default Organization" label: "rhel-7-server-rhv-4.2-manager-rpms" all_repositories: true state: enabled - name: "Search for possible repository sets of a product" theforeman.foreman.resource_info: username: "admin" password: "changeme" server_url: "https://foreman.example.com" organization: "Default Organization" resource: repository_sets search: product_name="Red Hat Virtualization Manager" register: data - name: "Output found repository sets, see the contentUrl section for possible repository substitutions" debug: var: data - name: "Search for possible repository sets by label" theforeman.foreman.resource_info: username: "admin" password: "changeme" server_url: "https://foreman.example.com" organization: "Default Organization" resource: repository_sets search: label=rhel-7-server-rhv-4.2-manager-rpms register: data - name: "Output found repository sets, see the contentUrl section for possible repository substitutions" debug: var: data - name: Enable set with and without all_repositories at the same time theforeman.foreman.repository_set: username: "admin" password: "changeme" server_url: "https://foreman.example.com" organization: "Default Organization" label: "{{ item.label }}" repositories: "{{ item.repositories | default(omit) }}" all_repositories: "{{ item.repositories is not defined }}" state: enabled loop: - label: rhel-7-server-rpms repositories: - releasever: "7Server" basearch: "x86_64" - label: rhel-7-server-rhv-4.2-manager-rpms ''' RETURN = ''' entity: description: Final state of the affected entities grouped by their type. returned: success type: dict contains: repository_sets: description: List of repository sets. type: list elements: dict ''' from ansible_collections.theforeman.foreman.plugins.module_utils.foreman_helper import KatelloEntityAnsibleModule def get_desired_repos(desired_substitutions, available_repos): desired_repos = [] for sub in desired_substitutions: desired_repos += filter(lambda available: available['substitutions'] == sub, available_repos) return desired_repos def record_repository_set_state(module, record_data, repo, state_before, state_after): repo_change_data = record_data.copy() repo_change_data['repo_name'] = repo repo_change_data['state'] = state_before repo_change_data_after = repo_change_data.copy() repo_change_data_after['state'] = state_after module.record_before('repository_sets', repo_change_data) module.record_after('repository_sets', repo_change_data_after) module.record_after_full('repository_sets', repo_change_data_after) class KatelloRepositorySetModule(KatelloEntityAnsibleModule): pass def main(): module = KatelloRepositorySetModule( foreman_spec=dict( product=dict(type='entity', scope=['organization']), name=dict(), label=dict(), repositories=dict(type='list', elements='dict', options=dict( basearch=dict(), releasever=dict(), )), all_repositories=dict(type='bool'), ), argument_spec=dict( state=dict(default='enabled', choices=['disabled', 'enabled']), ), required_one_of=[ ['label', 'name'], ['repositories', 'all_repositories'], ], required_if=[ ['all_repositories', False, ['repositories']], ['repositories', [], ['all_repositories']], ], ) repositories = module.foreman_params.get('repositories', []) with module.api_connection(): scope = module.scope_for('organization') record_data = {} if 'product' in module.foreman_params: record_data['product'] = module.foreman_params['product'] scope.update(module.scope_for('product')) if 'label' in module.foreman_params: search = 'label="{0}"'.format(module.foreman_params['label']) repo_set = module.find_resource('repository_sets', search=search, params=scope) record_data['label'] = module.foreman_params['label'] else: repo_set = module.find_resource_by_name('repository_sets', name=module.foreman_params['name'], params=scope) record_data['name'] = module.foreman_params['name'] module.set_entity('entity', repo_set) repo_set_scope = {'id': repo_set['id'], 'product_id': repo_set['product']['id']} repo_set_scope.update(scope) available_repos = module.resource_action('repository_sets', 'available_repositories', params=repo_set_scope, ignore_check_mode=True) available_repos = available_repos['results'] current_repos = repo_set['repositories'] if not module.foreman_params.get('all_repositories', False): desired_repos = get_desired_repos(repositories, available_repos) else: desired_repos = available_repos[:] current_repo_names = set(map(lambda repo: repo['name'], current_repos)) desired_repo_names = set(map(lambda repo: repo['repo_name'], desired_repos)) if not module.foreman_params.get('all_repositories', False) and len(repositories) != len(desired_repo_names): repo_set_identification = ' '.join(['{0}: {1}'.format(k, v) for (k, v) in record_data.items()]) available_repo_details = [{'name': repo['repo_name'], 'repositories': repo['substitutions']} for repo in available_repos] desired_repo_details = [{'name': repo['repo_name'], 'repositories': repo['substitutions']} for repo in desired_repos] search_details = record_data.copy() search_details['repositories'] = repositories error_msg = "Desired repositories are not available on the repository set {0}.\nSearched: {1}\nFound: {2}\nAvailable: {3}".format( repo_set_identification, search_details, desired_repo_details, available_repo_details) module.fail_json(msg=error_msg) if module.state == 'enabled': for repo in desired_repo_names - current_repo_names: repo_to_enable = next((r for r in available_repos if r['repo_name'] == repo)) repo_change_params = repo_to_enable['substitutions'].copy() repo_change_params.update(repo_set_scope) record_repository_set_state(module, record_data, repo, 'disabled', 'enabled') module.resource_action('repository_sets', 'enable', params=repo_change_params) elif module.state == 'disabled': for repo in current_repo_names & desired_repo_names: repo_to_disable = next((r for r in available_repos if r['repo_name'] == repo)) repo_change_params = repo_to_disable['substitutions'].copy() repo_change_params.update(repo_set_scope) record_repository_set_state(module, record_data, repo, 'enabled', 'disabled') module.resource_action('repository_sets', 'disable', params=repo_change_params) if __name__ == '__main__': main()