lita-puppet 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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