foreman_ansible 0.3 → 1.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.
Potentially problematic release.
This version of foreman_ansible might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +29 -37
- data/app/controllers/foreman_ansible/concerns/hosts_controller_extensions.rb +37 -0
- data/app/helpers/foreman_ansible/ansible_roles_helper.rb +9 -0
- data/app/helpers/foreman_ansible/hosts_helper_extensions.rb +28 -0
- data/app/jobs/foreman_ansible/run_playbook_job.rb +28 -0
- data/app/models/ansible_role.rb +6 -0
- data/app/models/concerns/foreman_ansible/host_managed_extensions.rb +14 -0
- data/app/models/host_ansible_role.rb +11 -0
- data/app/overrides/ansible_roles_tab.rb +14 -0
- data/app/services/foreman_ansible/inventory_creator.rb +18 -0
- data/app/services/foreman_ansible/playbook_creator.rb +23 -0
- data/app/services/foreman_ansible/role_player.rb +26 -0
- data/app/services/foreman_ansible/roles_importer.rb +24 -0
- data/app/views/foreman_ansible/hosts/_tab_content.html.erb +4 -0
- data/app/views/foreman_ansible/hosts/_tab_title.html.erb +1 -0
- data/config/routes.rb +14 -0
- data/db/migrate/20160705082036_create_ansible_role.rb +7 -0
- data/db/migrate/20160706074540_create_join_table_hosts_ansible_roles.rb +8 -0
- data/db/migrate/20160707195442_create_host_ansible_roles.rb +6 -0
- data/db/seeds.d/62-ansible_proxy_feature.rb +4 -0
- data/lib/foreman_ansible/engine.rb +14 -1
- data/lib/foreman_ansible/version.rb +1 -1
- data/lib/tasks/foreman_ansible_tasks.rake +2 -1
- data/test/factories/ansible_roles.rb +5 -0
- data/test/functional/hosts_controller_test.rb +36 -0
- data/test/test_plugin_helper.rb +4 -0
- data/test/unit/ansible_role_test.rb +8 -0
- data/test/unit/host_ansible_role_test.rb +7 -0
- metadata +29 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc4ac60019a9a765f9d6952ef2353dd4c67ddac3
|
4
|
+
data.tar.gz: 1cdc990b070ea857835c74822b021340640bac56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6658351477f153ae2b6b42356ba9cb75515fbfeae8a8a40040e2c80d458b127adb2a2a37171b42dc54ca73b135cfd207aa804d190ad6a63df5b8ae8f211805b7
|
7
|
+
data.tar.gz: 20f1305a896c46529bc488044f3a3284feb09290845ecbdd333be2ad616473051aa2160cacca849656164bd8c91b654e063a35b4ad9a9edeaa2e257db37cee4c
|
data/README.md
CHANGED
@@ -1,35 +1,29 @@
|
|
1
|
+
[](https://codeclimate.com/github/theforeman/foreman_ansible)
|
2
|
+
[](https://badge.fury.io/rb/foreman_ansible)
|
3
|
+
[](https://github.com/theforeman/foreman_ansible/blob/master/LICENSE)
|
4
|
+
|
1
5
|
# Foreman Ansible :arrow_forward:
|
2
6
|
|
7
|
+
Reporting and facts import from Ansible to Foreman.
|
8
|
+
|
9
|
+
* Main website: [theforeman.org](http://theforeman.org)
|
10
|
+
* Plugin manual: [foreman_ansible manual](http://theforeman.org/plugins/foreman_ansible/1.x/index.html)
|
11
|
+
* ServerFault tag: [Foreman](http://serverfault.com/questions/tagged/foreman)
|
12
|
+
* Issues: [foreman ansible on Redmine](http://projects.theforeman.org/projects/ansible/issues)
|
13
|
+
* Community and support: [#theforeman](https://kiwiirc.com/client/irc.freenode.net/?#theforeman) for general support, [#theforeman-dev](https://kiwiirc.com/client/irc.freenode.net/?#theforeman-dev) for development chat in [Freenode](irc.freenode.net)
|
14
|
+
* Mailing lists:
|
15
|
+
* [foreman-users](https://groups.google.com/forum/?fromgroups#!forum/foreman-users)
|
16
|
+
* [foreman-dev](https://groups.google.com/forum/?fromgroups#!forum/foreman-dev)
|
17
|
+
|
3
18
|
## Features
|
4
19
|
* Import facts
|
5
|
-
* Monitor playbook and
|
20
|
+
* Monitor playbook and Ansible runs runtime
|
6
21
|
* Sends Ansible reports to Foreman that contain what changed on your system after an ansible run.
|
22
|
+
* Stores a list of roles applicable to your hosts and 'plays' them
|
23
|
+
* Looking for an Ansible dynamic inventory for Foreman? Use [foreman_ansible_inventory](https://github.com/theforeman/foreman_ansible_inventory/)
|
7
24
|
|
8
|
-
##
|
9
|
-
|
10
|
-
Install `foreman_ansible` on your Foreman host. See the [Foreman manual: installing plugin from gems](http://www.theforeman.org/plugins/#2.3AdvancedInstallationfromGems)
|
11
|
-
|
12
|
-
Deploy `extras/foreman_callback.py` as a callback on your Ansible installation. For instance, put in your `ansible.cfg`:
|
13
|
-
|
14
|
-
```
|
15
|
-
callback_plugins = ~/.ansible/plugins/callback_plugins/
|
16
|
-
bin_ansible_callbacks = True
|
17
|
-
```
|
18
|
-
And copy `extras/foreman_callback.py` from this repo to `~/.ansible/plugins/callback_plugins/`.
|
19
|
-
|
20
|
-
You can configure it via the following environment variables:
|
21
|
-
|
22
|
-
* FOREMAN_URL: the URL of your Foreman installation (default "http://localhost:3000")
|
23
|
-
* FOREMAN_SSL_CERT: The public key when using SSL client certificates (default "/etc/foreman/client_cert.pem")
|
24
|
-
* FOREMAN_SSL_KEY: The private key when using SSL client certificates (default "/etc/foreman/client_key.pem")
|
25
|
-
* FOREMAN_SSL_VERIFY: wether to verify SSL certificates. Use *False*
|
26
|
-
to disable certificate checks. You can also set it to CA bundle (default is "True").
|
27
|
-
|
28
|
-
See the [python-requests documentation](http://docs.python-requests.org/en/master/user/advanced/#ssl-cert-verification) on the details of certificate setup.
|
29
|
-
|
30
|
-
That's it!
|
31
|
-
|
32
|
-
Now, every time you run a playbook or `ansible -m setup $HOSTNAME`, Ansible will automatically submit facts and a small report for $HOSTNAME to Foreman. See 'Extra information' below if you find any error.
|
25
|
+
## Documentation (installation and configuration)
|
26
|
+
Check out the official manual at [theforeman.org](http://theforeman.org/plugins/foreman_ansible/1.x/index.html)
|
33
27
|
|
34
28
|
##### Registering a new host in Foreman
|
35
29
|

|
@@ -37,13 +31,18 @@ Now, every time you run a playbook or `ansible -m setup $HOSTNAME`, Ansible wil
|
|
37
31
|
##### Host with failed and successful reports
|
38
32
|

|
39
33
|
|
40
|
-
|
34
|
+
##### Assigning roles to a host and 'playing' them
|
35
|
+

|
36
|
+

|
37
|
+

|
41
38
|
|
42
|
-
In Foreman, you should add whatever Ansible hosts you want to submit facts from to the setting `trusted_puppetmaster_hosts`. Change it at Administer > Settings, Puppet tab.
|
43
39
|
|
44
|
-
|
40
|
+
## Compatibility
|
45
41
|
|
46
|
-
|
42
|
+
| Foreman | Plugin |
|
43
|
+
| ---------------:| --------------:|
|
44
|
+
| >= 1.9 | 0 - 0.3 |
|
45
|
+
| >= 1.12 | 1.0 - TBD |
|
47
46
|
|
48
47
|
### Devs
|
49
48
|
|
@@ -53,10 +52,6 @@ Facts must contain the output of `ansible -m setup $HOSTNAME`, plus a '_type' an
|
|
53
52
|
|
54
53
|
After that request, you should have a host registered in Foreman with the Ansible facts. It takes into account some facter and ohai facts if these are available on the system as well.
|
55
54
|
|
56
|
-
## Contributing
|
57
|
-
|
58
|
-
Fork and send a Pull Request. Thanks!
|
59
|
-
|
60
55
|
## Copyright
|
61
56
|
|
62
57
|
Copyright (c) Daniel Lobato Garcia
|
@@ -73,6 +68,3 @@ GNU General Public License for more details.
|
|
73
68
|
|
74
69
|
You should have received a copy of the GNU General Public License
|
75
70
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
76
|
-
|
77
|
-
|
78
|
-
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
module Concerns
|
3
|
+
# Extra methods to enforce Ansible roles on a host or multiple hosts
|
4
|
+
module HostsControllerExtensions
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def play_roles
|
8
|
+
find_resource
|
9
|
+
RolePlayer.new(@host).play
|
10
|
+
notice(_('Ansible roles running on background: ') +
|
11
|
+
@host.ansible_roles.map(&:name).join(', '))
|
12
|
+
redirect_to :back
|
13
|
+
end
|
14
|
+
|
15
|
+
def multiple_play_roles
|
16
|
+
find_multiple
|
17
|
+
@hosts.each do |host|
|
18
|
+
RolePlayer.new(host).play
|
19
|
+
end
|
20
|
+
notice(_('Ansible roles running on background for hosts: ') +
|
21
|
+
@hosts.map(&:name).join(', '))
|
22
|
+
redirect_to :hosts
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def action_permission
|
28
|
+
case params[:action]
|
29
|
+
when 'multiple_play_roles', 'play_roles'
|
30
|
+
:view
|
31
|
+
else
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
# Chained methods to extend the hosts menu with Ansible actions
|
3
|
+
module HostsHelperExtensions
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
alias_method_chain(:host_title_actions, :run_ansible_roles)
|
8
|
+
alias_method_chain(:multiple_actions, :run_ansible_roles)
|
9
|
+
end
|
10
|
+
|
11
|
+
def host_title_actions_with_run_ansible_roles(*args)
|
12
|
+
button = link_to(
|
13
|
+
icon_text('play', ' ' + _('Ansible roles'), :kind => 'fa'),
|
14
|
+
play_roles_ansible_host_path(:id => args.first.id),
|
15
|
+
:id => :ansible_roles_button,
|
16
|
+
:class => 'btn btn-default')
|
17
|
+
title_actions(button_group(button)) if args.first.ansible_roles.present?
|
18
|
+
host_title_actions_without_run_ansible_roles(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def multiple_actions_with_run_ansible_roles
|
22
|
+
multiple_actions_without_run_ansible_roles +
|
23
|
+
[[_('Play Ansible roles'),
|
24
|
+
multiple_play_roles_ansible_hosts_path,
|
25
|
+
false]]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
# Run the ansible-playbook binary, depends on a valid playbook and inventory
|
3
|
+
class RunPlaybookJob < ActiveJob::Base
|
4
|
+
queue_as :ansible
|
5
|
+
attr_reader :pid
|
6
|
+
|
7
|
+
after_perform do |job|
|
8
|
+
Foreman::Logging.
|
9
|
+
logger('foreman_ansible').
|
10
|
+
info('PID for playbook run for'\
|
11
|
+
" #{job.arguments.first} #{job.arguments.second}:"\
|
12
|
+
" #{pid}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform(playbook_path, inventory_path)
|
16
|
+
@pid = spawn("ansible-playbook -i #{inventory_path} #{playbook_path}",
|
17
|
+
:out => log_file,
|
18
|
+
:err => log_file)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def log_file
|
24
|
+
"#{::Foreman::Logging.log_directory}/"\
|
25
|
+
"#{::Foreman::Logging.config[:filename]}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
# Relations to make Host::Managed 'have' ansible roles
|
3
|
+
module HostManagedExtensions
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_many :host_ansible_roles, :foreign_key => :host_id
|
8
|
+
has_many :ansible_roles, :through => :host_ansible_roles,
|
9
|
+
:dependent => :destroy
|
10
|
+
|
11
|
+
attr_accessible :ansible_role_ids, :ansible_roles
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Join model that hosts the connection between hosts and ansible_roles
|
2
|
+
class HostAnsibleRole < ActiveRecord::Base
|
3
|
+
audited :associated_with => :host, :allow_mass_assignment => true
|
4
|
+
attr_accessible :host_id, :host, :ansible_role_id, :ansible_role
|
5
|
+
|
6
|
+
belongs_to_host
|
7
|
+
belongs_to :ansible_role
|
8
|
+
|
9
|
+
validates :ansible_role_id, :presence => true,
|
10
|
+
:uniqueness => { :scope => :host_id }
|
11
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Displays Ansible roles tab on Host form
|
2
|
+
Deface::Override.new(
|
3
|
+
:virtual_path => 'hosts/_form',
|
4
|
+
:name => 'ansible_roles_tab',
|
5
|
+
:insert_after => 'li.active',
|
6
|
+
:partial => 'foreman_ansible/hosts/tab_title'
|
7
|
+
)
|
8
|
+
|
9
|
+
Deface::Override.new(
|
10
|
+
:virtual_path => 'hosts/_form',
|
11
|
+
:name => 'ansible_roles_tab_content',
|
12
|
+
:insert_after => 'div.tab-pane.active',
|
13
|
+
:partial => 'foreman_ansible/hosts/tab_content'
|
14
|
+
)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
module ForemanAnsible
|
3
|
+
# Service to list an inventory to be passed to the ansible-playbook binary
|
4
|
+
class InventoryCreator
|
5
|
+
attr_reader :hosts
|
6
|
+
|
7
|
+
def initialize(hosts)
|
8
|
+
@hosts = hosts
|
9
|
+
end
|
10
|
+
|
11
|
+
def tempfile
|
12
|
+
tempfile = Tempfile.new("foreman-#{SecureRandom.uuid}-inventory")
|
13
|
+
tempfile.write(hosts.map(&:fqdn).join('\n'))
|
14
|
+
tempfile.close
|
15
|
+
tempfile
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
# Service to generate a playbook given roles and a list of hosts
|
3
|
+
class PlaybookCreator
|
4
|
+
attr_reader :fqdn, :role_names
|
5
|
+
|
6
|
+
def initialize(fqdn, role_names)
|
7
|
+
@fqdn = fqdn
|
8
|
+
@role_names = role_names
|
9
|
+
end
|
10
|
+
|
11
|
+
def roles_playbook
|
12
|
+
playbook = ['hosts' => fqdn, 'roles' => role_names]
|
13
|
+
playbook.to_yaml
|
14
|
+
end
|
15
|
+
|
16
|
+
def roles_tempfile
|
17
|
+
tempfile = Tempfile.new("foreman-ansible-#{fqdn}-roles")
|
18
|
+
tempfile.write(roles_playbook)
|
19
|
+
tempfile.close
|
20
|
+
tempfile
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
# Sugar-coating so that playing a list of roles is easier and
|
3
|
+
# more understandable, it just requires a host and it figures out the rest
|
4
|
+
class RolePlayer
|
5
|
+
attr_reader :host
|
6
|
+
|
7
|
+
def initialize(host)
|
8
|
+
@host = host
|
9
|
+
end
|
10
|
+
|
11
|
+
def play
|
12
|
+
return if host.ansible_roles.empty?
|
13
|
+
inventory_tempfile = InventoryCreator.new([host]).tempfile
|
14
|
+
RunPlaybookJob.new(create_playbook.path,
|
15
|
+
inventory_tempfile.path).enqueue
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def create_playbook
|
21
|
+
PlaybookCreator.new(
|
22
|
+
host.fqdn,
|
23
|
+
host.ansible_roles.map(&:name)).roles_tempfile
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
# Service to import roles from the filesystem.
|
3
|
+
# Should be extracted to a gem that both the proxy and Foreman can use.
|
4
|
+
class RolesImporter
|
5
|
+
class << self
|
6
|
+
def import!
|
7
|
+
list_roles_in_fs.each do |role_name|
|
8
|
+
role = AnsibleRole.new(:name => role_name)
|
9
|
+
next if role.save
|
10
|
+
Rails.logger.debug("Failed to save role #{role_name}: "\
|
11
|
+
"#{role.errors.full_messages.join(', ')}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def list_roles_in_fs
|
18
|
+
Dir.glob('/etc/ansible/roles/*').map do |path|
|
19
|
+
path.split('/').last
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<li><a href="#ansible_roles" data-toggle="tab"><%= _('Ansible Roles') %></a></li>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
scope :ansible, :path => '/ansible', :as => 'ansible' do
|
3
|
+
constraints(:id => /[^\/]+/) do
|
4
|
+
resources :hosts, :only => [] do
|
5
|
+
member do
|
6
|
+
get :play_roles
|
7
|
+
end
|
8
|
+
collection do
|
9
|
+
get :multiple_play_roles
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -4,6 +4,7 @@ module ForemanAnsible
|
|
4
4
|
class Engine < ::Rails::Engine
|
5
5
|
engine_name 'foreman_ansible'
|
6
6
|
|
7
|
+
config.autoload_paths += Dir["#{config.root}/app/controllers/concerns"]
|
7
8
|
config.autoload_paths += Dir["#{config.root}/app/helpers"]
|
8
9
|
config.autoload_paths += Dir["#{config.root}/app/overrides"]
|
9
10
|
config.autoload_paths += Dir["#{config.root}/app/services"]
|
@@ -11,7 +12,15 @@ module ForemanAnsible
|
|
11
12
|
|
12
13
|
initializer 'foreman_ansible.register_plugin', :before => :finisher_hook do
|
13
14
|
Foreman::Plugin.register :foreman_ansible do
|
14
|
-
|
15
|
+
# We need ActiveJob, only available post-1.12 because of Rails 4.2
|
16
|
+
requires_foreman '>= 1.12'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Add any db migrations
|
21
|
+
initializer 'foreman_remote_execution.load_app_instance_data' do |app|
|
22
|
+
ForemanAnsible::Engine.paths['db/migrate'].existent.each do |path|
|
23
|
+
app.config.paths['db/migrate'] << path
|
15
24
|
end
|
16
25
|
end
|
17
26
|
|
@@ -20,6 +29,10 @@ module ForemanAnsible
|
|
20
29
|
::FactImporter.register_fact_importer(:ansible,
|
21
30
|
ForemanAnsible::FactImporter)
|
22
31
|
::FactParser.register_fact_parser(:ansible, ForemanAnsible::FactParser)
|
32
|
+
::Host::Managed.send(:include, ForemanAnsible::HostManagedExtensions)
|
33
|
+
::HostsHelper.send(:include, ForemanAnsible::HostsHelperExtensions)
|
34
|
+
::HostsController.send(
|
35
|
+
:include, ForemanAnsible::Concerns::HostsControllerExtensions)
|
23
36
|
rescue => e
|
24
37
|
Rails.logger "Foreman Ansible: skipping engine hook (#{e})"
|
25
38
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
|
3
|
+
class HostsControllerExtensionsTest < ActionController::TestCase
|
4
|
+
tests ::HostsController
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@role = FactoryGirl.create(:ansible_role)
|
8
|
+
end
|
9
|
+
|
10
|
+
test 'create a host with ansible roles' do
|
11
|
+
host = { :name => 'foo',
|
12
|
+
:managed => false,
|
13
|
+
:ansible_role_ids => [@role.id] }
|
14
|
+
post :create, { :host => host },
|
15
|
+
set_session_user
|
16
|
+
assert_redirected_to host_url(assigns('host'))
|
17
|
+
assert assigns('host').ansible_roles, [@role]
|
18
|
+
end
|
19
|
+
|
20
|
+
test 'update a host with ansible roles' do
|
21
|
+
host = FactoryGirl.create(:host, :managed => false)
|
22
|
+
post :update, { :id => host.id, :ansible_role_ids => [@role.id] },
|
23
|
+
set_session_user
|
24
|
+
assert_redirected_to host_url(assigns('host'))
|
25
|
+
assert assigns('host').ansible_roles, [@role]
|
26
|
+
end
|
27
|
+
|
28
|
+
test 'delete a host with ansible roles' do
|
29
|
+
host = FactoryGirl.create(:host, :managed => false,
|
30
|
+
:ansible_roles => [@role])
|
31
|
+
assert_include @role.hosts, host
|
32
|
+
delete :destroy, { :id => host.id }, set_session_user
|
33
|
+
assert_redirected_to hosts_url
|
34
|
+
assert @role.hosts.empty?
|
35
|
+
end
|
36
|
+
end
|
data/test/test_plugin_helper.rb
CHANGED
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
|
3
|
+
class AnsibleRoleTest < ActiveSupport::TestCase
|
4
|
+
should have_many(:host_ansible_roles)
|
5
|
+
should have_many(:hosts).through(:host_ansible_roles).dependent(:destroy)
|
6
|
+
should validate_presence_of(:name)
|
7
|
+
should validate_uniqueness_of(:name)
|
8
|
+
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: '0
|
4
|
+
version: '1.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-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -48,14 +48,33 @@ files:
|
|
48
48
|
- LICENSE
|
49
49
|
- README.md
|
50
50
|
- Rakefile
|
51
|
+
- app/controllers/foreman_ansible/concerns/hosts_controller_extensions.rb
|
51
52
|
- app/helpers/foreman_ansible/ansible_reports_helper.rb
|
53
|
+
- app/helpers/foreman_ansible/ansible_roles_helper.rb
|
54
|
+
- app/helpers/foreman_ansible/hosts_helper_extensions.rb
|
55
|
+
- app/jobs/foreman_ansible/run_playbook_job.rb
|
56
|
+
- app/models/ansible_role.rb
|
57
|
+
- app/models/concerns/foreman_ansible/host_managed_extensions.rb
|
52
58
|
- app/models/foreman_ansible/fact_name.rb
|
59
|
+
- app/models/host_ansible_role.rb
|
60
|
+
- app/overrides/ansible_roles_tab.rb
|
53
61
|
- app/overrides/report_output.rb
|
54
62
|
- app/services/foreman_ansible/fact_importer.rb
|
55
63
|
- app/services/foreman_ansible/fact_parser.rb
|
56
64
|
- app/services/foreman_ansible/fact_sparser.rb
|
65
|
+
- app/services/foreman_ansible/inventory_creator.rb
|
66
|
+
- app/services/foreman_ansible/playbook_creator.rb
|
67
|
+
- app/services/foreman_ansible/role_player.rb
|
68
|
+
- app/services/foreman_ansible/roles_importer.rb
|
57
69
|
- app/views/foreman_ansible/config_reports/_ansible.html.erb
|
58
70
|
- app/views/foreman_ansible/config_reports/_output.html.erb
|
71
|
+
- app/views/foreman_ansible/hosts/_tab_content.html.erb
|
72
|
+
- app/views/foreman_ansible/hosts/_tab_title.html.erb
|
73
|
+
- config/routes.rb
|
74
|
+
- db/migrate/20160705082036_create_ansible_role.rb
|
75
|
+
- db/migrate/20160706074540_create_join_table_hosts_ansible_roles.rb
|
76
|
+
- db/migrate/20160707195442_create_host_ansible_roles.rb
|
77
|
+
- db/seeds.d/62-ansible_proxy_feature.rb
|
59
78
|
- lib/foreman_ansible.rb
|
60
79
|
- lib/foreman_ansible/engine.rb
|
61
80
|
- lib/foreman_ansible/version.rb
|
@@ -64,12 +83,16 @@ files:
|
|
64
83
|
- locale/en/foreman_ansible.po
|
65
84
|
- locale/foreman_ansible.pot
|
66
85
|
- locale/gemspec.rb
|
86
|
+
- test/factories/ansible_roles.rb
|
67
87
|
- test/fixtures/sample_facts.json
|
88
|
+
- test/functional/hosts_controller_test.rb
|
68
89
|
- test/test_plugin_helper.rb
|
90
|
+
- test/unit/ansible_role_test.rb
|
69
91
|
- test/unit/fact_importer_test.rb
|
70
92
|
- test/unit/fact_parser_test.rb
|
71
93
|
- test/unit/fact_sparser_test.rb
|
72
94
|
- test/unit/helpers/foreman_ansible/ansible_reports_helper_test.rb
|
95
|
+
- test/unit/host_ansible_role_test.rb
|
73
96
|
homepage: https://github.com/theforeman/foreman_ansible
|
74
97
|
licenses:
|
75
98
|
- GPL-3
|
@@ -96,8 +119,12 @@ specification_version: 4
|
|
96
119
|
summary: Ansible integration with Foreman (theforeman.org)
|
97
120
|
test_files:
|
98
121
|
- test/fixtures/sample_facts.json
|
122
|
+
- test/factories/ansible_roles.rb
|
123
|
+
- test/functional/hosts_controller_test.rb
|
99
124
|
- test/test_plugin_helper.rb
|
100
125
|
- test/unit/fact_parser_test.rb
|
126
|
+
- test/unit/host_ansible_role_test.rb
|
127
|
+
- test/unit/ansible_role_test.rb
|
101
128
|
- test/unit/fact_importer_test.rb
|
102
129
|
- test/unit/fact_sparser_test.rb
|
103
130
|
- test/unit/helpers/foreman_ansible/ansible_reports_helper_test.rb
|