foreman_ansible 4.0.3.5 → 4.0.4
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/app/controllers/api/v2/ansible_roles_controller.rb +2 -2
- data/app/controllers/api/v2/ansible_variables_controller.rb +1 -2
- data/app/controllers/foreman_ansible/api/v2/hostgroups_controller_extensions.rb +2 -2
- data/app/controllers/foreman_ansible/api/v2/hosts_controller_extensions.rb +2 -2
- data/app/models/concerns/foreman_ansible/host_managed_extensions.rb +0 -4
- data/app/models/setting/ansible.rb +0 -4
- data/app/services/foreman_ansible/insights_notification_builder.rb +0 -2
- data/app/services/foreman_ansible/operating_system_parser.rb +0 -4
- data/app/services/foreman_ansible/variables_importer.rb +1 -0
- data/app/views/foreman_ansible/job_templates/ansible_roles_-_ansible_default.erb +4 -7
- data/config/routes.rb +0 -2
- data/db/migrate/20160802153302_create_join_table_hostgroup_ansible_roles.rb +0 -2
- data/lib/foreman_ansible/engine.rb +0 -2
- data/lib/foreman_ansible/register.rb +0 -2
- data/lib/foreman_ansible/version.rb +1 -1
- data/test/functional/api/v2/ansible_inventories_controller_test.rb +3 -3
- data/test/functional/api/v2/ansible_variables_controller_test.rb +12 -0
- data/test/unit/services/inventory_creator_test.rb +0 -2
- data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcher.js +1 -0
- data/webpack/components/AnsibleRolesSwitcher/components/AssignedRolesList.js +5 -1
- data/webpack/components/AnsibleRolesSwitcher/components/AssignedRolesList.test.js +8 -1
- data/webpack/components/AnsibleRolesSwitcher/index.js +1 -4
- metadata +2 -23
- data/app/views/foreman_ansible/job_templates/configure_cloud_connector_-_ansible_default.erb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1181793843192c0b3ef0d48427a3e948a570dc707e7232271fb62e21e7dcce81
|
4
|
+
data.tar.gz: 63406a1b2450e56ede90163216eec5faffe06018ced278c489b99409822c443c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b582b46130075e8f0ab202f7c80c6a8fccba95cebc8a94fb377e35a50c880d20f5e5bf4a5baf77779bc94b9e8d219de5da5f6184ba1afce56a2c5ce0d95d73d
|
7
|
+
data.tar.gz: b6fa2dce6812d569bbec5f60737269ddab3307b7a4f4b0f3bc0013351784a3a5fa2fe1032f40d25f333916ce13fedfa04e94e0af24061c4b3fd1c96180de9ee6
|
@@ -67,7 +67,7 @@ module Api
|
|
67
67
|
params.fetch(:role_names, [])
|
68
68
|
end
|
69
69
|
|
70
|
-
# rubocop:disable DotPosition
|
70
|
+
# rubocop:disable Layout/DotPosition
|
71
71
|
def find_proxy
|
72
72
|
unless params[:proxy_id]
|
73
73
|
msg = _('Smart proxy id is required')
|
@@ -76,7 +76,7 @@ module Api
|
|
76
76
|
@proxy = SmartProxy.authorized(:view_smart_proxies)
|
77
77
|
.find(params[:proxy_id])
|
78
78
|
end
|
79
|
-
# rubocop:enable DotPosition
|
79
|
+
# rubocop:enable Layout/DotPosition
|
80
80
|
|
81
81
|
def create_importer
|
82
82
|
@importer = ForemanAnsible::ApiRolesImporter.new(@proxy)
|
@@ -5,7 +5,6 @@ module Api
|
|
5
5
|
# API controller for Ansible Variables
|
6
6
|
class AnsibleVariablesController < ::Api::V2::BaseController
|
7
7
|
include ::Api::Version2
|
8
|
-
include Foreman::Controller::Parameters::VariableLookupKey
|
9
8
|
include Foreman::Controller::Parameters::AnsibleVariable
|
10
9
|
|
11
10
|
resource_description do
|
@@ -65,7 +64,7 @@ module Api
|
|
65
64
|
param_group :ansible_variable, :as => :update
|
66
65
|
|
67
66
|
def update
|
68
|
-
@ansible_variable.update!(
|
67
|
+
@ansible_variable.update!(ansible_variable_params)
|
69
68
|
render 'api/v2/ansible_variables/show'
|
70
69
|
end
|
71
70
|
|
@@ -12,7 +12,7 @@ module ForemanAnsible
|
|
12
12
|
|
13
13
|
# Included blocks shouldn't be bound by length, as otherwise concerns
|
14
14
|
# cannot extend the method properly.
|
15
|
-
# rubocop:disable
|
15
|
+
# rubocop:disable Rails/LexicallyScopedActionFilter
|
16
16
|
included do
|
17
17
|
before_action :find_ansible_roles, :only => [:assign_ansible_roles]
|
18
18
|
|
@@ -61,7 +61,7 @@ module ForemanAnsible
|
|
61
61
|
process_response @hostgroup.update(:ansible_roles => @ansible_roles)
|
62
62
|
end
|
63
63
|
end
|
64
|
-
# rubocop:enable
|
64
|
+
# rubocop:enable Rails/LexicallyScopedActionFilter
|
65
65
|
|
66
66
|
private
|
67
67
|
|
@@ -12,7 +12,7 @@ module ForemanAnsible
|
|
12
12
|
|
13
13
|
# Included blocks shouldn't be bound by length, as otherwise concerns
|
14
14
|
# cannot extend the method properly.
|
15
|
-
# rubocop:disable
|
15
|
+
# rubocop:disable Rails/LexicallyScopedActionFilter
|
16
16
|
included do
|
17
17
|
before_action :find_ansible_roles, :only => [:assign_ansible_roles]
|
18
18
|
|
@@ -63,7 +63,7 @@ module ForemanAnsible
|
|
63
63
|
process_response @host.update(:ansible_roles => @ansible_roles)
|
64
64
|
end
|
65
65
|
end
|
66
|
-
# rubocop:enable
|
66
|
+
# rubocop:enable Rails/LexicallyScopedActionFilter
|
67
67
|
|
68
68
|
private
|
69
69
|
|
@@ -4,7 +4,6 @@ require 'ipaddress'
|
|
4
4
|
module ForemanAnsible
|
5
5
|
# Relations to make Host::Managed 'have' ansible roles
|
6
6
|
module HostManagedExtensions
|
7
|
-
# rubocop:disable Metrics/BlockLength
|
8
7
|
def self.prepended(base)
|
9
8
|
base.instance_eval do
|
10
9
|
include ::ForemanAnsible::Concerns::JobInvocationHelper
|
@@ -30,7 +29,6 @@ module ForemanAnsible
|
|
30
29
|
|
31
30
|
# This one should be fixed, disabled for the moment as we're
|
32
31
|
# in a rush to get the release out
|
33
|
-
# rubocop:disable Metrics/AbcSize
|
34
32
|
def play_ansible_roles
|
35
33
|
return true unless ansible_roles.present? ||
|
36
34
|
inherited_ansible_roles.present?
|
@@ -47,13 +45,11 @@ module ForemanAnsible
|
|
47
45
|
logger.info("Error running Ansible roles on #{self} before_provision: "\
|
48
46
|
"#{e.message}")
|
49
47
|
end
|
50
|
-
# rubocop:enable Metrics/AbcSize
|
51
48
|
|
52
49
|
def all_ansible_roles
|
53
50
|
(ansible_roles + inherited_ansible_roles).uniq
|
54
51
|
end
|
55
52
|
|
56
|
-
# rubocop:enable Metrics/BlockLength
|
57
53
|
# Class methods we may need to override or add
|
58
54
|
module ClassMethods
|
59
55
|
def import_host(*args)
|
@@ -7,8 +7,6 @@ class Setting
|
|
7
7
|
# It would be more disadvantages than advantages to split up
|
8
8
|
# default_settings into multiple methods, this way it's already very
|
9
9
|
# manageable.
|
10
|
-
# rubocop:disable AbcSize
|
11
|
-
# rubocop:disable MethodLength
|
12
10
|
def default_settings
|
13
11
|
[
|
14
12
|
set(
|
@@ -85,8 +83,6 @@ class Setting
|
|
85
83
|
)
|
86
84
|
]
|
87
85
|
end
|
88
|
-
# rubocop:enable AbcSize
|
89
|
-
# rubocop:enable MethodLength
|
90
86
|
|
91
87
|
def load_defaults
|
92
88
|
Setting::BLANK_ATTRS.push('ansible_ssh_private_key_file')
|
@@ -3,9 +3,7 @@
|
|
3
3
|
module ForemanAnsible
|
4
4
|
# A class that builds custom notificaton for REX job if it's insights
|
5
5
|
# remediation feature
|
6
|
-
# rubocop:disable LineLength
|
7
6
|
class InsightsNotificationBuilder < ::UINotifications::RemoteExecutionJobs::BaseJobFinish
|
8
|
-
# rubocop:enable LineLength
|
9
7
|
def deliver!
|
10
8
|
::Notification.create!(
|
11
9
|
:audience => Notification::AUDIENCE_USER,
|
@@ -45,7 +45,6 @@ module ForemanAnsible
|
|
45
45
|
facts[:ansible_distribution_release]
|
46
46
|
end
|
47
47
|
|
48
|
-
# rubocop:disable AbcSize, CyclomaticComplexity, PerceivedComplexity
|
49
48
|
def os_major
|
50
49
|
if os_name == 'Debian' &&
|
51
50
|
facts[:ansible_distribution_major_version][%r{\/sid}i]
|
@@ -56,14 +55,12 @@ module ForemanAnsible
|
|
56
55
|
(facts[:version].split('R')[0] if os_name == 'junos')
|
57
56
|
end
|
58
57
|
end
|
59
|
-
# rubocop:enable AbcSize, CyclomaticComplexity, PerceivedComplexity
|
60
58
|
|
61
59
|
def os_release
|
62
60
|
facts[:ansible_distribution_version] ||
|
63
61
|
facts[:ansible_lsb] && facts[:ansible_lsb]['release']
|
64
62
|
end
|
65
63
|
|
66
|
-
# rubocop:disable AbcSize
|
67
64
|
def os_minor
|
68
65
|
_, minor = (os_release&.split('.', 2)) ||
|
69
66
|
(facts[:version].split('R') if os_name == 'junos')
|
@@ -87,7 +84,6 @@ module ForemanAnsible
|
|
87
84
|
facts[:ansible_lsb] && facts[:ansible_lsb]['id']
|
88
85
|
end
|
89
86
|
end
|
90
|
-
# rubocop:enable AbcSize
|
91
87
|
|
92
88
|
def os_description
|
93
89
|
if facts[:ansible_os_family] == 'Windows'
|
@@ -29,6 +29,7 @@ module ForemanAnsible
|
|
29
29
|
def import_variables(role_variables, new_roles)
|
30
30
|
detect_changes(
|
31
31
|
role_variables.map do |role_name, variables|
|
32
|
+
next if variables.blank?
|
32
33
|
role = import_new_role(role_name, new_roles)
|
33
34
|
next if role.blank?
|
34
35
|
initialize_variables(variables, role)
|
@@ -15,10 +15,7 @@ model: JobTemplate
|
|
15
15
|
- name: Display all parameters known for the Foreman host
|
16
16
|
debug:
|
17
17
|
var: foreman
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
loop: "{{ foreman_ansible_roles }}"
|
23
|
-
loop_control:
|
24
|
-
loop_var: role
|
18
|
+
roles:
|
19
|
+
<%- if @host.all_ansible_roles.present? -%>
|
20
|
+
<%= @host.all_ansible_roles.map { |role| " - #{role.name.strip}" }.join("\n") %>
|
21
|
+
<%- end -%>
|
data/config/routes.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Defines the relation between Hostgroup and AnsibleRole
|
4
|
-
# rubocop:disable Metrics/LineLength
|
5
4
|
class CreateJoinTableHostgroupAnsibleRoles < ActiveRecord::Migration[4.2]
|
6
5
|
def change
|
7
6
|
create_join_table :hostgroup, :ansible_roles, :table_name => 'hostgroup_ansible_roles' do |t|
|
8
7
|
t.index [:hostgroup_id, :ansible_role_id], :name => 'index_ansible_roles_hostgroup_on_hostgroup_id_and_role_id'
|
9
8
|
t.index [:ansible_role_id, :hostgroup_id], :name => 'index_ansible_roles_hostgroup_on_role_id_and_hostgroup_id'
|
10
|
-
# rubocop:enable Metrics/LineLength
|
11
9
|
end
|
12
10
|
end
|
13
11
|
end
|
@@ -70,7 +70,6 @@ module ForemanAnsible
|
|
70
70
|
Apipie.configuration.checksum_path += ['/foreman_ansible/api/']
|
71
71
|
end
|
72
72
|
|
73
|
-
# rubocop:disable BlockLength
|
74
73
|
config.to_prepare do
|
75
74
|
begin
|
76
75
|
foreman_version = ::Foreman::Version.new
|
@@ -99,7 +98,6 @@ module ForemanAnsible
|
|
99
98
|
Rails.logger.warn "Foreman Ansible: skipping engine hook (#{e})"
|
100
99
|
end
|
101
100
|
end
|
102
|
-
# rubocop:enable BlockLength
|
103
101
|
|
104
102
|
rake_tasks do
|
105
103
|
Rake::Task['db:seed'].enhance do
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable BlockLength
|
4
3
|
Foreman::Plugin.register :foreman_ansible do
|
5
4
|
requires_foreman '>= 1.24'
|
6
5
|
|
@@ -119,4 +118,3 @@ Foreman::Plugin.register :foreman_ansible do
|
|
119
118
|
register_report_origin 'Ansible', 'ConfigReport'
|
120
119
|
end
|
121
120
|
end
|
122
|
-
# rubocop:enable BlockLength
|
@@ -34,10 +34,10 @@ module Api
|
|
34
34
|
|
35
35
|
test 'schedule inventory by user' do
|
36
36
|
report = FactoryBot.create(:report_template)
|
37
|
-
|
38
|
-
|
37
|
+
Setting::Ansible.create! :name => 'ansible_inventory_template', :value => report.name,
|
38
|
+
:default => report.name, :description => 'inventory'
|
39
39
|
user = FactoryBot.create(:user)
|
40
|
-
user.roles << Role.
|
40
|
+
user.roles << Role.find_by(:name => 'Ansible Tower Inventory Reader')
|
41
41
|
post :schedule, { :session => set_session_user(user) }
|
42
42
|
assert_response :success
|
43
43
|
end
|
@@ -46,6 +46,18 @@ module Api
|
|
46
46
|
res = JSON.parse(@response.body)
|
47
47
|
refute res['imported']
|
48
48
|
end
|
49
|
+
|
50
|
+
test 'should update' do
|
51
|
+
variable = FactoryBot.create(:ansible_variable, :default_value => 'my default value')
|
52
|
+
new_value = 'changed default value'
|
53
|
+
post :update,
|
54
|
+
:params => { :id => variable.id, :default_value => new_value },
|
55
|
+
:session => set_session_user
|
56
|
+
|
57
|
+
assert_response :success
|
58
|
+
res = JSON.parse(@response.body)
|
59
|
+
assert_equal new_value, res['default_value']
|
60
|
+
end
|
49
61
|
end
|
50
62
|
end
|
51
63
|
end
|
@@ -5,7 +5,6 @@ require 'test_plugin_helper'
|
|
5
5
|
module ForemanAnsible
|
6
6
|
# Test how the inventory creator service transforms host params into
|
7
7
|
# inventory variables and connection options
|
8
|
-
# rubocop:disable ClassLength
|
9
8
|
class InventoryCreatorTest < ActiveSupport::TestCase
|
10
9
|
setup do
|
11
10
|
@host = FactoryBot.build(:host)
|
@@ -204,5 +203,4 @@ module ForemanAnsible
|
|
204
203
|
assert_equal org.name, inventory['_meta']['hostvars'][host.name]['foreman']['organization']
|
205
204
|
end
|
206
205
|
end
|
207
|
-
# rubocop:enable ClassLength
|
208
206
|
end
|
@@ -89,6 +89,7 @@ class AnsibleRolesSwitcher extends React.Component {
|
|
89
89
|
</div>
|
90
90
|
<AssignedRolesList
|
91
91
|
assignedRoles={assignedRoles}
|
92
|
+
allAssignedRoles={allAssignedRoles}
|
92
93
|
pagination={assignedPagination}
|
93
94
|
itemCount={assignedRolesCount}
|
94
95
|
onPaginationChange={changeAssignedPage}
|
@@ -8,13 +8,16 @@ import AnsibleRole from './AnsibleRole';
|
|
8
8
|
|
9
9
|
const AssignedRolesList = ({
|
10
10
|
assignedRoles,
|
11
|
+
allAssignedRoles,
|
11
12
|
pagination,
|
12
13
|
itemCount,
|
13
14
|
onPaginationChange,
|
14
15
|
onRemoveRole,
|
15
16
|
resourceName,
|
16
17
|
}) => {
|
17
|
-
const directlyAssignedRoles =
|
18
|
+
const directlyAssignedRoles = allAssignedRoles.filter(
|
19
|
+
role => !role.inherited
|
20
|
+
);
|
18
21
|
|
19
22
|
return (
|
20
23
|
<div>
|
@@ -62,6 +65,7 @@ const AssignedRolesList = ({
|
|
62
65
|
|
63
66
|
AssignedRolesList.propTypes = {
|
64
67
|
assignedRoles: PropTypes.arrayOf(PropTypes.object).isRequired,
|
68
|
+
allAssignedRoles: PropTypes.arrayOf(PropTypes.object).isRequired,
|
65
69
|
pagination: PropTypes.shape({
|
66
70
|
page: PropTypes.number,
|
67
71
|
perPage: PropTypes.number,
|
@@ -6,7 +6,14 @@ const noop = () => {};
|
|
6
6
|
|
7
7
|
const fixtures = {
|
8
8
|
'should render': {
|
9
|
-
|
9
|
+
allAssignedRoles: [
|
10
|
+
{ id: 1, name: 'fake.role' },
|
11
|
+
{ id: 2, name: 'test.role' },
|
12
|
+
],
|
13
|
+
assignedRoles: [
|
14
|
+
{ id: 1, name: 'fake.role' },
|
15
|
+
{ id: 2, name: 'test.role' },
|
16
|
+
],
|
10
17
|
pagination: { page: 1, perPage: 25 },
|
11
18
|
itemCount: 2,
|
12
19
|
onPaginationChange: noop,
|
@@ -35,10 +35,7 @@ const mapDispatchToProps = dispatch =>
|
|
35
35
|
bindActionCreators(AnsibleRolesSwitcherActions, dispatch);
|
36
36
|
|
37
37
|
export default withProtectedView(
|
38
|
-
connect(
|
39
|
-
mapStateToProps,
|
40
|
-
mapDispatchToProps
|
41
|
-
)(AnsibleRolesSwitcher),
|
38
|
+
connect(mapStateToProps, mapDispatchToProps)(AnsibleRolesSwitcher),
|
42
39
|
AnsiblePermissionDenied,
|
43
40
|
props => props.data && props.data.canView
|
44
41
|
);
|
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: 4.0.
|
4
|
+
version: 4.0.4
|
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: 2020-
|
11
|
+
date: 2020-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "<"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: foreman-tasks
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0.8'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0.8'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: foreman_remote_execution
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,9 +59,6 @@ dependencies:
|
|
73
59
|
- - ">="
|
74
60
|
- !ruby/object:Gem::Version
|
75
61
|
version: 2.0.0
|
76
|
-
- - "<"
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: '3.0'
|
79
62
|
type: :runtime
|
80
63
|
prerelease: false
|
81
64
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -83,9 +66,6 @@ dependencies:
|
|
83
66
|
- - ">="
|
84
67
|
- !ruby/object:Gem::Version
|
85
68
|
version: 2.0.0
|
86
|
-
- - "<"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '3.0'
|
89
69
|
- !ruby/object:Gem::Dependency
|
90
70
|
name: ipaddress
|
91
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,7 +186,6 @@ files:
|
|
206
186
|
- app/views/foreman_ansible/job_templates/ansible_roles_-_ansible_default.erb
|
207
187
|
- app/views/foreman_ansible/job_templates/ansible_roles_-_install_from_galaxy.erb
|
208
188
|
- app/views/foreman_ansible/job_templates/ansible_roles_-_install_from_git.erb
|
209
|
-
- app/views/foreman_ansible/job_templates/configure_cloud_connector_-_ansible_default.erb
|
210
189
|
- app/views/foreman_ansible/job_templates/maintenance_plan.erb
|
211
190
|
- app/views/foreman_ansible/job_templates/module_action_-_ansible_default.erb
|
212
191
|
- app/views/foreman_ansible/job_templates/package_action_-_ansible_default.erb
|
data/app/views/foreman_ansible/job_templates/configure_cloud_connector_-_ansible_default.erb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
<%#
|
2
|
-
name: Configure Cloud Connector
|
3
|
-
snippet: false
|
4
|
-
template_inputs:
|
5
|
-
- name: satellite_user
|
6
|
-
required: true
|
7
|
-
input_type: user
|
8
|
-
advanced: false
|
9
|
-
value_type: plain
|
10
|
-
hidden_value: false
|
11
|
-
- name: satellite_password
|
12
|
-
required: true
|
13
|
-
input_type: user
|
14
|
-
advanced: false
|
15
|
-
value_type: plain
|
16
|
-
hidden_value: true
|
17
|
-
model: JobTemplate
|
18
|
-
job_category: Ansible Playbook
|
19
|
-
description_format: "%{template_name}"
|
20
|
-
provider_type: Ansible
|
21
|
-
kind: job_template
|
22
|
-
%>
|
23
|
-
|
24
|
-
---
|
25
|
-
- hosts: all
|
26
|
-
vars:
|
27
|
-
satellite_url: "<%= foreman_server_url %>"
|
28
|
-
roles:
|
29
|
-
- project-receptor.satellite_receptor_installer
|