foreman_ansible 2.3.1 → 2.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/api/v2/ansible_override_values_controller.rb +2 -2
- data/app/controllers/foreman_ansible/api/v2/hostgroups_controller_extensions.rb +20 -3
- data/app/controllers/foreman_ansible/api/v2/hosts_controller_extensions.rb +20 -3
- data/app/controllers/foreman_ansible/concerns/api_common.rb +17 -0
- data/app/helpers/foreman_ansible/hosts_helper_extensions.rb +0 -20
- data/app/models/concerns/foreman_ansible/host_managed_extensions.rb +1 -16
- data/app/services/foreman_ansible/ansible_info.rb +18 -0
- data/app/services/foreman_ansible/insights_plan_runner.rb +2 -1
- data/app/services/foreman_ansible/inventory_creator.rb +6 -2
- data/app/services/foreman_ansible/operating_system_parser.rb +3 -7
- data/app/views/ansible_roles/index.html.erb +1 -1
- data/app/views/ansible_variables/_fields.erb +67 -0
- data/app/views/ansible_variables/edit.html.erb +1 -1
- data/app/views/ansible_variables/index.html.erb +5 -5
- data/config/routes.rb +9 -6
- data/db/seeds.d/90_notification_blueprints.rb +1 -1
- data/lib/foreman_ansible/register.rb +12 -2
- data/lib/foreman_ansible/remote_execution.rb +3 -2
- data/lib/foreman_ansible/version.rb +1 -1
- data/test/functional/api/v2/hostgroups_controller_test.rb +13 -0
- data/test/functional/api/v2/hosts_controller_test.rb +14 -0
- data/test/unit/services/fact_parser_test.rb +10 -4
- data/test/unit/services/inventory_creator_test.rb +1 -1
- metadata +5 -5
- data/app/overrides/ansible_variables_edit.rb +0 -15
- data/app/views/ansible_variables/_ansible_roles_list.html.erb +0 -15
- data/app/views/ansible_variables/_validator_text.html.erb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3dd4a02656d2b41202e38c91fda9cd2b5b7bfb08
|
4
|
+
data.tar.gz: a7f7f75580a6d389b09dd3a1bb47c4420b1ffab2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52866dabe9b2a7bac15bc23920541c896cc337304a1bafcfbe057645ea73c85939cdbc989cec226c7f32f61b254891b345b7720bb1d771074f25ece5feea4d39
|
7
|
+
data.tar.gz: afdbf297b5fe851adb1a71352b7b821b109d203ad094b51ede3f0d7f3658ea0d358f84022040c056bccf8e12b0810e9b68e2c7db0ae3c15488a44825080bc29c
|
@@ -25,7 +25,7 @@ module Api
|
|
25
25
|
|
26
26
|
def create
|
27
27
|
@ansible_variable = AnsibleVariable.authorized(:edit_external_variables).
|
28
|
-
|
28
|
+
find_by(:id => params[:ansible_variable_id].to_i)
|
29
29
|
@override_value = @ansible_variable.lookup_values.create!(lookup_value_params['override_value'])
|
30
30
|
@ansible_variable.update_attribute(:override, true)
|
31
31
|
render 'api/v2/ansible_override_values/show'
|
@@ -35,7 +35,7 @@ module Api
|
|
35
35
|
param :id, :identifier, :required => true
|
36
36
|
|
37
37
|
def destroy
|
38
|
-
@override_value = LookupValue.
|
38
|
+
@override_value = LookupValue.find_by(:id => params[:id])
|
39
39
|
if @override_value
|
40
40
|
@ansible_variable = AnsibleVariable.where(:id => @override_value.lookup_key_id)
|
41
41
|
@override_value.destroy
|
@@ -8,11 +8,14 @@ module ForemanAnsible
|
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
include ForemanTasks::Triggers
|
10
10
|
include ::ForemanAnsible::Concerns::JobInvocationHelper
|
11
|
+
include ::ForemanAnsible::Concerns::ApiCommon
|
11
12
|
|
12
13
|
# Included blocks shouldn't be bound by length, as otherwise concerns
|
13
14
|
# cannot extend the method properly.
|
14
|
-
# rubocop:disable BlockLength
|
15
|
+
# rubocop:disable BlockLength, Rails/LexicallyScopedActionFilter
|
15
16
|
included do
|
17
|
+
before_action :find_ansible_roles, :only => [:assign_ansible_roles]
|
18
|
+
|
16
19
|
api :POST, '/hostgroups/:id/play_roles',
|
17
20
|
N_('Plays Ansible roles on a hostgroup')
|
18
21
|
param :id, :identifier, :required => true
|
@@ -42,10 +45,23 @@ module ForemanAnsible
|
|
42
45
|
def ansible_roles
|
43
46
|
find_resource
|
44
47
|
return unless @hostgroup
|
48
|
+
|
45
49
|
@ansible_roles = @hostgroup.all_ansible_roles
|
46
50
|
end
|
51
|
+
|
52
|
+
api :POST, '/hostgroups/:id/assign_ansible_roles',
|
53
|
+
N_('Assigns Ansible roles to a hostgroup')
|
54
|
+
param :id, :identifier, :required => true
|
55
|
+
param :ansible_role_ids, Array,
|
56
|
+
N_('Ansible roles to assign to a hostgroup'),
|
57
|
+
:required => true
|
58
|
+
|
59
|
+
def assign_ansible_roles
|
60
|
+
find_resource
|
61
|
+
process_response @hostgroup.update(:ansible_roles => @ansible_roles)
|
62
|
+
end
|
47
63
|
end
|
48
|
-
# rubocop:enable BlockLength
|
64
|
+
# rubocop:enable BlockLength, Rails/LexicallyScopedActionFilter
|
49
65
|
|
50
66
|
private
|
51
67
|
|
@@ -64,7 +80,8 @@ module ForemanAnsible
|
|
64
80
|
|
65
81
|
def action_permission
|
66
82
|
case params[:action]
|
67
|
-
when 'play_roles', 'multiple_play_roles', 'ansible_roles'
|
83
|
+
when 'play_roles', 'multiple_play_roles', 'ansible_roles',
|
84
|
+
'assign_ansible_roles'
|
68
85
|
:view
|
69
86
|
else
|
70
87
|
super
|
@@ -8,13 +8,17 @@ module ForemanAnsible
|
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
include ForemanTasks::Triggers
|
10
10
|
include ::ForemanAnsible::Concerns::JobInvocationHelper
|
11
|
+
include ::ForemanAnsible::Concerns::ApiCommon
|
11
12
|
|
12
13
|
# Included blocks shouldn't be bound by length, as otherwise concerns
|
13
14
|
# cannot extend the method properly.
|
14
|
-
# rubocop:disable BlockLength
|
15
|
+
# rubocop:disable BlockLength, Rails/LexicallyScopedActionFilter
|
15
16
|
included do
|
17
|
+
before_action :find_ansible_roles, :only => [:assign_ansible_roles]
|
18
|
+
|
16
19
|
def find_resource
|
17
20
|
return true if params[:action] == 'multiple_play_roles'
|
21
|
+
|
18
22
|
super
|
19
23
|
end
|
20
24
|
|
@@ -44,16 +48,29 @@ module ForemanAnsible
|
|
44
48
|
|
45
49
|
def ansible_roles
|
46
50
|
return unless @host
|
51
|
+
|
47
52
|
@ansible_roles = @host.all_ansible_roles
|
48
53
|
end
|
54
|
+
|
55
|
+
api :POST, '/hosts/:id/assign_ansible_roles',
|
56
|
+
N_('Assigns Ansible roles to a host')
|
57
|
+
param :id, :identifier, :required => true
|
58
|
+
param :ansible_role_ids, Array,
|
59
|
+
N_('Ansible roles to assign to a host'),
|
60
|
+
:required => true
|
61
|
+
|
62
|
+
def assign_ansible_roles
|
63
|
+
process_response @host.update(:ansible_roles => @ansible_roles)
|
64
|
+
end
|
49
65
|
end
|
50
|
-
# rubocop:enable BlockLength
|
66
|
+
# rubocop:enable BlockLength, Rails/LexicallyScopedActionFilter
|
51
67
|
|
52
68
|
private
|
53
69
|
|
54
70
|
def action_permission
|
55
71
|
case params[:action]
|
56
|
-
when 'play_roles', 'multiple_play_roles', 'ansible_roles'
|
72
|
+
when 'play_roles', 'multiple_play_roles', 'ansible_roles',
|
73
|
+
'assign_ansible_roles'
|
57
74
|
:view
|
58
75
|
else
|
59
76
|
super
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanAnsible
|
4
|
+
module Concerns
|
5
|
+
# Shared task methods between api controllers
|
6
|
+
module ApiCommon
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
def find_ansible_roles
|
10
|
+
ids = params.fetch(:ansible_role_ids, []) || []
|
11
|
+
@ansible_roles = AnsibleRole.authorized(:view_ansible_roles).find(ids)
|
12
|
+
rescue ActiveRecord::RecordNotFound => e
|
13
|
+
not_found(e.message)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -6,16 +6,6 @@ module ForemanAnsible
|
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
module Overrides
|
9
|
-
def host_title_actions(*args)
|
10
|
-
host = args.first
|
11
|
-
if ansible_roles_present?(host) &&
|
12
|
-
User.current.can?(:create_job_invocations)
|
13
|
-
button = ansible_roles_button(host)
|
14
|
-
title_actions(button_group(button))
|
15
|
-
end
|
16
|
-
super(*args)
|
17
|
-
end
|
18
|
-
|
19
9
|
def multiple_actions
|
20
10
|
actions = super
|
21
11
|
if User.current.can?(:create_job_invocations) &&
|
@@ -36,15 +26,5 @@ module ForemanAnsible
|
|
36
26
|
host.ansible_roles.present? ||
|
37
27
|
host.inherited_ansible_roles.present?
|
38
28
|
end
|
39
|
-
|
40
|
-
def ansible_roles_button(host)
|
41
|
-
display_link_if_authorized(
|
42
|
-
_('Run Ansible roles'),
|
43
|
-
hash_for_play_roles_host_path(:id => host.id),
|
44
|
-
:id => :ansible_roles_button,
|
45
|
-
:class => 'btn btn-default',
|
46
|
-
:'data-no-turbolink' => true
|
47
|
-
)
|
48
|
-
end
|
49
29
|
end
|
50
30
|
end
|
@@ -13,7 +13,7 @@ module ForemanAnsible
|
|
13
13
|
has_many :ansible_roles, :through => :host_ansible_roles,
|
14
14
|
:dependent => :destroy
|
15
15
|
scoped_search :relation => :ansible_roles, :on => :name,
|
16
|
-
:complete_value => true, :rename => :
|
16
|
+
:complete_value => true, :rename => :ansible_role,
|
17
17
|
:only_explicit => true
|
18
18
|
|
19
19
|
before_provision :play_ansible_roles
|
@@ -53,21 +53,6 @@ module ForemanAnsible
|
|
53
53
|
(ansible_roles + inherited_ansible_roles).uniq
|
54
54
|
end
|
55
55
|
|
56
|
-
def host_params_hash
|
57
|
-
values = AnsibleVariable.where(:ansible_role_id => all_ansible_roles.pluck(:id)).
|
58
|
-
values_hash(self).raw.values
|
59
|
-
transformed = values.each_with_object({}) do |item, memo|
|
60
|
-
item.map do |name, hash|
|
61
|
-
variable = AnsibleVariable.find_by :key => name
|
62
|
-
safe_value = variable.hidden_value? ? variable.safe_value : hash[:value]
|
63
|
-
memo[name] = { :value => hash[:value], :safe_value => safe_value, :source => 'global' }
|
64
|
-
end
|
65
|
-
memo
|
66
|
-
end
|
67
|
-
|
68
|
-
super.merge transformed
|
69
|
-
end
|
70
|
-
|
71
56
|
# rubocop:enable Metrics/BlockLength
|
72
57
|
# Class methods we may need to override or add
|
73
58
|
module ClassMethods
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
class AnsibleInfo < ::HostInfo::Provider
|
3
|
+
def host_info
|
4
|
+
{ 'parameters' => ansible_params }
|
5
|
+
end
|
6
|
+
|
7
|
+
def ansible_params
|
8
|
+
variables = AnsibleVariable.where(:ansible_role_id => host.all_ansible_roles.pluck(:id), :override => true)
|
9
|
+
values = variables.values_hash(host)
|
10
|
+
|
11
|
+
variables.each_with_object({}) do |var, memo|
|
12
|
+
value = values[var]
|
13
|
+
memo[var.key] = value if value
|
14
|
+
memo
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -32,7 +32,8 @@ if defined?(RedhatAccess)
|
|
32
32
|
resource = RestClient::Resource.new(
|
33
33
|
"#{insights_api_host}/r/insights/"\
|
34
34
|
"v3/maintenance/#{@plan_id}/playbook",
|
35
|
-
get_ssl_options_for_org(@organization, nil)
|
35
|
+
get_ssl_options_for_org(@organization, nil).\
|
36
|
+
merge(:proxy => get_portal_http_proxy)
|
36
37
|
)
|
37
38
|
@raw_playbook = resource.get.body
|
38
39
|
YAML.safe_load(@raw_playbook)
|
@@ -22,7 +22,7 @@ module ForemanAnsible
|
|
22
22
|
hosts = @hosts.map(&:name)
|
23
23
|
|
24
24
|
{ 'all' => { 'hosts' => hosts,
|
25
|
-
'vars'
|
25
|
+
'vars' => template_inputs(@template_invocation) },
|
26
26
|
'_meta' => { 'hostvars' => hosts_vars } }
|
27
27
|
end
|
28
28
|
|
@@ -43,7 +43,7 @@ module ForemanAnsible
|
|
43
43
|
if Setting['top_level_ansible_vars']
|
44
44
|
result = result.merge(host_params(host))
|
45
45
|
end
|
46
|
-
result
|
46
|
+
result.merge(ansible_params(host))
|
47
47
|
end
|
48
48
|
|
49
49
|
def connection_params(host)
|
@@ -68,6 +68,10 @@ module ForemanAnsible
|
|
68
68
|
render_rabl(host, 'api/v2/hosts/main')
|
69
69
|
end
|
70
70
|
|
71
|
+
def ansible_params(host)
|
72
|
+
ForemanAnsible::AnsibleInfo.new(host).ansible_params
|
73
|
+
end
|
74
|
+
|
71
75
|
def host_params(host)
|
72
76
|
host.host_params
|
73
77
|
end
|
@@ -5,7 +5,7 @@ module ForemanAnsible
|
|
5
5
|
module OperatingSystemParser
|
6
6
|
def operatingsystem
|
7
7
|
args = { :name => os_name, :major => os_major, :minor => os_minor }
|
8
|
-
args[:release_name] = os_release_name if os_name == 'Debian'
|
8
|
+
args[:release_name] = os_release_name if os_name == 'Debian' || os_name == 'Ubuntu'
|
9
9
|
return @local_os if local_os(args).present?
|
10
10
|
return @new_os if new_os(args).present?
|
11
11
|
logger.debug do
|
@@ -40,13 +40,9 @@ module ForemanAnsible
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
def deb_release_map
|
44
|
-
{ '7' => 'wheezy', '8' => 'jessie', '9' => 'stretch', '10' => 'buster' }
|
45
|
-
end
|
46
|
-
|
47
43
|
def os_release_name
|
48
|
-
return ''
|
49
|
-
|
44
|
+
return '' if os_name != 'Debian' && os_name != 'Ubuntu'
|
45
|
+
facts[:ansible_distribution_release]
|
50
46
|
end
|
51
47
|
|
52
48
|
# rubocop:disable AbcSize, CyclomaticComplexity, PerceivedComplexity
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<tr>
|
19
19
|
<td class="ellipsis"><%= role.name %></td>
|
20
20
|
<td class="ellipsis"><%= role.hostgroups.count %></td>
|
21
|
-
<td class="ellipsis"><%= link_to role.hosts.count, hosts_path(:search => "
|
21
|
+
<td class="ellipsis"><%= link_to role.hosts.count, hosts_path(:search => "ansible_role = #{role.name}")%></td>
|
22
22
|
<td class="ellipsis"><%= import_time role %></td>
|
23
23
|
<td>
|
24
24
|
<%
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<div id='<%= f.object.to_param %>' class='tab-pane fields'>
|
2
|
+
<fieldset>
|
3
|
+
<h2><%= _("Ansible Variable Details") %></h2>
|
4
|
+
<%= text_f f, :key, :disabled => true, :size => "col-md-8" %>
|
5
|
+
<%= f.hidden_field :key %>
|
6
|
+
<%= textarea_f f, :description, :rows => :auto, :size => "col-md-8", :class => "no-stretch" %>
|
7
|
+
<%= select_f f, :ansible_role_id, [f.object.ansible_role], :id, :to_label, {}, :label => _("Ansible Role"), :disabled => true %>
|
8
|
+
</fieldset>
|
9
|
+
<fieldset>
|
10
|
+
<h2><%= _("Default Behavior") %></h2>
|
11
|
+
<h6><%= _("Override the default value of the Ansible variable.") %></h6>
|
12
|
+
<%= checkbox_f(f, :override, :onchange => 'toggleOverrideValue(this)', :size => "col-md-8",
|
13
|
+
:label_help => _('Mark the variable to be managed by Foreman. When the Ansible role of this variable is assigned to a host, the default value will be added to Ansible inventory as a host variable. Specify matchers to set a different value for such variable.')
|
14
|
+
) %>
|
15
|
+
<%= param_type_selector(f, false, :onchange => 'keyTypeChange(this)', :disabled => !f.object.override) %>
|
16
|
+
<%= textarea_f f, :default_value, :value => f.object.default_value_before_type_cast, :size => "col-md-8",
|
17
|
+
:disabled => (!f.object.override || f.object.omit),
|
18
|
+
:input_group_btn => fullscreen_input,
|
19
|
+
:rows => 1,
|
20
|
+
:label_help => _("Value to use when there is no match."),
|
21
|
+
:class => "no-stretch #{'masked-input' if f.object.hidden_value?}" %>
|
22
|
+
<div class="form-group">
|
23
|
+
<%= checkbox_f(f, :hidden_value, :label => _('Hidden Value'),
|
24
|
+
:class => 'hidden_value_textarea_switch', :onchange => 'toggle_lookupkey_hidden(this)',
|
25
|
+
:checked => f.object.hidden_value?,
|
26
|
+
:label_help => _("Hide all values for this parameter."),
|
27
|
+
:size => "col-md-1", :label_size => "col-md-2", :table_field => true,
|
28
|
+
:disabled => !f.object.override) %>
|
29
|
+
</div>
|
30
|
+
</fieldset>
|
31
|
+
<fieldset>
|
32
|
+
<%= collapsing_header _("Optional Input Validator"), "#optional_input_validators_#{f.object.id}", "collapsed" %>
|
33
|
+
<div id="optional_input_validators_<%= f.object.id %>" class="collapse out">
|
34
|
+
<h6><%= _('Before including these variables on your playbooks, Foreman will validate that your variables comply with the validation.') %></h6>
|
35
|
+
|
36
|
+
<%= checkbox_f(f, :required, :size => "col-md-8", :disabled => !f.object.override,
|
37
|
+
:label_help => _("If checked, will raise an error if there is no default value and no matcher provide a value.")
|
38
|
+
) %>
|
39
|
+
<%= validator_type_selector f %>
|
40
|
+
<%= text_f f, :validator_rule, :size => "col-md-8", :disabled => f.object.validator_type.blank?, :class => "no-stretch" %>
|
41
|
+
</div>
|
42
|
+
</fieldset>
|
43
|
+
</br>
|
44
|
+
<div class="matcher-parent" <%= "id=#{f.object.key.to_s.gsub(' ', '_')}_lookup_key_override_value" %> style=<%= "display:none;" if !f.object.override %>>
|
45
|
+
<fieldset>
|
46
|
+
<h2><%= _("Prioritize Attribute Order") %></h2>
|
47
|
+
<h6><%= _("Set the order in which values are resolved.") %></h6>
|
48
|
+
<%= textarea_f f, :path, :rows => :auto, :label => _("Order"), :id => 'order', :size => "col-md-8", :onchange => 'fill_in_matchers()', :value => f.object.path, :class => "no-stretch",
|
49
|
+
:label_help => _("The order in which matchers keys are processed, first match wins.<br> You may use multiple attributes as a matcher key, for example, an order of <code>host group, environment</code> would expect a matcher such as <code>hostgroup = \"web servers\", environment = production</code>").html_safe %>
|
50
|
+
<%= checkbox_f(f, :merge_overrides, :onchange => 'mergeOverridesChanged(this)', :table_field => true,
|
51
|
+
:disabled => !f.object.supports_merge?, :size => "col-md-1", :label_size => "col-md-2",
|
52
|
+
:label_help => _("Continue to look for matches after first find (only array/hash type)? Note: merging overrides ignores all matchers that are omitted.")) %>
|
53
|
+
<%= checkbox_f(f, :merge_default, :disabled => !f.object.merge_overrides, :size => "col-md-1", :table_field => true,
|
54
|
+
:label_size => "col-md-2", :label_help => _("Include default value when merging all matching values.")) %>
|
55
|
+
<%= checkbox_f(f, :avoid_duplicates, :disabled => (!f.object.supports_uniq? || !f.object.merge_overrides),
|
56
|
+
:size => "col-md-1", :label_size => "col-md-2", :table_field => true,
|
57
|
+
:label_help => _("Avoid duplicate values when merging them (only array type)?")) %>
|
58
|
+
</fieldset>
|
59
|
+
</br>
|
60
|
+
<fieldset>
|
61
|
+
<h2><%= _("Specify Matchers") %> <%= documentation_button('4.2.6SmartMatchers') %></h2>
|
62
|
+
<div class="children_fields lookup_values">
|
63
|
+
<%= render 'lookup_keys/values', :f => f, :is_param => false %>
|
64
|
+
</div>
|
65
|
+
</fieldset>
|
66
|
+
</div>
|
67
|
+
</div>
|
@@ -16,11 +16,11 @@
|
|
16
16
|
<% @ansible_variables.each do |variable| %>
|
17
17
|
<tr>
|
18
18
|
<td class="ellipsis"><%= link_to_if_authorized(
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
icon_text((variable.override ? "flag": ""), variable.key.to_s, :kind => 'fa', :title => _('Overriden')),
|
20
|
+
hash_for_edit_ansible_variable_path(:id => variable).
|
21
|
+
merge(:auth_object => variable,
|
22
|
+
:permission => 'edit_external_parameters',
|
23
|
+
:authorizer => authorizer)
|
24
24
|
) %></td>
|
25
25
|
<td class="ellipsis"><%= link_to_if_authorized(
|
26
26
|
variable.ansible_role.name,
|
data/config/routes.rb
CHANGED
@@ -4,9 +4,9 @@
|
|
4
4
|
Rails.application.routes.draw do
|
5
5
|
namespace :api do
|
6
6
|
scope '(:apiv)',
|
7
|
-
:module
|
8
|
-
:defaults
|
9
|
-
:apiv
|
7
|
+
:module => :v2,
|
8
|
+
:defaults => { :apiv => 'v2' },
|
9
|
+
:apiv => /v1|v2/,
|
10
10
|
:constraints => ApiConstraints.new(:version => 2) do
|
11
11
|
|
12
12
|
constraints(:id => %r{[^\/]+}) do
|
@@ -14,6 +14,7 @@ Rails.application.routes.draw do
|
|
14
14
|
member do
|
15
15
|
post :play_roles
|
16
16
|
get :ansible_roles
|
17
|
+
post :assign_ansible_roles
|
17
18
|
end
|
18
19
|
collection do
|
19
20
|
post :multiple_play_roles
|
@@ -23,6 +24,7 @@ Rails.application.routes.draw do
|
|
23
24
|
member do
|
24
25
|
post :play_roles
|
25
26
|
get :ansible_roles
|
27
|
+
post :assign_ansible_roles
|
26
28
|
end
|
27
29
|
collection do
|
28
30
|
post :multiple_play_roles
|
@@ -52,6 +54,7 @@ Rails.application.routes.draw do
|
|
52
54
|
collection do
|
53
55
|
get :import
|
54
56
|
post :confirm_import
|
57
|
+
get 'auto_complete_search'
|
55
58
|
end
|
56
59
|
end
|
57
60
|
|
@@ -66,9 +69,9 @@ Rails.application.routes.draw do
|
|
66
69
|
|
67
70
|
namespace :api do
|
68
71
|
scope '(:apiv)',
|
69
|
-
:module
|
70
|
-
:defaults
|
71
|
-
:apiv
|
72
|
+
:module => :v2,
|
73
|
+
:defaults => { :apiv => 'v2' },
|
74
|
+
:apiv => /v1|v2/,
|
72
75
|
:constraints => ApiConstraints.new(:version => 2) do
|
73
76
|
|
74
77
|
resources :ansible_roles, :only => [:show, :index, :destroy] do
|
@@ -16,7 +16,7 @@ Foreman::Plugin.register :foreman_ansible do
|
|
16
16
|
:multiple_play_roles] },
|
17
17
|
:resource_type => 'Hostgroup'
|
18
18
|
permission :view_ansible_roles,
|
19
|
-
{ :ansible_roles => [:index],
|
19
|
+
{ :ansible_roles => [:index, :auto_complete_search],
|
20
20
|
:'api/v2/ansible_roles' => [:index, :show, :fetch] },
|
21
21
|
:resource_type => 'AnsibleRole'
|
22
22
|
permission :destroy_ansible_roles,
|
@@ -34,7 +34,9 @@ Foreman::Plugin.register :foreman_ansible do
|
|
34
34
|
},
|
35
35
|
:resource_type => 'AnsibleVariable'
|
36
36
|
permission :edit_ansible_variables,
|
37
|
-
{ :ansible_variables => [:edit, :update]
|
37
|
+
{ :ansible_variables => [:edit, :update],
|
38
|
+
:'api/v2/ansible_variables' => [:update],
|
39
|
+
:'api/v2/ansible_override_values' => [:create, :destroy] },
|
38
40
|
:resource_type => 'AnsibleVariable'
|
39
41
|
permission :destroy_ansible_variables,
|
40
42
|
{
|
@@ -54,6 +56,12 @@ Foreman::Plugin.register :foreman_ansible do
|
|
54
56
|
permission :view_hostgroups,
|
55
57
|
{ :'api/v2/hostgroups' => [:ansible_roles] },
|
56
58
|
:resource_type => 'Hostgroup'
|
59
|
+
permission :edit_hosts,
|
60
|
+
{ :'api/v2/hosts' => [:assign_ansible_roles] },
|
61
|
+
:resource_type => 'Host'
|
62
|
+
permission :edit_hostgroups,
|
63
|
+
{ :'api/v2/hostgroups' => [:assign_ansible_roles] },
|
64
|
+
:resource_type => 'Hostgroup'
|
57
65
|
end
|
58
66
|
|
59
67
|
role 'Ansible Roles Manager',
|
@@ -84,6 +92,8 @@ Foreman::Plugin.register :foreman_ansible do
|
|
84
92
|
"#{ForemanAnsible::Engine.root}/app/controllers/api/v2/*.rb"
|
85
93
|
]
|
86
94
|
|
95
|
+
register_info_provider ForemanAnsible::AnsibleInfo
|
96
|
+
|
87
97
|
# For backwards compatiblity with 1.17
|
88
98
|
if respond_to?(:register_report_scanner)
|
89
99
|
register_report_scanner ForemanAnsible::AnsibleReportScanner
|
@@ -17,9 +17,10 @@ module ForemanAnsible
|
|
17
17
|
def self.register_rex_feature
|
18
18
|
RemoteExecutionFeature.register(
|
19
19
|
:ansible_run_host,
|
20
|
-
N_('
|
20
|
+
N_('Run Ansible roles'),
|
21
21
|
:description => N_('Runs an Ansible playbook which contains all'\
|
22
|
-
' the roles defined for a host')
|
22
|
+
' the roles defined for a host'),
|
23
|
+
:host_action_button => true
|
23
24
|
)
|
24
25
|
RemoteExecutionFeature.register(
|
25
26
|
:ansible_run_insights_plan,
|
@@ -49,6 +49,19 @@ module Api
|
|
49
49
|
response = JSON.parse(@response.body)
|
50
50
|
assert_equal @ansible_role1.id, response.first['id']
|
51
51
|
end
|
52
|
+
|
53
|
+
test 'should assign a role to a hostgroup' do
|
54
|
+
hostgroup = FactoryBot.create(:hostgroup,
|
55
|
+
:ansible_role_ids => [])
|
56
|
+
post :assign_ansible_roles,
|
57
|
+
:params => {
|
58
|
+
:id => hostgroup.id,
|
59
|
+
:ansible_role_ids => [@ansible_role1.id]
|
60
|
+
},
|
61
|
+
:session => set_session_user
|
62
|
+
assert_response :success
|
63
|
+
assert assigns('hostgroup').ansible_roles, [@ansible_role1]
|
64
|
+
end
|
52
65
|
end
|
53
66
|
end
|
54
67
|
end
|
@@ -72,6 +72,20 @@ module Api
|
|
72
72
|
response = JSON.parse(@response.body)
|
73
73
|
assert_equal @ansible_role1.id, response.first['id']
|
74
74
|
end
|
75
|
+
|
76
|
+
test 'should assign a role to a host' do
|
77
|
+
host = FactoryBot.create(:host,
|
78
|
+
:managed => false,
|
79
|
+
:ansible_role_ids => [])
|
80
|
+
post :assign_ansible_roles,
|
81
|
+
:params => {
|
82
|
+
:id => host.id,
|
83
|
+
:ansible_role_ids => [@ansible_role1.id]
|
84
|
+
},
|
85
|
+
:session => set_session_user
|
86
|
+
assert_response :success
|
87
|
+
assert assigns('host').ansible_roles, [@ansible_role1]
|
88
|
+
end
|
75
89
|
end
|
76
90
|
end
|
77
91
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_plugin_helper'
|
3
4
|
|
4
5
|
module ForemanAnsible
|
@@ -115,18 +116,23 @@ module ForemanAnsible
|
|
115
116
|
'_timestamp' => '2015-10-29 20:01:51 +0100',
|
116
117
|
'ansible_facts' =>
|
117
118
|
{
|
118
|
-
|
119
|
-
|
119
|
+
"ansible_distribution" => "Debian",
|
120
|
+
"ansible_distribution_file_parsed" => true,
|
121
|
+
"ansible_distribution_file_path" => "/etc/os-release",
|
122
|
+
"ansible_distribution_file_variety" => "Debian",
|
123
|
+
"ansible_distribution_major_version" => "8",
|
124
|
+
"ansible_distribution_release" => "jessie",
|
125
|
+
"ansible_distribution_version" => "8.7"
|
120
126
|
}
|
121
127
|
)
|
122
128
|
)
|
123
129
|
end
|
124
130
|
|
125
|
-
test 'Parses debian
|
131
|
+
test 'Parses debian jessie correctly' do
|
126
132
|
as_admin do
|
127
133
|
os = @facts_parser.operatingsystem
|
128
134
|
|
129
|
-
assert_equal '
|
135
|
+
assert_equal '8', os.major
|
130
136
|
assert_equal 'Debian', os.name
|
131
137
|
end
|
132
138
|
end
|
@@ -11,7 +11,7 @@ module ForemanAnsible
|
|
11
11
|
@host = FactoryBot.build(:host)
|
12
12
|
@template_invocation = OpenStruct.new(
|
13
13
|
:job_invocation => OpenStruct.new(:password => 'foobar',
|
14
|
-
|
14
|
+
:sudo_password => 'foobar'),
|
15
15
|
:effective_user => 'foobar'
|
16
16
|
)
|
17
17
|
end
|
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.3.
|
4
|
+
version: 2.3.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: 2019-
|
11
|
+
date: 2019-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -129,6 +129,7 @@ files:
|
|
129
129
|
- app/controllers/foreman_ansible/api/v2/hostgroups_param_group_extensions.rb
|
130
130
|
- app/controllers/foreman_ansible/api/v2/hosts_controller_extensions.rb
|
131
131
|
- app/controllers/foreman_ansible/api/v2/hosts_param_group_extensions.rb
|
132
|
+
- app/controllers/foreman_ansible/concerns/api_common.rb
|
132
133
|
- app/controllers/foreman_ansible/concerns/hostgroups_controller_extensions.rb
|
133
134
|
- app/controllers/foreman_ansible/concerns/hosts_controller_extensions.rb
|
134
135
|
- app/controllers/foreman_ansible/concerns/import_controller_helper.rb
|
@@ -150,10 +151,10 @@ files:
|
|
150
151
|
- app/models/hostgroup_ansible_role.rb
|
151
152
|
- app/models/setting/ansible.rb
|
152
153
|
- app/overrides/ansible_roles_tab.rb
|
153
|
-
- app/overrides/ansible_variables_edit.rb
|
154
154
|
- app/overrides/hostgroup_ansible_roles_tab.rb
|
155
155
|
- app/overrides/hostgroup_play_roles.rb
|
156
156
|
- app/overrides/report_output.rb
|
157
|
+
- app/services/foreman_ansible/ansible_info.rb
|
157
158
|
- app/services/foreman_ansible/ansible_report_importer.rb
|
158
159
|
- app/services/foreman_ansible/ansible_report_scanner.rb
|
159
160
|
- app/services/foreman_ansible/api_roles_importer.rb
|
@@ -174,8 +175,7 @@ files:
|
|
174
175
|
- app/views/ansible_roles/import.html.erb
|
175
176
|
- app/views/ansible_roles/index.html.erb
|
176
177
|
- app/views/ansible_roles/welcome.html.erb
|
177
|
-
- app/views/ansible_variables/
|
178
|
-
- app/views/ansible_variables/_validator_text.html.erb
|
178
|
+
- app/views/ansible_variables/_fields.erb
|
179
179
|
- app/views/ansible_variables/edit.html.erb
|
180
180
|
- app/views/ansible_variables/import.html.erb
|
181
181
|
- app/views/ansible_variables/index.html.erb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Deface::Override.new(
|
4
|
-
:virtual_path => 'lookup_keys/_fields',
|
5
|
-
:name => 'ansible_variables_edit',
|
6
|
-
:replace => "erb[loud]:contains('show_puppet_class')",
|
7
|
-
:partial => 'ansible_variables/ansible_roles_list'
|
8
|
-
)
|
9
|
-
|
10
|
-
Deface::Override.new(
|
11
|
-
:virtual_path => 'lookup_keys/_fields',
|
12
|
-
:name => 'ansible_variables_validator_text',
|
13
|
-
:replace => '.out.collapse > h6',
|
14
|
-
:partial => 'ansible_variables/validator_text'
|
15
|
-
)
|
@@ -1,15 +0,0 @@
|
|
1
|
-
<% if f.object.is_a? ::AnsibleVariable %>
|
2
|
-
<%=
|
3
|
-
select_f(
|
4
|
-
f,
|
5
|
-
:ansible_role_id,
|
6
|
-
[f.object.ansible_role],
|
7
|
-
:id,
|
8
|
-
:to_label,
|
9
|
-
{},
|
10
|
-
{ :label => _("Ansible Role"), :disabled => true }
|
11
|
-
)
|
12
|
-
%>
|
13
|
-
<% else %>
|
14
|
-
<%= show_puppet_class(f) %>
|
15
|
-
<% end %>
|
@@ -1,5 +0,0 @@
|
|
1
|
-
<% if f.object.is_a? ::AnsibleVariable %>
|
2
|
-
<h6><%= _('Before including these variables on your playbooks, Foreman will validate that your variables comply with the validation.') %></h6>
|
3
|
-
<% else %>
|
4
|
-
<h6><%= _('If ERB is used in a parameter value, the validation of the value will happen during the ENC request. If the value is invalid, the ENC request will fail.') %></h6>
|
5
|
-
<% end %>
|