foreman_ansible 2.2.1 → 2.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/helpers/foreman_ansible/hosts_helper_extensions.rb +12 -7
- data/app/models/concerns/foreman_ansible/host_managed_extensions.rb +11 -0
- data/app/models/foreman_ansible/ansible_provider.rb +4 -0
- data/app/services/foreman_ansible/ansible_report_importer.rb +19 -0
- data/app/services/foreman_ansible/ansible_report_scanner.rb +1 -0
- data/app/services/foreman_ansible/inventory_creator.rb +2 -1
- data/app/views/foreman_ansible/ansible_roles/_hostgroup_ansible_roles_button.erb +8 -5
- data/app/views/foreman_ansible/job_templates/power_action_-_ansible_default.erb +0 -1
- data/lib/foreman_ansible/engine.rb +3 -0
- data/lib/foreman_ansible/version.rb +1 -1
- data/test/unit/concerns/host_managed_extensions_test.rb +11 -0
- data/test/unit/services/ansible_report_importer_test.rb +21 -0
- data/test/unit/services/inventory_creator_test.rb +2 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ade1f70967edc1792c611054dfb7cda66cc68f3
|
4
|
+
data.tar.gz: af7d9bf908aa6ee56899d7840d16fa1d04bed82a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96a268265d406b5576b928f339684f0cff15f440d21ff8ea1fa9d0bae68fafb76624e313908568a653ebf85f56f38971d1b4b7226b817ca6e97d0dfdefd0f31d
|
7
|
+
data.tar.gz: 9d27e74f738166ce43b531ac69e7429c2725d9070cb6f302b557961ae05f3070766129f0ce24efa4aeff5ca810f5bc80f6d850d3680a505559dc1d459e027c29
|
@@ -6,7 +6,8 @@ module ForemanAnsible
|
|
6
6
|
module Overrides
|
7
7
|
def host_title_actions(*args)
|
8
8
|
host = args.first
|
9
|
-
if ansible_roles_present?(host)
|
9
|
+
if ansible_roles_present?(host) &&
|
10
|
+
User.current.can?(:create_job_invocations)
|
10
11
|
button = ansible_roles_button(host)
|
11
12
|
title_actions(button_group(button))
|
12
13
|
end
|
@@ -14,10 +15,14 @@ module ForemanAnsible
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def multiple_actions
|
17
|
-
super
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
actions = super
|
19
|
+
if User.current.can?(:create_job_invocations) &&
|
20
|
+
User.current.can?(:play_roles_on_host)
|
21
|
+
actions += [[_('Play Ansible roles'),
|
22
|
+
multiple_play_roles_hosts_path,
|
23
|
+
false]]
|
24
|
+
end
|
25
|
+
actions
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
@@ -31,9 +36,9 @@ module ForemanAnsible
|
|
31
36
|
end
|
32
37
|
|
33
38
|
def ansible_roles_button(host)
|
34
|
-
|
39
|
+
display_link_if_authorized(
|
35
40
|
_('Run Ansible roles'),
|
36
|
-
|
41
|
+
hash_for_play_roles_host_path(:id => host.id),
|
37
42
|
:id => :ansible_roles_button,
|
38
43
|
:class => 'btn btn-default',
|
39
44
|
:'data-no-turbolink' => true
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'ipaddress'
|
1
2
|
module ForemanAnsible
|
2
3
|
# Relations to make Host::Managed 'have' ansible roles
|
3
4
|
module HostManagedExtensions
|
@@ -44,6 +45,16 @@ module ForemanAnsible
|
|
44
45
|
# rubocop:enable Metrics/AbcSize
|
45
46
|
end
|
46
47
|
# rubocop:enable Metrics/BlockLength
|
48
|
+
# Class methods we may need to override or add
|
49
|
+
module ClassMethods
|
50
|
+
def import_host(hostname, certname = nil, deprecated_proxy = nil)
|
51
|
+
host = super(hostname, certname, deprecated_proxy)
|
52
|
+
if IPAddress.valid?(hostname) && Nic::Interface.find_by(:ip => hostname)
|
53
|
+
host = Nic::Interface.find_by(:ip => hostname).host
|
54
|
+
end
|
55
|
+
host
|
56
|
+
end
|
57
|
+
end
|
47
58
|
end
|
48
59
|
end
|
49
60
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'ipaddress'
|
2
|
+
module ForemanAnsible
|
3
|
+
# Ensures Ansible reports from hosts where the IP was used, are assigned
|
4
|
+
# to the right hostname in Foreman
|
5
|
+
module AnsibleReportImporter
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
def host
|
9
|
+
hostname = name.downcase
|
10
|
+
if AnsibleReportScanner.ansible_report?(raw['logs']) &&
|
11
|
+
IPAddress.valid?(hostname) &&
|
12
|
+
Nic::Interface.find_by(:ip => hostname)
|
13
|
+
@host = Nic::Interface.find_by(:ip => hostname).host
|
14
|
+
end
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -91,12 +91,13 @@ module ForemanAnsible
|
|
91
91
|
|
92
92
|
def remote_execution_options(host)
|
93
93
|
params = {
|
94
|
-
'
|
94
|
+
'ansible_become_user' => @template_invocation.effective_user,
|
95
95
|
'ansible_user' => host_setting(host, 'remote_execution_ssh_user'),
|
96
96
|
'ansible_ssh_pass' => rex_ssh_password(host),
|
97
97
|
'ansible_ssh_private_key_file' => ansible_or_rex_ssh_private_key(host),
|
98
98
|
'ansible_port' => host_setting(host, 'remote_execution_ssh_port')
|
99
99
|
}
|
100
|
+
params['ansible_become'] = true if params['ansible_become_user'].present?
|
100
101
|
# Backward compatibility for Ansible 1.x
|
101
102
|
params['ansible_ssh_port'] = params['ansible_port']
|
102
103
|
params['ansible_ssh_user'] = params['ansible_user']
|
@@ -5,9 +5,12 @@
|
|
5
5
|
display_link_if_authorized(_('Play Roles'), hash_for_play_roles_hostgroup_path(:id => hostgroup), :'data-no-turbolink' => true)
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
actions = [
|
9
|
+
display_link_if_authorized(_('Nest'), hash_for_nest_hostgroup_path(:id => hostgroup)),
|
10
|
+
display_link_if_authorized(_('Clone'), hash_for_clone_hostgroup_path(:id => hostgroup))
|
11
|
+
]
|
12
|
+
actions.push play_roles if User.current.can?(:create_job_invocations)
|
13
|
+
actions.push display_delete_if_authorized(hash_for_hostgroup_path(:id => hostgroup).merge(:auth_object => hostgroup, :authorizer => authorizer), :data => { :confirm => warning_message(hostgroup) })
|
14
|
+
|
15
|
+
action_buttons(*actions)
|
13
16
|
%>
|
@@ -104,6 +104,9 @@ module ForemanAnsible
|
|
104
104
|
::Api::V2::HostgroupsController.send(
|
105
105
|
:include, ForemanAnsible::Api::V2::HostgroupsParamGroupExtensions
|
106
106
|
)
|
107
|
+
::ConfigReportImporter.send(
|
108
|
+
:include, ForemanAnsible::AnsibleReportImporter
|
109
|
+
)
|
107
110
|
rescue StandardError => e
|
108
111
|
Rails.logger.warn "Foreman Ansible: skipping engine hook (#{e})"
|
109
112
|
end
|
@@ -34,4 +34,15 @@ class HostManagedExtensionsTest < ActiveSupport::TestCase
|
|
34
34
|
@host.inherited_ansible_roles.must_equal [@role2]
|
35
35
|
end
|
36
36
|
end
|
37
|
+
|
38
|
+
describe 'import facts' do
|
39
|
+
test 'when hostname looks like an IP it finds the right host' do
|
40
|
+
@host = ::FactoryBot.create(:host, :ip => '192.168.128.27')
|
41
|
+
assert_equal @host, Host::Managed.import_host(@host.ip)
|
42
|
+
end
|
43
|
+
|
44
|
+
test 'when hostname looks like an IP but there is no host with that IP' do
|
45
|
+
assert Host::Managed.import_host('192.168.128.27').new_record?
|
46
|
+
end
|
47
|
+
end
|
37
48
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
# Unit tests for AnsibleReportImporter
|
3
|
+
# This class is just meant to capture the config reports coming
|
4
|
+
# from Ansible and change anything that is required
|
5
|
+
class AnsibleReportImporterTest < ActiveSupport::TestCase
|
6
|
+
setup do
|
7
|
+
@raw = { 'host' => '192.168.121.1' }
|
8
|
+
@importer = ::ConfigReportImporter.new(@raw)
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'finds host when the hostname is given as the IP' do
|
12
|
+
host = ::FactoryBot.create(:host, :ip => @raw['host'])
|
13
|
+
ForemanAnsible::AnsibleReportScanner.expects(:ansible_report?).returns(true)
|
14
|
+
assert_equal @importer.host, host
|
15
|
+
end
|
16
|
+
|
17
|
+
test 'creates new host if IP is not found' do
|
18
|
+
ForemanAnsible::AnsibleReportScanner.expects(:ansible_report?).returns(true)
|
19
|
+
assert @importer.host.new_record?
|
20
|
+
end
|
21
|
+
end
|
@@ -52,8 +52,9 @@ module ForemanAnsible
|
|
52
52
|
@template_invocation)
|
53
53
|
connection_params = inventory.connection_params(@host)
|
54
54
|
assert_empty extra_options.to_a - inventory.connection_params(@host).to_a
|
55
|
+
assert_equal true, connection_params['ansible_become']
|
55
56
|
assert_equal @template_invocation.effective_user,
|
56
|
-
connection_params['
|
57
|
+
connection_params['ansible_become_user']
|
57
58
|
assert_equal Setting['ansible_connection'],
|
58
59
|
connection_params['ansible_connection']
|
59
60
|
refute_equal Setting['remote_execution_ssh_user'],
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_ansible
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Lobato Garcia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -127,6 +127,7 @@ files:
|
|
127
127
|
- app/overrides/hostgroup_ansible_roles_tab.rb
|
128
128
|
- app/overrides/hostgroup_play_roles.rb
|
129
129
|
- app/overrides/report_output.rb
|
130
|
+
- app/services/foreman_ansible/ansible_report_importer.rb
|
130
131
|
- app/services/foreman_ansible/ansible_report_scanner.rb
|
131
132
|
- app/services/foreman_ansible/api_roles_importer.rb
|
132
133
|
- app/services/foreman_ansible/fact_importer.rb
|
@@ -213,6 +214,7 @@ files:
|
|
213
214
|
- test/unit/lib/foreman_ansible_core/playbook_runner_test.rb
|
214
215
|
- test/unit/lib/foreman_ansible_core/roles_reader_test.rb
|
215
216
|
- test/unit/lib/proxy_api/ansible_test.rb
|
217
|
+
- test/unit/services/ansible_report_importer_test.rb
|
216
218
|
- test/unit/services/api_roles_importer_test.rb
|
217
219
|
- test/unit/services/fact_importer_test.rb
|
218
220
|
- test/unit/services/fact_parser_test.rb
|
@@ -270,6 +272,7 @@ test_files:
|
|
270
272
|
- test/unit/services/api_roles_importer_test.rb
|
271
273
|
- test/unit/services/structured_fact_importer_test.rb
|
272
274
|
- test/unit/services/fact_sparser_test.rb
|
275
|
+
- test/unit/services/ansible_report_importer_test.rb
|
273
276
|
- test/unit/actions/run_proxy_ansible_command_test.rb
|
274
277
|
- test/unit/actions/run_ansible_job_test.rb
|
275
278
|
- test/test_plugin_helper.rb
|