foreman_ansible 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of foreman_ansible might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/models/setting/ansible.rb +18 -0
- data/app/services/foreman_ansible/fact_importer.rb +7 -1
- data/app/services/foreman_ansible/fact_parser.rb +8 -5
- data/app/services/foreman_ansible/inventory_creator.rb +36 -6
- data/app/services/foreman_ansible/structured_fact_importer.rb +19 -0
- data/db/migrate/20161122154057_automatically_set_role_timestamps.rb +11 -0
- data/lib/foreman_ansible/engine.rb +25 -4
- data/lib/foreman_ansible/version.rb +1 -1
- data/test/unit/services/structured_fact_importer_test.rb +28 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de6e79123f688c3553272ed001f1083956294a83
|
4
|
+
data.tar.gz: 943ccf987f9f2069fa51065eb3f44ded9cbefcf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60c9771a89b91400ec87794ac3b907cf67417d86aee5b32d80f697544aa3537cc09c65e6c290c34eca2862642c72947bcf4dae0a0ff842fafafe52381b329b93
|
7
|
+
data.tar.gz: 9100e43f728698c4c60a657d6cf252ae045505d82d9d8bebe1dccd7430f405e262ce186ef843f8fdb4d8b0932c84bb39a2d77ad0420c5bd01092fc8b5008d318
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Setting::Ansible < ::Setting
|
2
|
+
def self.load_defaults
|
3
|
+
return unless super
|
4
|
+
self.transaction do
|
5
|
+
[
|
6
|
+
self.set('ansible_port', N_('Foreman will use this port to ssh into hosts for running playbooks'), 22, N_('Default port')),
|
7
|
+
self.set('ansible_user', N_('Foreman will try to connect as this user to hosts when running Ansible playbooks.'), 'root', N_('Default user')),
|
8
|
+
self.set('ansible_ssh_pass', N_('Foreman will use this password when running Ansible playbooks.'), 'ansible', N_('Default password'))
|
9
|
+
].compact.each { |s| self.create s.update(:category => 'Setting::Ansible') }
|
10
|
+
end
|
11
|
+
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.humanized_category
|
16
|
+
N_('Ansible')
|
17
|
+
end
|
18
|
+
end
|
@@ -2,13 +2,19 @@ module ForemanAnsible
|
|
2
2
|
# Override methods from Foreman app/services/fact_importer so that Ansible
|
3
3
|
# facts are recognized in Foreman as ForemanAnsible facts. It supports
|
4
4
|
# nested facts.
|
5
|
+
#
|
6
|
+
# Only relevant for 1.12 and lower versions
|
5
7
|
class FactImporter < ::FactImporter
|
6
8
|
def fact_name_class
|
7
9
|
ForemanAnsible::FactName
|
8
10
|
end
|
9
11
|
|
10
12
|
def initialize(host, facts = {})
|
11
|
-
|
13
|
+
# Try to assign these facts to the correct host as per the facts say
|
14
|
+
# If that host isn't created yet, the host parameter will contain it
|
15
|
+
@host = Host.find_by(:name => facts[:ansible_facts][:ansible_fqdn] ||
|
16
|
+
facts[:ansible_facts][:fqdn]) ||
|
17
|
+
host
|
12
18
|
@facts = normalize(facts[:ansible_facts])
|
13
19
|
@original_facts = FactSparser.unsparse(facts[:ansible_facts])
|
14
20
|
@counters = {}
|
@@ -23,12 +23,13 @@ module ForemanAnsible
|
|
23
23
|
|
24
24
|
def model
|
25
25
|
name = detect_fact([:ansible_product_name, :facter_virtual,
|
26
|
-
:facter_productname, :facter_model])
|
26
|
+
:facter_productname, :facter_model, :model])
|
27
27
|
Model.where(:name => name.strip).first_or_create unless name.blank?
|
28
28
|
end
|
29
29
|
|
30
30
|
def domain
|
31
|
-
name = detect_fact([:ansible_domain, :facter_domain,
|
31
|
+
name = detect_fact([:ansible_domain, :facter_domain,
|
32
|
+
:ohai_domain, :domain])
|
32
33
|
Domain.where(:name => name).first_or_create unless name.blank?
|
33
34
|
end
|
34
35
|
|
@@ -48,7 +49,7 @@ module ForemanAnsible
|
|
48
49
|
if pref.present?
|
49
50
|
(facts[:ansible_interfaces] - [pref]).unshift(pref)
|
50
51
|
else
|
51
|
-
facts[:ansible_interfaces].sort
|
52
|
+
(facts[:ansible_interfaces].sort unless facts[:ansible_interfaces].nil?) || []
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
@@ -75,7 +76,8 @@ module ForemanAnsible
|
|
75
76
|
|
76
77
|
def os_major
|
77
78
|
facts[:ansible_distribution_major_version] ||
|
78
|
-
facts[:ansible_lsb] && facts[:ansible_lsb]['major_release']
|
79
|
+
facts[:ansible_lsb] && facts[:ansible_lsb]['major_release'] ||
|
80
|
+
(facts[:version].split('R')[0] if os_name == 'junos')
|
79
81
|
end
|
80
82
|
|
81
83
|
def os_release
|
@@ -84,7 +86,8 @@ module ForemanAnsible
|
|
84
86
|
end
|
85
87
|
|
86
88
|
def os_minor
|
87
|
-
_, minor = os_release.split('.')
|
89
|
+
_, minor = (os_release.split('.') unless os_release.nil?) ||
|
90
|
+
(facts[:version].split('R') if os_name == 'junos')
|
88
91
|
minor || ''
|
89
92
|
end
|
90
93
|
|
@@ -17,18 +17,36 @@ module ForemanAnsible
|
|
17
17
|
# with all hosts.
|
18
18
|
def to_hash
|
19
19
|
{ 'all' => { 'hosts' => hosts.map(&:fqdn) },
|
20
|
-
'_meta' => { 'hostvars' =>
|
20
|
+
'_meta' => { 'hostvars' => hosts_vars } }
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def hosts_vars
|
24
24
|
hosts.reduce({}) do |hash, host|
|
25
|
-
hash.update(host.fqdn =>
|
26
|
-
{ 'foreman' => host_attributes(host),
|
27
|
-
'foreman_params' => host_params(host),
|
28
|
-
'foreman_ansible_roles' => host_roles(host) })
|
25
|
+
hash.update(host.fqdn => host_vars(host))
|
29
26
|
end
|
30
27
|
end
|
31
28
|
|
29
|
+
def host_vars(host)
|
30
|
+
{
|
31
|
+
'foreman' => host_attributes(host),
|
32
|
+
'foreman_params' => host_params(host),
|
33
|
+
'foreman_ansible_roles' => host_roles(host)
|
34
|
+
}.merge(connection_params(host))
|
35
|
+
end
|
36
|
+
|
37
|
+
def connection_params(host)
|
38
|
+
params = {
|
39
|
+
'ansible_port' => host_port(host),
|
40
|
+
'ansible_user' => host_user(host),
|
41
|
+
'ansible_ssh_pass' => host_ssh_pass(host)
|
42
|
+
}
|
43
|
+
|
44
|
+
#Backward compatibility for Ansible 1.x
|
45
|
+
params['ansible_ssh_port'] = params['ansible_port']
|
46
|
+
params['ansible_ssh_user'] = params['ansible_user']
|
47
|
+
params
|
48
|
+
end
|
49
|
+
|
32
50
|
def host_roles(host)
|
33
51
|
host.all_ansible_roles.map(&:name)
|
34
52
|
end
|
@@ -41,6 +59,18 @@ module ForemanAnsible
|
|
41
59
|
host.host_params
|
42
60
|
end
|
43
61
|
|
62
|
+
def host_port(host)
|
63
|
+
host.host_params['ansible_port'] || Setting[:ansible_port]
|
64
|
+
end
|
65
|
+
|
66
|
+
def host_user(host)
|
67
|
+
host.host_params['ansible_user'] || Setting[:ansible_user]
|
68
|
+
end
|
69
|
+
|
70
|
+
def host_ssh_pass(host)
|
71
|
+
host.host_params['ansible_ssh_port'] || Setting[:ansible_ssh_pass]
|
72
|
+
end
|
73
|
+
|
44
74
|
private
|
45
75
|
|
46
76
|
def render_rabl(host, template)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
# On 1.13+ , use the parser for structured facts (like Facter 2) that comes
|
3
|
+
# from core
|
4
|
+
class StructuredFactImporter < ::StructuredFactImporter
|
5
|
+
def fact_name_class
|
6
|
+
ForemanAnsible::FactName
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(host, facts = {})
|
10
|
+
# Try to assign these facts to the correct host as per the facts say
|
11
|
+
# If that host isn't created yet, the host parameter will contain it
|
12
|
+
@host = Host.find_by(:name => facts[:ansible_facts][:ansible_fqdn] ||
|
13
|
+
facts[:ansible_facts][:fqdn]) ||
|
14
|
+
host
|
15
|
+
@facts = normalize(facts[:ansible_facts])
|
16
|
+
@counters = {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class AutomaticallySetRoleTimestamps < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
change_column :ansible_roles, :created_at, :datetime, :null => true, :default => nil
|
4
|
+
change_column :ansible_roles, :updated_at, :datetime, :null => true, :default => nil
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
change_column :ansible_roles, :created_at, :datetime, :null => false, :default => Time.now.utc
|
9
|
+
change_column :ansible_roles, :updated_at, :datetime, :null => false, :default => Time.now.utc
|
10
|
+
end
|
11
|
+
end
|
@@ -9,12 +9,19 @@ module ForemanAnsible
|
|
9
9
|
engine_name 'foreman_ansible'
|
10
10
|
|
11
11
|
config.autoload_paths += Dir["#{config.root}/app/controllers/concerns"]
|
12
|
+
config.autoload_paths += Dir["#{config.root}/app/models"]
|
12
13
|
config.autoload_paths += Dir["#{config.root}/app/helpers"]
|
13
14
|
config.autoload_paths += Dir["#{config.root}/app/overrides"]
|
14
15
|
config.autoload_paths += Dir["#{config.root}/app/services"]
|
15
16
|
config.autoload_paths += Dir["#{config.root}/app/views"]
|
16
17
|
config.autoload_paths += Dir["#{config.root}/app/lib"]
|
17
18
|
|
19
|
+
initializer 'foreman_ansible.load_default_settings',
|
20
|
+
:before => :load_config_initializers do
|
21
|
+
require_dependency(File.join(ForemanAnsible::Engine.root,
|
22
|
+
'app/models/setting/ansible.rb'))
|
23
|
+
end
|
24
|
+
|
18
25
|
initializer 'foreman_ansible.register_gettext',
|
19
26
|
:after => :load_config_initializers do
|
20
27
|
locale_dir = File.join(File.expand_path('../../..', __FILE__), 'locale')
|
@@ -30,7 +37,7 @@ module ForemanAnsible
|
|
30
37
|
security_block :foreman_ansible do
|
31
38
|
permission :play_roles,
|
32
39
|
{ :hosts => [:play_roles, :multiple_play_roles] },
|
33
|
-
:resource_type => 'Host
|
40
|
+
:resource_type => 'Host'
|
34
41
|
permission :view_ansible_roles,
|
35
42
|
{ :ansible_roles => [:index],
|
36
43
|
:'api/v2/ansible_roles' => [:index, :show] },
|
@@ -45,6 +52,10 @@ module ForemanAnsible
|
|
45
52
|
:resource_type => 'AnsibleRole'
|
46
53
|
end
|
47
54
|
|
55
|
+
role 'Ansible Roles Manager',
|
56
|
+
[:play_roles, :view_ansible_roles, :destroy_ansible_roles,
|
57
|
+
:import_ansible_roles]
|
58
|
+
|
48
59
|
role_assignment_params = { :ansible_role_ids => [],
|
49
60
|
:ansible_roles => [] }
|
50
61
|
parameter_filter Host::Managed, role_assignment_params
|
@@ -57,7 +68,8 @@ module ForemanAnsible
|
|
57
68
|
:parent => :configure_menu
|
58
69
|
|
59
70
|
apipie_documented_controllers [
|
60
|
-
"#{ForemanAnsible::Engine.root}/app/controllers/api/v2/*.rb"
|
71
|
+
"#{ForemanAnsible::Engine.root}/app/controllers/api/v2/*.rb"
|
72
|
+
]
|
61
73
|
end
|
62
74
|
end
|
63
75
|
|
@@ -83,8 +95,17 @@ module ForemanAnsible
|
|
83
95
|
|
84
96
|
config.to_prepare do
|
85
97
|
begin
|
86
|
-
::
|
87
|
-
|
98
|
+
foreman_version = ::Foreman::Version.new
|
99
|
+
if Rails.env.test? ||
|
100
|
+
foreman_version.major.to_i == 1 && foreman_version.minor.to_i < 13
|
101
|
+
::FactImporter.register_fact_importer(:ansible,
|
102
|
+
ForemanAnsible::FactImporter)
|
103
|
+
else
|
104
|
+
::FactImporter.register_fact_importer(
|
105
|
+
:ansible,
|
106
|
+
ForemanAnsible::StructuredFactImporter
|
107
|
+
)
|
108
|
+
end
|
88
109
|
::FactParser.register_fact_parser(:ansible, ForemanAnsible::FactParser)
|
89
110
|
::Host::Managed.send(:include, ForemanAnsible::HostManagedExtensions)
|
90
111
|
::Hostgroup.send(:include, ForemanAnsible::HostgroupExtensions)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
|
3
|
+
module ForemanAnsible
|
4
|
+
# Test for the structured facts importer - its code mostly lives in Foreman
|
5
|
+
# core, so only details have to be tested here.
|
6
|
+
class StructuredFactImporterTest < ActiveSupport::TestCase
|
7
|
+
test 'if host is not in Foreman, use hostname provided by call' do
|
8
|
+
fake_host = Host.new(:name => 'fake')
|
9
|
+
importer = ForemanAnsible::StructuredFactImporter.new(
|
10
|
+
fake_host,
|
11
|
+
facts_json
|
12
|
+
)
|
13
|
+
assert_equal fake_host, importer.send(:host)
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'if host is in Foreman, use hostname provided by Ansible' do
|
17
|
+
ansible_fqdn_host = FactoryGirl.build(:host)
|
18
|
+
ansible_fqdn_host.name = facts_json[:ansible_facts][:ansible_fqdn]
|
19
|
+
ansible_fqdn_host.save
|
20
|
+
importer = ForemanAnsible::StructuredFactImporter.new(
|
21
|
+
Host.new(:name => 'fake'),
|
22
|
+
facts_json
|
23
|
+
)
|
24
|
+
|
25
|
+
assert_equal ansible_fqdn_host, importer.send(:host)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
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: 1.
|
4
|
+
version: 1.3.0
|
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: 2016-
|
11
|
+
date: 2016-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- app/models/foreman_ansible/fact_name.rb
|
109
109
|
- app/models/host_ansible_role.rb
|
110
110
|
- app/models/hostgroup_ansible_role.rb
|
111
|
+
- app/models/setting/ansible.rb
|
111
112
|
- app/overrides/ansible_roles_tab.rb
|
112
113
|
- app/overrides/hostgroup_ansible_roles_tab.rb
|
113
114
|
- app/overrides/report_output.rb
|
@@ -119,6 +120,7 @@ files:
|
|
119
120
|
- app/services/foreman_ansible/playbook_creator.rb
|
120
121
|
- app/services/foreman_ansible/proxy_selector.rb
|
121
122
|
- app/services/foreman_ansible/roles_importer.rb
|
123
|
+
- app/services/foreman_ansible/structured_fact_importer.rb
|
122
124
|
- app/services/foreman_ansible/ui_roles_importer.rb
|
123
125
|
- app/views/ansible_roles/import.html.erb
|
124
126
|
- app/views/ansible_roles/index.html.erb
|
@@ -142,6 +144,7 @@ files:
|
|
142
144
|
- db/migrate/20160729094457_add_columns_to_ansible_role.rb
|
143
145
|
- db/migrate/20160802153302_create_join_table_hostgroup_ansible_roles.rb
|
144
146
|
- db/migrate/20160805094233_add_primary_key_hostgroup_ansible_roles.rb
|
147
|
+
- db/migrate/20161122154057_automatically_set_role_timestamps.rb
|
145
148
|
- db/seeds.d/62_ansible_proxy_feature.rb
|
146
149
|
- lib/foreman_ansible.rb
|
147
150
|
- lib/foreman_ansible/engine.rb
|
@@ -175,6 +178,7 @@ files:
|
|
175
178
|
- test/unit/services/fact_sparser_test.rb
|
176
179
|
- test/unit/services/proxy_selector_test.rb
|
177
180
|
- test/unit/services/roles_importer_test.rb
|
181
|
+
- test/unit/services/structured_fact_importer_test.rb
|
178
182
|
- test/unit/services/ui_roles_importer_test.rb
|
179
183
|
homepage: https://github.com/theforeman/foreman_ansible
|
180
184
|
licenses:
|
@@ -215,6 +219,7 @@ test_files:
|
|
215
219
|
- test/unit/concerns/hostgroup_extensions_test.rb
|
216
220
|
- test/unit/concerns/host_managed_extensions_test.rb
|
217
221
|
- test/unit/services/fact_parser_test.rb
|
222
|
+
- test/unit/services/structured_fact_importer_test.rb
|
218
223
|
- test/unit/services/proxy_selector_test.rb
|
219
224
|
- test/unit/services/fact_importer_test.rb
|
220
225
|
- test/unit/services/ui_roles_importer_test.rb
|