lita-puppet 0.6.3 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b07d8d6ec3d4b8bd50ded82552c693d7bd49eae3
4
- data.tar.gz: ad15dc7734ef6ef1495d577377e295febfcaf865
3
+ metadata.gz: 6753079e28465d80b49e7d463fb242c0730e6ab3
4
+ data.tar.gz: 20d8c779ebe29130f7643378d5963a03e586c269
5
5
  SHA512:
6
- metadata.gz: 572fd736a463d2d65060757a7b4c038fb1195aa82096431a57616018d3195818f08a0029c3687a0279bb65668570252d05474f71a59a9f576c023c134252547d
7
- data.tar.gz: 32bc47bb56b0564729733dc00209715b51bf5764c342e7ce3fd46a28744a5939f0ae39d17bc7b72be75cc3e5bd956e250df784c1864163ef14afb35408b2e4db
6
+ metadata.gz: 6e2324d74f2d7ec5cdd956bd065baf9d8dfd5334cea9989aa90913b5dc2613c35494829e20910ac2440753a03efaa3ce43f2d63a03ca68fda9d6cfee38d19667
7
+ data.tar.gz: e391af17aab49c66f4f427eb2b16db108d655d047e6c5c1f7ee1c829956f84ffb2b8c1543436e132ffcfbde81b3803811d33d94e118120bbb882ec38f6325134
data/.travis.yml CHANGED
@@ -1,7 +1,15 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.5
4
- - 2.3.1
3
+ - 2.2.5
4
+ - 2.3.1
5
5
  services:
6
- - redis-server
6
+ - redis-server
7
7
  cache: bundler
8
+ deploy:
9
+ provider: rubygems
10
+ api_key:
11
+ secure: P5+R7mfECVqonuJQf4pHuzh71ihjH/PGJjAHbbfobxJf8krk8h8erD6c/86dxy/+Jyr/BDOvx2TH2Q1zn2lRo1unbKUsccP8nJfY4B8zkISqHs2JqkE2DZZqciYx7OIMO02Yyk3XS8FjaykHOCdgP1UpGY1i1ErfZkSkj3PcfybMLmgShZn/DrR15mulp4EHVtlsb7CZz4dIxsmnH+UP4bTirk1dcw1133iG5xx7hbQ03cMJI8Mjz51+edCI65dS6LN9Vyh2EKZfr+P/mRcp2gLcuHg0IjGvjv4/McMrkAxozTvvFdeSDoZda7sSdC1v0UwbjqHQMva9bcyjz9poKeQDRFjqRtoiuq1LIp4y26hzuOKZWjqnrXLKXRj50cLASiCL4enxr0xC9AkO23Il/MsExhu52Ke0bnS8DC3FkEcWsaVEYHoKC9w9dyMu4d5SCPX1tpbMNFjYacE9RGsKJFshCyi4SBVAu6MPy0X2tNO7bLBZTPAQSILult0D6s4H0j3laxLMZ2KSJpZWAEmsub5BjsheDgHTHZkQ0hAGP4lknqXiiU0F1ogP8LXagHqSLb0Bp+meb9BBhoe3mYafb5MB/r3SMdnOgjpbNxlkxeOwtNpW6PSHJJns1NzDG21PzaIq9MCfHjbDWHtk8n52KAVhSAg9QJ6xXIPSJyo3BYw=
12
+ gem: lita-puppet
13
+ on:
14
+ tags: true
15
+ repo: knuedge/lita-puppet
data/README.md CHANGED
@@ -15,9 +15,13 @@ Add lita-puppet to your Lita instance's Gemfile:
15
15
  gem "lita-puppet"
