-
Notifications
You must be signed in to change notification settings - Fork 21
Proxy features: REX #309
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Proxy features: REX #309
Changes from all commits
ead2b87
7263db6
b9403b2
8028b53
21c2a90
3c295c2
53be595
f5a83a5
970a0f6
ba03d72
08eb8e6
ec3a209
b3fa135
2d0882e
14865c0
49d1da8
caf8416
dce98fb
53daace
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,5 @@ | ||
| [defaults] | ||
| host_key_checking = False | ||
| roles_path = ./roles | ||
| filter_plugins = ./filter_plugins | ||
| callback_result_format = yaml |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,43 @@ | ||
| from __future__ import (absolute_import, division, print_function) | ||
| __metaclass__ = type | ||
|
|
||
| BASE_FEATURES = ['hammer', 'foreman-proxy', 'foreman'] | ||
|
|
||
| FEATURE_MAP = { | ||
| 'katello': { | ||
| 'foreman': 'katello', | ||
| 'foreman_proxy': None | ||
| }, | ||
| 'remote_execution': { | ||
| 'foreman': 'foreman_remote_execution', | ||
| 'foreman_proxy': 'remote_execution_ssh' | ||
| }, | ||
| 'google': { | ||
| 'foreman': 'foreman_google', | ||
| 'foreman_proxy': None | ||
| }, | ||
| 'azure_rm': { | ||
| 'foreman': 'foreman_azure_rm', | ||
| 'foreman_proxy': None | ||
| } | ||
| } | ||
|
|
||
|
|
||
| def foreman_plugins(value): | ||
| plugins = [FEATURE_MAP.get(feature, {}).get('foreman') for feature in value if feature not in BASE_FEATURES] | ||
| return [plugin for plugin in plugins if plugin is not None] | ||
|
|
||
|
|
||
| def foreman_proxy_plugins(value): | ||
| plugins = [FEATURE_MAP.get(feature, {}).get('foreman_proxy') for feature in value if feature not in BASE_FEATURES] | ||
| return [plugin for plugin in plugins if plugin is not None] | ||
|
|
||
|
|
||
| class FilterModule(object): | ||
| ''' foremanctl filters''' | ||
|
|
||
| def filters(self): | ||
| return { | ||
| 'features_to_foreman_plugins': foreman_plugins, | ||
| 'features_to_foreman_proxy_plugins': foreman_proxy_plugins, | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| --- | ||
| - name: Create config secret for {{ feature_name }} | ||
| containers.podman.podman_secret: | ||
| state: present | ||
| name: foreman-proxy-{{ feature_name }}-yml | ||
| data: "{{ lookup('ansible.builtin.template', 'settings.d/' + feature_name + '.yml.j2') }}" | ||
| notify: | ||
| - Restart Foreman Proxy | ||
| - Refresh Foreman Proxy | ||
|
|
||
| - name: Mount config secret for {{ feature_name }} | ||
| ansible.builtin.copy: | ||
| dest: /etc/containers/systemd/foreman-proxy.container.d/{{ feature_name }}.conf | ||
| content: | | ||
| [Container] | ||
| Secret=foreman-proxy-{{ feature_name }}-yml,type=mount,target=/etc/foreman-proxy/settings.d/{{ feature_name }}.yml | ||
| mode: '0644' | ||
| owner: root | ||
| group: root | ||
| notify: | ||
| - Restart Foreman Proxy | ||
| - Refresh Foreman Proxy | ||
|
|
||
| - name: Include additional tasks for {{ feature_name }} | ||
| ansible.builtin.include_tasks: '{{ tasks_file }}' | ||
| when: | ||
| - feature_enabled != "false" | ||
| - tasks_file is not none | ||
| - tasks_file != "" | ||
| vars: | ||
| tasks_file: "{{ lookup('ansible.builtin.first_found', files=['feature/' + feature_name + '.yaml'], errors='ignore') }}" |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,36 @@ | ||||||
| --- | ||||||
| - name: Create SSH Key | ||||||
| community.crypto.openssh_keypair: | ||||||
| path: /root/foreman-proxy-ssh | ||||||
|
|
||||||
| - name: Create SSH Key podman secret | ||||||
| containers.podman.podman_secret: | ||||||
| state: present | ||||||
| name: foreman-proxy-remote_execution_ssh-ssh-key | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| path: /root/foreman-proxy-ssh | ||||||
| notify: | ||||||
| - Restart Foreman Proxy | ||||||
| - Refresh Foreman Proxy | ||||||
|
|
||||||
| - name: Create SSH Pub podman secret | ||||||
| containers.podman.podman_secret: | ||||||
| state: present | ||||||
| name: foreman-proxy-remote_execution_ssh-ssh-pub | ||||||
| path: /root/foreman-proxy-ssh.pub | ||||||
|
Comment on lines
+9
to
+19
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These two tasks can be consolidated into a loop to create the SSH key/pub secrets, which will also ensure the handler runs only once, OR just run the handler when SSH secrets are mounted to the container
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handlers run only once, no matter how often they are notified. |
||||||
| notify: | ||||||
| - Restart Foreman Proxy | ||||||
| - Refresh Foreman Proxy | ||||||
|
|
||||||
| - name: Mount SSH secrets | ||||||
| ansible.builtin.copy: | ||||||
| dest: /etc/containers/systemd/foreman-proxy.container.d/remote_execution_ssh-keys.conf | ||||||
| content: | | ||||||
| [Container] | ||||||
| Secret=foreman-proxy-remote_execution_ssh-ssh-key,type=mount,target=/usr/share/foreman-proxy/.ssh/id_rsa_foreman_proxy | ||||||
| Secret=foreman-proxy-remote_execution_ssh-ssh-pub,type=mount,target=/usr/share/foreman-proxy/.ssh/id_rsa_foreman_proxy.pub | ||||||
| mode: '0644' | ||||||
| owner: root | ||||||
| group: root | ||||||
| notify: | ||||||
| - Restart Foreman Proxy | ||||||
| - Refresh Foreman Proxy | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,2 +1,2 @@ | ||
| --- | ||
| :enabled: https | ||
| :enabled: {{ feature_enabled }} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| --- | ||
| :enabled: {{ feature_enabled }} | ||
| :ssh_identity_key_file: '~/.ssh/id_rsa_foreman_proxy' | ||
| :local_working_dir: '/var/tmp' | ||
| :remote_working_dir: '/var/tmp' | ||
| :socket_working_dir: '/var/tmp' | ||
| # :kerberos_auth: false | ||
|
|
||
| # :cockpit_integration: true | ||
|
|
||
| # Mode of operation, one of ssh, pull, pull-mqtt | ||
| :mode: ssh | ||
|
|
||
| # Enables the use of SSH certificate for smart proxy authentication | ||
| # The file should contain an SSH CA public key that the SSH public key of smart proxy is signed by | ||
| # :ssh_user_ca_public_key_file: | ||
|
|
||
| # Enables the use of SSH host certificates for host authentication | ||
| # The file should contain a list of trusted SSH CA authorities that the host certs can be signed by | ||
| # Example file content: @cert-authority * <SSH CA public key> | ||
| # :ssh_ca_known_hosts_file: | ||
|
|
||
| # Defines how often (in seconds) should the runner check | ||
| # for new data leave empty to use the runner's default | ||
| # :runner_refresh_interval: 1 | ||
|
|
||
| # Defines the verbosity of logging coming from ssh command | ||
| # one of :debug, :info, :error, :fatal | ||
| # must be lower than general log level | ||
| # :ssh_log_level: error | ||
|
|
||
| # Remove working directories on job completion | ||
| # :cleanup_working_dirs: true | ||
|
|
||
| # MQTT configuration, need to be set if mode is set to pull-mqtt | ||
| # :mqtt_broker: localhost | ||
| # :mqtt_port: 1883 | ||
|
|
||
| # Use of SSL can be forced either way by explicitly setting mqtt_tls setting. If | ||
| # unset, SSL gets used if smart-proxy's foreman_ssl_cert, foreman_ssl_key and | ||
| # foreman_ssl_ca settings are set available. | ||
| # :mqtt_tls: | ||
|
|
||
| # The notification is sent over mqtt every $mqtt_resend_interval seconds, until | ||
| # the job is picked up by the host or cancelled | ||
| # :mqtt_resend_interval: 900 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,10 +1,19 @@ | ||
| def test_foreman_content_view(client_environment, activation_key, organization, foremanapi, client): | ||
| client.run('dnf install -y subscription-manager') | ||
| rcmd = foremanapi.create('registration_commands', {'organization_id': organization['id'], 'insecure': True, 'activation_keys': [activation_key['name']]}) | ||
| rcmd = foremanapi.create('registration_commands', {'organization_id': organization['id'], 'insecure': True, 'activation_keys': [activation_key['name']], 'force': True}) | ||
| client.run_test(rcmd['registration_command']) | ||
| client.run('subscription-manager repos --enable=*') | ||
| client.run_test('dnf install -y bear') | ||
| assert client.package('bear').is_installed | ||
| client.run('dnf remove -y bear') | ||
| client.run('subscription-manager unregister') | ||
| client.run('subscription-manager clean') | ||
|
|
||
| def test_foreman_rex(client_environment, activation_key, organization, foremanapi, client, client_fqdn): | ||
| client.run('dnf install -y subscription-manager') | ||
| rcmd = foremanapi.create('registration_commands', {'organization_id': organization['id'], 'insecure': True, 'activation_keys': [activation_key['name']], 'force': True}) | ||
| client.run_test(rcmd['registration_command']) | ||
| job = foremanapi.create('job_invocations', {'feature': 'run_script', 'inputs': {'command': 'uptime'}, 'search_query': f'name = {client_fqdn}', 'targeting_type': 'static_query'}) | ||
| task = foremanapi.wait_for_task(job['task']) | ||
| assert task['result'] == 'success' | ||
| foremanapi.delete('hosts', {'id': client_fqdn}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This gets executed too early on fresh installs. Damn.