foreman_ansible 1.5.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/app/controllers/foreman_ansible/api/v2/hostgroups_controller_extensions.rb +6 -21
- data/app/controllers/foreman_ansible/api/v2/hosts_controller_extensions.rb +5 -18
- data/app/controllers/foreman_ansible/concerns/hostgroups_controller_extensions.rb +12 -5
- data/app/controllers/foreman_ansible/concerns/hosts_controller_extensions.rb +20 -16
- data/app/controllers/foreman_ansible/concerns/job_invocation_helper.rb +17 -0
- data/app/helpers/foreman_ansible/ansible_plugin_helper.rb +1 -5
- data/app/helpers/foreman_ansible/ansible_reports_helper.rb +2 -1
- data/app/helpers/foreman_ansible/hosts_helper_extensions.rb +19 -18
- data/app/lib/actions/foreman_ansible/helpers/host_common.rb +1 -5
- data/app/models/ansible_role.rb +5 -0
- data/app/models/concerns/foreman_ansible/has_many_ansible_roles.rb +1 -3
- data/app/models/concerns/foreman_ansible/host_managed_extensions.rb +9 -0
- data/app/models/concerns/foreman_ansible/hostgroup_extensions.rb +0 -4
- data/app/models/foreman_ansible/ansible_provider.rb +24 -0
- data/app/models/setting/ansible.rb +4 -1
- data/app/services/foreman_ansible/fact_parser.rb +4 -2
- data/app/services/foreman_ansible/inventory_creator.rb +7 -2
- data/app/services/foreman_ansible/proxy_selector.rb +6 -0
- data/app/services/foreman_ansible/ui_roles_importer.rb +2 -0
- data/app/views/ansible_roles/index.html.erb +1 -2
- data/app/views/foreman_ansible/ansible_roles/_hostgroup_ansible_roles_button.erb +8 -7
- data/app/views/foreman_ansible/job_templates/ansible_roles.erb +17 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20160705082036_create_ansible_role.rb +1 -1
- data/db/migrate/20160706074540_create_join_table_hosts_ansible_roles.rb +1 -1
- data/db/migrate/20160707195442_create_host_ansible_roles.rb +1 -1
- data/db/migrate/20160729094457_add_columns_to_ansible_role.rb +1 -1
- data/db/migrate/20160802153302_create_join_table_hostgroup_ansible_roles.rb +2 -1
- data/db/migrate/20160805094233_add_primary_key_hostgroup_ansible_roles.rb +1 -1
- data/db/migrate/20161122154057_automatically_set_role_timestamps.rb +1 -1
- data/db/seeds.d/75_job_templates.rb +20 -0
- data/lib/foreman_ansible/engine.rb +11 -53
- data/lib/foreman_ansible/register.rb +52 -0
- data/lib/foreman_ansible/remote_execution.rb +22 -0
- data/lib/foreman_ansible/version.rb +1 -1
- data/test/factories/ansible_proxy.rb +1 -1
- data/test/factories/ansible_roles.rb +1 -1
- data/test/functional/ansible_roles_controller_test.rb +4 -2
- data/test/functional/api/v2/ansible_roles_controller_test.rb +5 -3
- data/test/functional/api/v2/hostgroups_controller_test.rb +17 -25
- data/test/functional/api/v2/hosts_controller_test.rb +16 -24
- data/test/functional/hosts_controller_test.rb +33 -29
- data/test/test_plugin_helper.rb +12 -2
- data/test/unit/actions/run_ansible_job_test.rb +0 -0
- data/test/unit/actions/run_proxy_ansible_command_test.rb +0 -0
- data/test/unit/concerns/host_managed_extensions_test.rb +7 -7
- data/test/unit/concerns/hostgroup_extensions_test.rb +6 -6
- data/test/unit/helpers/foreman_ansible/ansible_reports_helper_test.rb +2 -2
- data/test/unit/host_ansible_role_test.rb +2 -2
- data/test/unit/hostgroup_ansible_role_test.rb +2 -2
- data/test/unit/lib/foreman_ansible_core/roles_reader_test.rb +4 -5
- data/test/unit/services/fact_importer_test.rb +3 -5
- data/test/unit/services/fact_parser_test.rb +0 -2
- data/test/unit/services/fact_sparser_test.rb +0 -2
- data/test/unit/services/inventory_creator_test.rb +1 -1
- data/test/unit/services/proxy_selector_test.rb +4 -4
- data/test/unit/services/roles_importer_test.rb +2 -2
- data/test/unit/services/structured_fact_importer_test.rb +1 -1
- data/test/unit/services/ui_roles_importer_test.rb +1 -1
- metadata +44 -31
- data/app/lib/actions/foreman_ansible/play_host_roles.rb +0 -42
- data/app/lib/actions/foreman_ansible/play_hostgroup_roles.rb +0 -56
- data/app/lib/actions/foreman_ansible/play_hosts_roles.rb +0 -26
- data/test/fixtures/ansible_permissions.yml +0 -11
- data/test/support/fixture_support.rb +0 -29
- data/test/support/foreman_tasks/task.rb +0 -48
- data/test/support/foreman_test_helper_additions.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b4137a958734d1507b19751c33bc1c5e91bc321
|
4
|
+
data.tar.gz: c2c57f2e7c31865609c7ba1a0e843edae1dc694e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96aadc541d8c7870a7ad14b8c5ea7a491ea793b4506aafbcf2d148d64c0fd8762d824499f05c484e8d727298e347735bff7a414a1d739713157345923b7f0728
|
7
|
+
data.tar.gz: 04a3d2a65993f39c4a0fedabd0cf08c9bc4fea720edebc7452085effb22d12d020619d318accee167f7e37ffb4ea7037dfd100d00bc5397ea6155b3634b6c005
|
data/Rakefile
CHANGED
@@ -5,10 +5,10 @@ module ForemanAnsible
|
|
5
5
|
module HostgroupsControllerExtensions
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
include ForemanTasks::Triggers
|
8
|
+
include ::ForemanAnsible::Concerns::JobInvocationHelper
|
8
9
|
|
9
10
|
# Included blocks shouldn't be bound by length, as otherwise concerns
|
10
11
|
# cannot extend the method properly.
|
11
|
-
# rubocop:disable BlockLength
|
12
12
|
included do
|
13
13
|
api :POST, '/hostgroups/:id/play_roles',
|
14
14
|
N_('Plays Ansible roles on a hostgroup')
|
@@ -16,14 +16,8 @@ module ForemanAnsible
|
|
16
16
|
|
17
17
|
def play_roles
|
18
18
|
find_resource
|
19
|
-
|
20
|
-
|
21
|
-
:hostgroup => @hostgroup, :foreman_tasks => async_task(
|
22
|
-
::Actions::ForemanAnsible::PlayHostgroupRoles, @hostgroup
|
23
|
-
)
|
24
|
-
}
|
25
|
-
|
26
|
-
render_message @result
|
19
|
+
composer = job_composer(:ansible_run_host, @hostgroup.hosts)
|
20
|
+
process_response composer.trigger!, composer.job_invocation
|
27
21
|
end
|
28
22
|
|
29
23
|
api :POST, '/hostgroups/play_roles',
|
@@ -32,18 +26,9 @@ module ForemanAnsible
|
|
32
26
|
|
33
27
|
def multiple_play_roles
|
34
28
|
find_multiple
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
@hostgroups.uniq.each do |hostgroup|
|
39
|
-
@result.append(
|
40
|
-
:hostgroup => hostgroup, :foreman_tasks => async_task(
|
41
|
-
::Actions::ForemanAnsible::PlayHostgroupRoles, hostgroup
|
42
|
-
)
|
43
|
-
)
|
44
|
-
end
|
45
|
-
|
46
|
-
render_message @result
|
29
|
+
composer = job_composer(:ansible_run_host,
|
30
|
+
@hostgroups.map(&:hosts).flatten.uniq)
|
31
|
+
process_response composer.trigger!, composer.job_invocation
|
47
32
|
end
|
48
33
|
end
|
49
34
|
|
@@ -5,6 +5,7 @@ module ForemanAnsible
|
|
5
5
|
module HostsControllerExtensions
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
include ForemanTasks::Triggers
|
8
|
+
include ::ForemanAnsible::Concerns::JobInvocationHelper
|
8
9
|
|
9
10
|
included do
|
10
11
|
api :POST, '/hosts/:id/play_roles',
|
@@ -12,30 +13,16 @@ module ForemanAnsible
|
|
12
13
|
param :id, String, :required => true
|
13
14
|
|
14
15
|
def play_roles
|
15
|
-
|
16
|
-
|
17
|
-
::Actions::ForemanAnsible::PlayHostRoles, @host
|
18
|
-
)
|
19
|
-
}
|
20
|
-
|
21
|
-
render_message @result
|
16
|
+
composer = job_composer(:ansible_run_host, @host)
|
17
|
+
process_response composer.trigger!, composer.job_invocation
|
22
18
|
end
|
23
19
|
|
24
20
|
api :POST, '/hosts/play_roles', N_('Plays Ansible roles on hosts')
|
25
21
|
param :id, Array, :required => true
|
26
22
|
|
27
23
|
def multiple_play_roles
|
28
|
-
|
29
|
-
|
30
|
-
@host.each do |item|
|
31
|
-
@result.append(
|
32
|
-
:host => item, :foreman_tasks => async_task(
|
33
|
-
::Actions::ForemanAnsible::PlayHostRoles, item
|
34
|
-
)
|
35
|
-
)
|
36
|
-
end
|
37
|
-
|
38
|
-
render_message @result
|
24
|
+
composer = job_composer(:ansible_run_host, @host)
|
25
|
+
process_response composer.trigger!, composer.job_invocation
|
39
26
|
end
|
40
27
|
end
|
41
28
|
|
@@ -4,14 +4,14 @@ module ForemanAnsible
|
|
4
4
|
module HostgroupsControllerExtensions
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
include ForemanTasks::Triggers
|
7
|
+
include ::ForemanAnsible::Concerns::JobInvocationHelper
|
7
8
|
|
8
9
|
def play_roles
|
9
10
|
find_resource
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
)
|
14
|
-
redirect_to task
|
11
|
+
check_hostgroup
|
12
|
+
composer = job_composer(:ansible_run_host, @hostgroup.hosts)
|
13
|
+
composer.trigger
|
14
|
+
redirect_to job_invocation_path(composer.job_invocation)
|
15
15
|
rescue Foreman::Exception => e
|
16
16
|
error e.message
|
17
17
|
redirect_to hostgroups_path
|
@@ -19,6 +19,13 @@ module ForemanAnsible
|
|
19
19
|
|
20
20
|
private
|
21
21
|
|
22
|
+
def check_hostgroup
|
23
|
+
return unless @hostgroup.hosts.empty?
|
24
|
+
raise ::Foreman::Exception.new(
|
25
|
+
N_('Host group has no associated hosts')
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
22
29
|
def action_permission
|
23
30
|
case params[:action]
|
24
31
|
when 'play_roles'
|
@@ -4,15 +4,29 @@ module ForemanAnsible
|
|
4
4
|
module HostsControllerExtensions
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
include ForemanTasks::Triggers
|
7
|
+
include JobInvocationHelper
|
8
|
+
|
9
|
+
# Overrides to methods in the original hosts controller
|
10
|
+
module Overrides
|
11
|
+
def action_permission
|
12
|
+
case params[:action]
|
13
|
+
when 'multiple_play_roles', 'play_roles'
|
14
|
+
:view
|
15
|
+
else
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
7
20
|
|
8
21
|
included do
|
9
|
-
|
22
|
+
prepend Overrides
|
10
23
|
end
|
11
24
|
|
12
25
|
def play_roles
|
13
26
|
find_resource
|
14
|
-
|
15
|
-
|
27
|
+
composer = job_composer(:ansible_run_host, @host)
|
28
|
+
composer.trigger
|
29
|
+
redirect_to job_invocation_path(composer.job_invocation)
|
16
30
|
rescue Foreman::Exception => e
|
17
31
|
error e.message
|
18
32
|
redirect_to host_path(@host)
|
@@ -20,23 +34,13 @@ module ForemanAnsible
|
|
20
34
|
|
21
35
|
def multiple_play_roles
|
22
36
|
find_multiple
|
23
|
-
|
24
|
-
|
37
|
+
composer = job_composer(:ansible_run_host, @hosts)
|
38
|
+
composer.trigger
|
39
|
+
redirect_to job_invocation_path(composer.job_invocation)
|
25
40
|
rescue Foreman::Exception => e
|
26
41
|
error e.message
|
27
42
|
redirect_to hosts_path
|
28
43
|
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def action_permission_with_ansible
|
33
|
-
case params[:action]
|
34
|
-
when 'multiple_play_roles', 'play_roles'
|
35
|
-
:view
|
36
|
-
else
|
37
|
-
action_permission_without_ansible
|
38
|
-
end
|
39
|
-
end
|
40
44
|
end
|
41
45
|
end
|
42
46
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
module Concerns
|
3
|
+
# Helpers to compose the JobInvocation in other controllers
|
4
|
+
module JobInvocationHelper
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def job_composer(feature_name, target)
|
8
|
+
composer = ::JobInvocationComposer.for_feature(feature_name, target)
|
9
|
+
return composer if composer.save
|
10
|
+
raise ::Foreman::Exception.new(
|
11
|
+
format(N_('Could not run Ansible roles for %{host}'),
|
12
|
+
:host => target)
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,12 +1,8 @@
|
|
1
|
-
require "#{ForemanAnsible::Engine.root}/lib/foreman_ansible/version"
|
2
|
-
|
3
1
|
module ForemanAnsible
|
4
2
|
# General helper for foreman_ansible
|
5
3
|
module AnsiblePluginHelper
|
6
4
|
def ansible_doc_url
|
7
|
-
|
8
|
-
'https://theforeman.org/plugins/foreman_ansible/'\
|
9
|
-
"#{major_version}.x/index.html"
|
5
|
+
'http://theforeman.org/plugins/foreman_ansible/1.x/index.html'
|
10
6
|
end
|
11
7
|
end
|
12
8
|
end
|
@@ -22,7 +22,8 @@ module ForemanAnsible
|
|
22
22
|
|
23
23
|
def ansible_report?(log)
|
24
24
|
module_name(log).present?
|
25
|
-
|
25
|
+
# Failures when parsing the log indicates it's not an Ansible report
|
26
|
+
rescue StandardError
|
26
27
|
false
|
27
28
|
end
|
28
29
|
end
|
@@ -3,9 +3,26 @@ module ForemanAnsible
|
|
3
3
|
module HostsHelperExtensions
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
+
module Overrides
|
7
|
+
def host_title_actions(*args)
|
8
|
+
host = args.first
|
9
|
+
if ansible_roles_present?(host)
|
10
|
+
button = ansible_roles_button(host)
|
11
|
+
title_actions(button_group(button))
|
12
|
+
end
|
13
|
+
super(*args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def multiple_actions
|
17
|
+
super +
|
18
|
+
[[_('Play Ansible roles'),
|
19
|
+
multiple_play_roles_hosts_path,
|
20
|
+
false]]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
6
24
|
included do
|
7
|
-
|
8
|
-
alias_method_chain(:multiple_actions, :run_ansible_roles)
|
25
|
+
prepend Overrides
|
9
26
|
end
|
10
27
|
|
11
28
|
def ansible_roles_present?(host)
|
@@ -22,21 +39,5 @@ module ForemanAnsible
|
|
22
39
|
:'data-no-turbolink' => true
|
23
40
|
)
|
24
41
|
end
|
25
|
-
|
26
|
-
def host_title_actions_with_run_ansible_roles(*args)
|
27
|
-
host = args.first
|
28
|
-
if ansible_roles_present?(host)
|
29
|
-
button = ansible_roles_button(host)
|
30
|
-
title_actions(button_group(button))
|
31
|
-
end
|
32
|
-
host_title_actions_without_run_ansible_roles(*args)
|
33
|
-
end
|
34
|
-
|
35
|
-
def multiple_actions_with_run_ansible_roles
|
36
|
-
multiple_actions_without_run_ansible_roles +
|
37
|
-
[[_('Play Ansible roles'),
|
38
|
-
multiple_play_roles_hosts_path,
|
39
|
-
false]]
|
40
|
-
end
|
41
42
|
end
|
42
43
|
end
|
@@ -20,15 +20,11 @@ module Actions
|
|
20
20
|
continuous_output.humanize
|
21
21
|
end
|
22
22
|
|
23
|
-
def continuous_output_providers
|
24
|
-
super << self
|
25
|
-
end
|
26
|
-
|
27
23
|
def fill_continuous_output(continuous_output)
|
28
24
|
delegated_output.fetch('result', []).each do |raw_output|
|
29
25
|
continuous_output.add_raw_output(raw_output)
|
30
26
|
end
|
31
|
-
rescue => e
|
27
|
+
rescue StandardError => e
|
32
28
|
continuous_output.add_exception(_('Error loading data from proxy'), e)
|
33
29
|
end
|
34
30
|
|
data/app/models/ansible_role.rb
CHANGED
@@ -33,3 +33,12 @@ module ForemanAnsible
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
36
|
+
|
37
|
+
module Host
|
38
|
+
class Managed
|
39
|
+
# Methods to be allowed in any template with safemode enabled
|
40
|
+
class Jail < Safemode::Jail
|
41
|
+
allow :all_ansible_roles, :ansible_roles, :inherited_ansible_roles
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
if defined? ForemanRemoteExecution
|
2
|
+
module ForemanAnsible
|
3
|
+
# Provider for RemoteExecution that allows to run Ansible playbooks.
|
4
|
+
# Read the source of other RemoteExecution providers for more.
|
5
|
+
class AnsibleProvider < RemoteExecutionProvider
|
6
|
+
class << self
|
7
|
+
def humanized_name
|
8
|
+
'Ansible'
|
9
|
+
end
|
10
|
+
|
11
|
+
def host_setting(host, setting)
|
12
|
+
host.params[setting.to_s] || Setting[setting]
|
13
|
+
end
|
14
|
+
|
15
|
+
def proxy_command_options(template_invocation, host)
|
16
|
+
super(template_invocation, host).merge(
|
17
|
+
'ansible_inventory' =>
|
18
|
+
::ForemanAnsible::InventoryCreator.new([host]).to_hash.to_json
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -10,7 +10,6 @@ class Setting
|
|
10
10
|
# rubocop:disable BlockLength
|
11
11
|
def load_defaults
|
12
12
|
return unless super
|
13
|
-
Setting::BLANK_ATTRS.push('ansible_ssh_private_key_file')
|
14
13
|
transaction do
|
15
14
|
[
|
16
15
|
set(
|
@@ -86,6 +85,7 @@ class Setting
|
|
86
85
|
'3' => N_('Level 3 (-vvv)'),
|
87
86
|
'4' => N_('Level 4 (-vvvv)') }
|
88
87
|
end
|
88
|
+
# rubocop:enable BlockLength
|
89
89
|
),
|
90
90
|
set(
|
91
91
|
'ansible_post_provision_timeout',
|
@@ -100,8 +100,11 @@ class Setting
|
|
100
100
|
create(s.update(:category => 'Setting::Ansible'))
|
101
101
|
end
|
102
102
|
end
|
103
|
+
Setting::BLANK_ATTRS.push('ansible_ssh_private_key_file')
|
103
104
|
true
|
104
105
|
end
|
106
|
+
# rubocop:enable AbcSize
|
107
|
+
# rubocop:enable MethodLength
|
105
108
|
|
106
109
|
def humanized_category
|
107
110
|
N_('Ansible')
|
@@ -14,7 +14,8 @@ module ForemanAnsible
|
|
14
14
|
Operatingsystem.create!(args.merge(:description => os_description))
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
# Don't do anything as there's no env in Ansible
|
18
|
+
def environment; end
|
18
19
|
|
19
20
|
def architecture
|
20
21
|
name = facts[:ansible_architecture] || facts[:facter_architecture]
|
@@ -43,7 +44,7 @@ module ForemanAnsible
|
|
43
44
|
#
|
44
45
|
# This method overrides app/services/fact_parser.rb on Foreman and returns
|
45
46
|
# an array of interface names, ['eth0', 'wlan1', etc...]
|
46
|
-
def get_interfaces # rubocop:disable
|
47
|
+
def get_interfaces # rubocop:disable Naming/AccessorMethodName
|
47
48
|
pref = facts[:ansible_default_ipv4] &&
|
48
49
|
facts[:ansible_default_ipv4]['interface']
|
49
50
|
if pref.present?
|
@@ -103,6 +104,7 @@ module ForemanAnsible
|
|
103
104
|
(facts[:version].split('R')[0] if os_name == 'junos')
|
104
105
|
end
|
105
106
|
end
|
107
|
+
# rubocop:enable AbcSize, CyclomaticComplexity, PerceivedComplexity
|
106
108
|
|
107
109
|
def os_release
|
108
110
|
facts[:ansible_distribution_version] ||
|