16
16
  ```
17
17
 
18
+ ## Prerequisites
19
+
20
+ * Some of the commands require a [PuppetDB](https://docs.puppet.com/puppetdb/) server, and it must be specified in the configuration.
21
+ * Other commands require that Lita has SSH access to machines using an SSH key, and that Lita has Passwordless `sudo` capabilities. This sounds scary, but it can be done in a very restrictive way (and if you're using puppet, you can automate it).
22
+
18
23
  ## Configuration
19
24
 
20
- * `config.handlers.puppet.control_repo_path` - Path for `git pull` during r10k deployments
21
25
  * `config.handlers.puppet.master_hostname` - Puppet Master's hostname
22
26
  * `config.handlers.puppet.puppetdb_url` - PuppetDB hostname (for the [puppetdb-ruby](https://github.com/voxpupuli/puppetdb-ruby) gem)
23
27
  * `config.handlers.puppet.ssh_user` - SSH user for the Puppet Master for r10k deployments
@@ -56,15 +60,19 @@ This is also available as:
56
60
  **Note** though that this doesn't do anything on the client side. If you want puppet to work on the `<host>` machine you'll need to generate a new cert. Usually you run this if you're planning to do that anyway though.
57
61
 
58
62
  #### Query PuppetDB for the Roles and Profiles used by a node
59
- puppet catalog <certname> profiles
63
+ puppet roles and profiles <certname>
60
64
 
61
65
  This is also available as:
62
66
 
63
- puppet node <certname> profiles
64
- pp catalog <certname> profiles
65
- pp node <certname> profiles
67
+ puppet r&p <certname>
68
+ puppet profiles <certname>
69
+ puppet roles <certname>
70
+ pp roles and profiles <certname>
71
+ pp r&p <certname>
72
+ pp profiles <certname>
73
+ pp roles <certname>
66
74
 
67
- Where `<certname>` is the SSL certificate name used for Puppet. This is usually the FQDN for the host. This query assumes you use the roles and profiles paradigm with the classes namespaced as `profile::example` and `role::example` etc..
75
+ Where `<certname>` is the SSL certificate name used for Puppet. This is usually the FQDN for the host. This query assumes you use the roles and profiles paradigm with the classes namespaced as `profile::example` and `role::example` etc.. Using only `roles` or `profiles` in the command will only return the requested information.
68
76
 
69
77
  #### Query PuppetDB for the nodes associated with a class
70
78
  puppet class nodes <class>
@@ -4,7 +4,6 @@ module Lita
4
4
  namespace 'Puppet'
5
5
  config :master_hostname, required: true, type: String
6
6
  config :ssh_user, required: false, type: String, default: 'lita'
7
- config :control_repo_path, required: false, type: String, default: '/opt/puppet/control'
8
7
  config :puppetdb_url, required: false, type: String
9
8
 
10
9
  route(
@@ -22,7 +21,7 @@ module Lita
22
21
  )
23
22
 
24
23
  route(
25
- /(puppet|pp)\s+(catalog|node)\s+(\S+)\s+(profiles)/i,
24
+ /(puppet|pp)\s+(profiles|roles\sand\sprofiles|roles|r&p)\s+(\S+)/i,
26
25
  :node_profiles,
27
26
  command: true,
28
27
  help: { t('help.node_profiles.syntax') => t('help.node_profiles.desc') }
@@ -85,6 +84,7 @@ module Lita
85
84
 
86
85
  def node_profiles(response)
87
86
  host = response.matches[0][2]
87
+ what = response.matches[0][1]
88
88
  url = config.puppetdb_url
89
89
 
90
90
  unless url
@@ -94,7 +94,7 @@ module Lita
94
94
 
95
95
  response.reply_with_mention(t('replies.node_profiles.working'))
96
96
 
97
- profiles = node_roles_and_profiles(url, host)
97
+ profiles = node_roles_and_profiles(url, what, host)
98
98
 
99
99
  if profiles.is_a? String
100
100
  fail_message response, t('replies.node_profiles.failure', error: profiles)
@@ -138,22 +138,15 @@ module Lita
138
138
 
139
139
  response.reply_with_mention(t('replies.r10k_deploy.working'))
140
140
 
141
- result1 = r10k_git_result(config.master_hostname, user, config.control_repo_path)
141
+ result = simple_ssh_command(config.master_hostname, user, r10k_command(environment, mod))
142
142
 
143
- if result1[:exception]
144
- fail_message response, t('replies.r10k_deploy.gitfail'), result1[:exception].message
145
- return false
146
- end
147
-
148
- result2 = simple_ssh_command(config.master_hostname, user, r10k_command(environment, mod))
149
-
150
- if result2[:exception]
151
- fail_message response, t('replies.r10k_deploy.pupfail'), result2[:exception].message
143
+ if result[:exception]
144
+ fail_message response, t('replies.r10k_deploy.failure'), result[:exception].message
152
145
  else
153
146
  success_message(
154
147
  response,
155
148
  t('replies.r10k_deploy.success'),
156
- [result1[:stdout].join("\n"), result2[:stderr].join("\n")].join("\n")
149
+ [result[:stdout].join("\n"), result[:stderr].join("\n")].join("\n")
157
150
  )
158
151
  end
159
152
  end
@@ -167,31 +160,11 @@ module Lita
167
160
 
168
161
  alias success_message fail_message
169
162
 
170
- def simple_ssh_command(host, user, command, timeout = 300)
171
- over_ssh(host: host, user: user, timeout: timeout) do |server|
172
- server.cd '/tmp'
173
- # Need to use sudo
174
- server.enable_sudo
175
- # scary...
176
- server.disable_safe_mode
177
-
178
- server.execute command
179
- end
180
- end
181
-
182
163
  def cert_clean_result(host, user, cert)
183
164
  cmd = "puppet cert clean #{cert} 2>&1"
184
165
  simple_ssh_command(host, user, cmd, 120)
185
166
  end
186
167
 
187
- def r10k_git_result(host, user, repo_location)
188
- over_ssh(host: host, user: user, timeout: 120) do |server|
189
- # Need to use sudo
190
- server.enable_sudo
191
- server[repo_location].git :pull
192
- end
193
- end
194
-
195
168
  Lita.register_handler(self)
196
169
  end
197
170
  end
@@ -2,25 +2,6 @@ module Utils
2
2
  module LitaPuppet
3
3
  # Utility methods for working with PuppetDB
4
4
  module PuppetDB
5
- def dbquery(url, q)
6
- # TODO: validate incoming query structure
7
- client = ::PuppetDB::Client.new(server: url)
8
- client.request(*q)
9
- end
10
-
11
- def node_roles_and_profiles(url, nodename)
12
- # TODO: validate url and nodename
13
- ::PuppetDB::Client.new(server: url) # this is weird but required
14
- d = ::PuppetDB::Client.get("/catalogs/#{nodename}")
15
- return d['error'] if d['error']
16
-
17
- tags = []
18
- d['data']['resources'].each { |r| tags.concat(r['tags']) }
19
-
20
- # return all the tags related to profile:: or role::
21
- tags.sort.uniq.select { |t| t.match(/^(profile|role)::/) }
22
- end
23
-
24
5
  def class_nodes(url, classname)
25
6
  client = ::PuppetDB::Client.new(server: url)
26
7
  q = client.request(
@@ -34,6 +15,26 @@ module Utils
34
15
 
35
16
  q.data.map { |node| node['certname'] }
36
17
  end
18
+
19
+ def node_roles_and_profiles(url, what, nodename)
20
+ # TODO: validate url and nodename
21
+ ::PuppetDB::Client.new(server: url) # this is weird but required
22
+ d = ::PuppetDB::Client.get("/catalogs/#{nodename}")
23
+ return d['error'] if d['error']
24
+
25
+ tags = []
26
+ d['data']['resources'].each { |r| tags.concat(r['tags']) }
27
+
28
+ # return all the tags related to profile:: or role::
29
+ case what
30
+ when 'profiles'
31
+ tags.sort.uniq.select { |t| t.match(/^profile::/) }
32
+ when 'roles'
33
+ tags.sort.uniq.select { |t| t.match(/^role::/) }
34
+ when 'r&p', 'p&r', 'roles and profiles'
35
+ tags.sort.uniq.select { |t| t.match(/^(profile|role)::/) }
36
+ end
37
+ end
37
38
  end
38
39
  end
39
40
  end
@@ -2,6 +2,19 @@ module Utils
2
2
  module LitaPuppet
3
3
  # Utility methods for doing things over SSH
4
4
  module SSH
5
+ # Only really used for the over_ssh method to determine success or failure
6
+ def calculate_result(output, exception)
7
+ result = {}
8
+ if exception
9
+ result[:exception] = exception
10
+ else
11
+ result[:exit_status] = output.exit_status
12
+ result[:stdout] = output.stdout
13
+ result[:stderr] = output.stderr
14
+ end
15
+ result
16
+ end
17
+
5
18
  # Intelligently do some things over SSH
6
19
  def over_ssh(opts = {})
7
20
  raise 'MissingSSHHost' unless opts[:host]
@@ -31,16 +44,17 @@ module Utils
31
44
  calculate_result(output, exception)
32
45
  end
33
46
 
34
- def calculate_result(output, exception)
35
- result = {}
36
- if exception
37
- result[:exception] = exception
38
- else
39
- result[:exit_status] = output.exit_status
40
- result[:stdout] = output.stdout
41
- result[:stderr] = output.stderr
47
+ # Provides a super simple way to just run a single command over ssh
48
+ def simple_ssh_command(host, user, command, timeout = 300)
49
+ over_ssh(host: host, user: user, timeout: timeout) do |server|
50
+ server.cd '/tmp'
51
+ # Need to use sudo
52
+ server.enable_sudo
53
+ # scary...
54
+ server.disable_safe_mode
55
+
56
+ server.execute command
42
57
  end
43
- result
44
58
  end
45
59
  end
46
60
  end
@@ -2,15 +2,11 @@ module Utils
2
2
  module LitaPuppet
3
3
  # Utility methods for manipulating text
4
4
  module Text
5
- # Strip off bad characters
6
- def sanitze_for_chat(text)
7
- # Remove bash colorings
8
- text.gsub(/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]/, '')
9
- end
10
-
11
- # camel case puppet classes
12
- def class_camel(text)
13
- text.split('::').map(&:capitalize).join('::')
5
+ def agent_command
6
+ command = 'puppet agent'
7
+ command << ' --onetime --verbose --no-daemonize'
8
+ command << ' --no-usecacheonfailure'
9
+ command << ' --no-splay --show_diff 2>&1'
14
10
  end
15
11
 
16
12
  # Format some text as code
@@ -20,6 +16,11 @@ module Utils
20
16
  '/code ' + sanitze_for_chat(text)
21
17
  end
22
18
 
19
+ # camel case puppet classes
20
+ def class_camel(text)
21
+ text.split('::').map(&:capitalize).join('::')
22
+ end
23
+
23
24
  def r10k_command(environment, mod)
24
25
  command = 'r10k deploy'
25
26
  if environment && mod
@@ -31,11 +32,10 @@ module Utils
31
32
  end
32
33
  end
33
34
 
34
- def agent_command
35
- command = 'puppet agent'
36
- command << ' --onetime --verbose --no-daemonize'
37
- command << ' --no-usecacheonfailure'
38
- command << ' --no-splay --show_diff 2>&1'
35
+ # Strip off bad characters
36
+ def sanitze_for_chat(text)
37
+ # Remove bash colorings
38
+ text.gsub(/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]/, '')
39
39
  end
40
40
  end
41
41
  end
data/lita-puppet.gemspec CHANGED
@@ -1,6 +1,7 @@
1
+ # rubocop:disable Metrics/BlockLength
1
2
  Gem::Specification.new do |spec|
2
3
  spec.name = 'lita-puppet'
3
- spec.version = '0.6.3'
4
+ spec.version = '0.7.0'
4
5
  spec.authors = ['Daniel Schaaff', 'Jonathan Gnagy'].sort
5
6
  spec.email = ['jgnagy@knuedge.com']
6
7
  spec.description = 'Some basic Puppet interactions for Lita'
@@ -14,6 +15,8 @@ Gem::Specification.new do |spec|
14
15
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
16
  spec.require_paths = ['lib']
16
17
 
18
+ spec.required_ruby_version = '~> 2.2'
19
+
17
20
  spec.add_runtime_dependency 'lita', '~> 4.7'
18
21
  spec.add_runtime_dependency 'rye'
19
22
  spec.add_runtime_dependency 'puppetdb-ruby'
@@ -26,4 +29,5 @@ Gem::Specification.new do |spec|
26
29
  spec.add_development_dependency 'simplecov'
27
30
  spec.add_development_dependency 'coveralls'
28
31
  spec.add_development_dependency 'rubocop'
32
+ spec.add_development_dependency 'travis', '~> 1.8'
29
33
  end
data/locales/en.yml CHANGED
@@ -10,7 +10,7 @@ en:
10
10
  syntax: puppet cert clean <host>
11
11
  desc: Remove all traces of the SSL cert for <host> on the Puppet Master.
12
12
  node_profiles:
13
- syntax: puppet catalog <host> profiles
13
+ syntax: puppet profiles | roles | roles and profiles <host>
14
14
  desc: Query PuppetDB to get a list of all roles and profiles applied to <host>.
15
15
  nodes_with_class:
16
16
  syntax: puppet class nodes <class>
@@ -39,6 +39,5 @@ en:
39
39
  success: "Here are all the nodes with class %{pclass}:"
40
40
  r10k_deploy:
41
41
  working: "I'll get right on that. Give me a moment and I'll let you know how it went."
42
- gitfail: "your r10k run didn't seem to work. Looks like there was a problem with Git:"
43
- pupfail: "your r10k run didn't seem to work. Here's what went wrong:"
42
+ failure: "your r10k run didn't seem to work. Here's what went wrong:"
44
43
  success: "your r10k deployment is done!"
@@ -1,23 +1,109 @@
1
1
  require 'spec_helper'
2
+ require 'pry'
2
3
 
3
4
  describe Lita::Handlers::Puppet, lita_handler: true do
4
- it 'routes agent run commands properly' do
5
- is_expected.to route_command('puppet agent run on foo').to(:puppet_agent_run)
5
+ before do
6
+ registry.config.handlers.puppet.master_hostname = 'puppet.foo'
7
+ registry.config.handlers.puppet.puppetdb_url = 'http://pboard.foo:8080'
6
8
  end
7
9
 
8
- it 'routes cert clean commands properly' do
9
- is_expected.to route_command('puppet cert clean foo').to(:cert_clean)
10
+ let(:lita_user) { Lita::User.create('User', name: 'A User', mention_name: 'user') }
11
+
12
+ let(:new_puppetdb_request_only) do
13
+ instance_double('::PuppetDB::Client', request: puppetdb_nodes)
10
14
  end
11
15
 
12
- it 'routes catalog profiles commands properly' do
13
- is_expected.to route_command('puppet catalog foo profiles').to(:node_profiles)
16
+ let(:puppetdb_nodes) do
17
+ double(
18
+ data: [
19
+ { 'certname' => 'server1.foo' },
20
+ { 'certname' => 'server2.foo' }
21
+ ]
22
+ )
14
23
  end
15
24
 
16
- it 'routes class nodes commands properly' do
17
- is_expected.to route_command('puppet class nodes foo').to(:nodes_with_class)
25
+ let(:rye_box) do
26
+ box = instance_double(
27
+ 'Rye::Box',
28
+ disable_safe_mode: true,
29
+ disconnect: true,
30
+ enable_sudo: true,
31
+ execute: rye_output_base
32
+ )
33
+ allow(box).to receive(:cd).with('/tmp').and_return(true)
34
+ box
18
35
  end
19
36
 
20
- it 'routes r10k commands properly' do
37
+ let(:rye_output_base) { double(exit_status: 0, stdout: ['foo'], stderr: ['bar']) }
38
+
39
+ it 'should have the required routes' do
40
+ is_expected.to route_command('puppet agent run on foo').to(:puppet_agent_run)
41
+ is_expected.to route_command('puppet cert clean foo').to(:cert_clean)
42
+ is_expected.to route_command('puppet profiles foo').to(:node_profiles)
43
+ is_expected.to route_command('puppet class nodes foo').to(:nodes_with_class)
21
44
  is_expected.to route_command('puppet r10k').to(:r10k_deploy)
22
45
  end
46
+
47
+ describe('#cert_clean') do
48
+ it 'should clean a cert' do
49
+ allow(Rye::Box).to receive(:new).and_return(rye_box)
50
+ send_command('puppet cert clean server.name', as: lita_user)
51
+ expect(replies[-2]).to eq('your `puppet cert clean` is all done!')
52
+ end
53
+ end
54
+
55
+ describe('#puppet_agent_run') do
56
+ it 'should run a puppet agent' do
57
+ allow(Rye::Box).to receive(:new).and_return(rye_box)
58
+ send_command('puppet agent run on server.name', as: lita_user)
59
+ expect(replies[-2]).to eq('that puppet run is complete! It exited with status 0.')
60
+ end
61
+ end
62
+
63
+ describe('#node_profiles') do
64
+ it 'should provide a list of profiles and roles associated with a node' do
65
+ allow(::PuppetDB::Client).to receive(:get).and_return(
66
+ 'data' => {
67
+ 'resources' => [
68
+ { 'tags' => ['profile::foo'] },
69
+ { 'tags' => ['role::baz'] }
70
+ ]
71
+ }
72
+ )
73
+ send_command('puppet roles and profiles foo', as: lita_user)
74
+ expect(replies.last).to eq("/code profile::foo\nrole::baz")
75
+ end
76
+ end
77
+
78
+ describe('#nodes_with_class') do
79
+ it 'should provide a list of nodes containing a class' do
80
+ allow(::PuppetDB::Client).to receive(:new).and_return(new_puppetdb_request_only)
81
+ send_command('puppet class nodes profile::foo', as: lita_user)
82
+ expect(replies.last).to eq("/code server1.foo\nserver2.foo")
83
+ end
84
+ end
85
+
86
+ describe('#r10k_deploy') do
87
+ context 'without a module or environment' do
88
+ it 'should trigger r10k on the puppet master' do
89
+ allow(Rye::Box).to receive(:new).and_return(rye_box)
90
+ send_command('puppet deploy', as: lita_user)
91
+ expect(replies[-2]).to eq('your r10k deployment is done!')
92
+ end
93
+ end
94
+ context 'with an environment and no module' do
95
+ it 'should trigger r10k on the puppet master' do
96
+ allow(Rye::Box).to receive(:new).and_return(rye_box)
97
+ send_command('puppet deploy production', as: lita_user)
98
+ expect(replies[-2]).to eq('your r10k deployment is done!')
99
+ end
100
+ end
101
+ context 'with an environment and a module' do
102
+ it 'should trigger r10k on the puppet master' do
103
+ allow(Rye::Box).to receive(:new).and_return(rye_box)
104
+ send_command('puppet deploy production role', as: lita_user)
105
+ expect(replies[-2]).to eq('your r10k deployment is done!')
106
+ end
107
+ end
108
+ end
23
109
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-puppet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Schaaff
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-11-03 00:00:00.000000000 Z
12
+ date: 2016-11-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: lita
@@ -165,6 +165,20 @@ dependencies:
165
165
  - - ">="
166
166
  - !ruby/object:Gem::Version
167
167
  version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: travis
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: '1.8'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '1.8'
168
182
  description: Some basic Puppet interactions for Lita
169
183
  email:
170
184
  - jgnagy@knuedge.com
@@ -201,9 +215,9 @@ require_paths:
201
215
  - lib
202
216
  required_ruby_version: !ruby/object:Gem::Requirement
203
217
  requirements:
204
- - - ">="
218
+ - - "~>"
205
219
  - !ruby/object:Gem::Version
206
- version: '0'
220
+ version: '2.2'
207
221
  required_rubygems_version: !ruby/object:Gem::Requirement
208
222
  requirements:
209
223
  - - ">="
@@ -211,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
225
  version: '0'
212
226
  requirements: []
213
227
  rubyforge_project:
214
- rubygems_version: 2.5.1
228
+ rubygems_version: 2.4.5
215
229
  signing_key:
216
230
  specification_version: 4
217
231
  summary: Allow the Lita bot to handle requests for puppet tasks