kitchen-ansible 0.0.1 → 0.0.2
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.
|
@@ -50,7 +50,9 @@ module Kitchen
|
|
|
50
50
|
default_config :ansible_yum_repo, "https://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm"
|
|
51
51
|
default_config :chef_bootstrap_url, "https://www.getchef.com/chef/install.sh"
|
|
52
52
|
|
|
53
|
-
default_config :playbook
|
|
53
|
+
default_config :playbook do |provisioner|
|
|
54
|
+
provisioner.calculate_path('site.yml', :file)
|
|
55
|
+
end
|
|
54
56
|
|
|
55
57
|
default_config :roles_path do |provisioner|
|
|
56
58
|
provisioner.calculate_path('roles') or
|
|
@@ -74,24 +76,39 @@ module Kitchen
|
|
|
74
76
|
end
|
|
75
77
|
|
|
76
78
|
default_config :ansible_verbose, false
|
|
77
|
-
default_config :
|
|
79
|
+
default_config :ansible_verbosity, 1
|
|
80
|
+
default_config :ansible_noop, false # what is ansible equivalent of dry_run???? ##JMC: I think it's [--check mode](http://docs.ansible.com/playbooks_checkmode.html) TODO: Look into this...
|
|
78
81
|
default_config :ansible_platform, ''
|
|
79
82
|
default_config :update_package_repos, true
|
|
80
83
|
|
|
84
|
+
def verbosity_level(level = 1)
|
|
85
|
+
level = level.to_sym if level.is_a? String
|
|
86
|
+
log_levels = { :info => 1, :warn => 2, :debug => 3, :trace => 4 }
|
|
87
|
+
if level.is_a? Symbol and log_levels.include? level
|
|
88
|
+
# puts "Log Level is: #{log_levels[level]}"
|
|
89
|
+
log_levels[level]
|
|
90
|
+
elsif level.is_a? Integer and level > 0
|
|
91
|
+
# puts "Log Level is: #{level}"
|
|
92
|
+
level
|
|
93
|
+
else
|
|
94
|
+
raise 'Invalid ansible_verbosity setting. Valid values are: 1, 2, 3, 4 OR :info, :warn, :debug, :trace'
|
|
95
|
+
end
|
|
96
|
+
end
|
|
81
97
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
98
|
+
def calculate_path(path, type = :directory)
|
|
99
|
+
base = config[:test_base_path]
|
|
100
|
+
candidates = []
|
|
101
|
+
candidates << File.join(base, instance.suite.name, 'ansible', path)
|
|
102
|
+
candidates << File.join(base, instance.suite.name, path)
|
|
103
|
+
candidates << File.join(base, path)
|
|
104
|
+
candidates << File.join(Dir.pwd, path)
|
|
105
|
+
candidates << File.join(Dir.pwd) if path == 'roles'
|
|
106
|
+
|
|
107
|
+
debug("Calculating path for #{path}, candidates are: #{candidates.to_s}")
|
|
108
|
+
candidates.find do |c|
|
|
109
|
+
type == :directory ? File.directory?(c) : File.file?(c)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
95
112
|
|
|
96
113
|
def install_command
|
|
97
114
|
return unless config[:require_ansible_omnibus] or config[:require_ansible_repo]
|
|
@@ -118,14 +135,29 @@ module Kitchen
|
|
|
118
135
|
info("Installing ansible on #{ansible_platform}")
|
|
119
136
|
<<-INSTALL
|
|
120
137
|
if [ ! $(which ansible) ]; then
|
|
138
|
+
## Install apt-utils to silence debconf warning: http://serverfault.com/q/358943/77156
|
|
139
|
+
#{sudo('apt-get')} -y install apt-utils
|
|
140
|
+
## Fix debconf tty warning messages
|
|
141
|
+
export DEBIAN_FRONTEND=noninteractive
|
|
142
|
+
## 13.10, 14.04 include add-apt-repository in software-properties-common
|
|
143
|
+
#{sudo('apt-get')} -y install software-properties-common
|
|
144
|
+
## 10.04, 12.04 include add-apt-repository in
|
|
145
|
+
#{sudo('apt-get')} -y install python-software-properties
|
|
121
146
|
# #{sudo('wget')} #{ansible_apt_repo}
|
|
122
147
|
# #{sudo('dpkg')} -i #{ansible_apt_repo_file}
|
|
148
|
+
# #{sudo('apt-get')} -y autoremove ## These autoremove/autoclean are sometimes useful but
|
|
149
|
+
# #{sudo('apt-get')} -y autoclean ## don't seem necessary for the Ubuntu OpsCode bento boxes that are not EOL by Canonical
|
|
123
150
|
# #{update_packages_debian_cmd}
|
|
124
|
-
# #{sudo('apt-get')} -y install ansible#{ansible_debian_version}
|
|
125
|
-
|
|
126
|
-
|
|
151
|
+
# #{sudo('apt-get')} -y --force-yes install ansible#{ansible_debian_version} python-selinux
|
|
152
|
+
## 10.04 version of add-apt-repository doesn't accept --yes
|
|
153
|
+
## later versions require interaction from user, so we must specify --yes
|
|
154
|
+
## First try with -y flag, else if it fails, try without.
|
|
155
|
+
## "add-apt-repository: error: no such option: -y" is returned but is ok to ignore, we just retry
|
|
156
|
+
#{sudo('add-apt-repository')} -y #{ansible_apt_repo} || #{sudo('add-apt-repository')} #{ansible_apt_repo}
|
|
157
|
+
#{sudo('apt-get')} update
|
|
127
158
|
#{sudo('apt-get')} -y install ansible
|
|
128
|
-
|
|
159
|
+
## This test works on ubuntu to test if ansible repo has been installed via rquillo ppa repo
|
|
160
|
+
## if [ $(apt-cache madison ansible | grep -c rquillo ) -gt 0 ]; then echo 'success'; else echo 'fail'; fi
|
|
129
161
|
fi
|
|
130
162
|
#{install_busser}
|
|
131
163
|
INSTALL
|
|
@@ -135,7 +167,7 @@ module Kitchen
|
|
|
135
167
|
if [ ! $(which ansible) ]; then
|
|
136
168
|
#{sudo('rpm')} -ivh #{ansible_yum_repo}
|
|
137
169
|
#{update_packages_redhat_cmd}
|
|
138
|
-
#{sudo('yum')} -y install ansible#{ansible_redhat_version}
|
|
170
|
+
#{sudo('yum')} -y install ansible#{ansible_redhat_version} libselinux-python
|
|
139
171
|
fi
|
|
140
172
|
#{install_busser}
|
|
141
173
|
INSTALL
|
|
@@ -146,15 +178,31 @@ module Kitchen
|
|
|
146
178
|
if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
|
|
147
179
|
#{sudo('rpm')} -ivh #{ansible_yum_repo}
|
|
148
180
|
#{update_packages_redhat_cmd}
|
|
149
|
-
#{sudo('yum')} -y install ansible#{ansible_redhat_version}
|
|
181
|
+
#{sudo('yum')} -y install ansible#{ansible_redhat_version} libselinux-python
|
|
150
182
|
else
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
183
|
+
## Install apt-utils to silence debconf warning: http://serverfault.com/q/358943/77156
|
|
184
|
+
#{sudo('apt-get')} -y install apt-utils
|
|
185
|
+
## Fix debconf tty warning messages
|
|
186
|
+
export DEBIAN_FRONTEND=noninteractive
|
|
187
|
+
## 13.10, 14.04 include add-apt-repository in software-properties-common
|
|
188
|
+
#{sudo('apt-get')} -y install software-properties-common
|
|
189
|
+
## 10.04, 12.04 include add-apt-repository in
|
|
190
|
+
#{sudo('apt-get')} -y install python-software-properties
|
|
191
|
+
# #{sudo('wget')} #{ansible_apt_repo}
|
|
192
|
+
# #{sudo('dpkg')} -i #{ansible_apt_repo_file}
|
|
193
|
+
# #{sudo('apt-get')} -y autoremove ## These autoremove/autoclean are sometimes useful but
|
|
194
|
+
# #{sudo('apt-get')} -y autoclean ## don't seem necessary for the Ubuntu OpsCode bento boxes that are not EOL by Canonical
|
|
195
|
+
# #{update_packages_debian_cmd}
|
|
196
|
+
# #{sudo('apt-get')} -y --force-yes install ansible#{ansible_debian_version} python-selinux
|
|
197
|
+
## 10.04 version of add-apt-repository doesn't accept --yes
|
|
198
|
+
## later versions require interaction from user, so we must specify --yes
|
|
199
|
+
## First try with -y flag, else if it fails, try without.
|
|
200
|
+
## "add-apt-repository: error: no such option: -y" is returned but is ok to ignore, we just retry
|
|
201
|
+
#{sudo('add-apt-repository')} -y #{ansible_apt_repo} || #{sudo('add-apt-repository')} #{ansible_apt_repo}
|
|
202
|
+
#{sudo('apt-get')} update
|
|
203
|
+
#{sudo('apt-get')} -y install ansible
|
|
204
|
+
## This test works on ubuntu to test if ansible repo has been installed via rquillo ppa repo
|
|
205
|
+
## if [ $(apt-cache madison ansible | grep -c rquillo ) -gt 0 ]; then echo 'success'; else echo 'fail'; fi
|
|
158
206
|
fi
|
|
159
207
|
fi
|
|
160
208
|
#{install_busser}
|
|
@@ -238,7 +286,7 @@ module Kitchen
|
|
|
238
286
|
"-M #{File.join(config[:root_path], 'modules')}",
|
|
239
287
|
ansible_verbose_flag,
|
|
240
288
|
extra_vars,
|
|
241
|
-
"#{File.join(config[:root_path], config[:playbook])}",
|
|
289
|
+
"#{File.join(config[:root_path], File.basename(config[:playbook]))}",
|
|
242
290
|
].join(" ")
|
|
243
291
|
end
|
|
244
292
|
|
|
@@ -251,10 +299,22 @@ module Kitchen
|
|
|
251
299
|
end
|
|
252
300
|
end
|
|
253
301
|
|
|
254
|
-
def
|
|
302
|
+
def tmp_modules_dir
|
|
255
303
|
File.join(sandbox_path, 'modules')
|
|
256
304
|
end
|
|
257
305
|
|
|
306
|
+
def tmp_playbook_path
|
|
307
|
+
File.join(sandbox_path, File.basename(playbook))
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def tmp_host_vars_dir
|
|
311
|
+
File.join(sandbox_path, 'host_vars')
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
def tmp_roles_dir
|
|
315
|
+
File.join(sandbox_path, 'roles')
|
|
316
|
+
end
|
|
317
|
+
|
|
258
318
|
def ansiblefile
|
|
259
319
|
config[:ansiblefile_path] or ''
|
|
260
320
|
end
|
|
@@ -271,6 +331,10 @@ module Kitchen
|
|
|
271
331
|
config[:roles_path]
|
|
272
332
|
end
|
|
273
333
|
|
|
334
|
+
def role_name
|
|
335
|
+
File.basename(roles) == 'roles' ? '' : File.basename(roles)
|
|
336
|
+
end
|
|
337
|
+
|
|
274
338
|
def modules
|
|
275
339
|
config[:modules_path]
|
|
276
340
|
end
|
|
@@ -292,7 +356,7 @@ module Kitchen
|
|
|
292
356
|
end
|
|
293
357
|
|
|
294
358
|
def ansible_verbose_flag
|
|
295
|
-
config[:ansible_verbose] ? '-v' : nil
|
|
359
|
+
config[:ansible_verbose] ? '-' << ('v' * verbosity_level(config[:ansible_verbosity])) : nil
|
|
296
360
|
end
|
|
297
361
|
|
|
298
362
|
def ansible_platform
|
|
@@ -309,8 +373,8 @@ module Kitchen
|
|
|
309
373
|
|
|
310
374
|
def extra_vars
|
|
311
375
|
return nil if config[:extra_vars].none?
|
|
312
|
-
bash_vars = config[:extra_vars]
|
|
313
|
-
bash_vars = "-e
|
|
376
|
+
bash_vars = JSON.dump(config[:extra_vars])
|
|
377
|
+
bash_vars = "-e '#{bash_vars}'"
|
|
314
378
|
debug(bash_vars)
|
|
315
379
|
bash_vars
|
|
316
380
|
end
|
|
@@ -334,10 +398,12 @@ module Kitchen
|
|
|
334
398
|
def prepare_roles
|
|
335
399
|
info('Preparing roles')
|
|
336
400
|
debug("Using roles from #{roles}")
|
|
401
|
+
|
|
402
|
+
# Detect whether we are running tests on a role
|
|
403
|
+
# If so, make sure to copy into VM so dir structure is like: /tmp/kitchen/roles/role_name
|
|
337
404
|
|
|
338
|
-
|
|
339
|
-
FileUtils.
|
|
340
|
-
FileUtils.cp_r(Dir.glob("#{roles}/*"), tmp_roles_dir)
|
|
405
|
+
FileUtils.mkdir_p(File.join(tmp_roles_dir, role_name))
|
|
406
|
+
FileUtils.cp_r(Dir.glob("#{roles}/*"), File.join(tmp_roles_dir, role_name))
|
|
341
407
|
end
|
|
342
408
|
|
|
343
409
|
# /etc/ansible/ansible.cfg should contain
|
|
@@ -351,9 +417,9 @@ module Kitchen
|
|
|
351
417
|
file.write("#no roles path specified\n")
|
|
352
418
|
end
|
|
353
419
|
else
|
|
354
|
-
debug("
|
|
420
|
+
debug("Setting roles_path inside VM to #{File.join(config[:root_path], 'roles', role_name)}")
|
|
355
421
|
File.open( ansible_config_file, "wb") do |file|
|
|
356
|
-
file.write("[defaults]\nroles_path = #{File.join(config[:root_path], roles)}\n")
|
|
422
|
+
file.write("[defaults]\nroles_path = #{File.join(config[:root_path], 'roles', role_name)}\n")
|
|
357
423
|
end
|
|
358
424
|
end
|
|
359
425
|
end
|
|
@@ -377,8 +443,8 @@ module Kitchen
|
|
|
377
443
|
|
|
378
444
|
def prepare_playbook
|
|
379
445
|
info('Preparing playbook')
|
|
380
|
-
debug("
|
|
381
|
-
FileUtils.cp_r(playbook,
|
|
446
|
+
debug("Copying playbook from #{playbook} to #{tmp_playbook_path}")
|
|
447
|
+
FileUtils.cp_r(playbook, tmp_playbook_path)
|
|
382
448
|
end
|
|
383
449
|
|
|
384
450
|
|
|
@@ -398,7 +464,6 @@ module Kitchen
|
|
|
398
464
|
|
|
399
465
|
def prepare_host_vars
|
|
400
466
|
info('Preparing host_vars')
|
|
401
|
-
tmp_host_vars_dir = File.join(sandbox_path, 'host_vars')
|
|
402
467
|
FileUtils.mkdir_p(tmp_host_vars_dir)
|
|
403
468
|
|
|
404
469
|
unless File.directory?(host_vars)
|
|
@@ -413,11 +478,11 @@ module Kitchen
|
|
|
413
478
|
def prepare_modules
|
|
414
479
|
info('Preparing modules')
|
|
415
480
|
|
|
416
|
-
FileUtils.mkdir_p(
|
|
481
|
+
FileUtils.mkdir_p(tmp_modules_dir)
|
|
417
482
|
|
|
418
483
|
if modules && File.directory?(modules)
|
|
419
484
|
debug("Using modules from #{modules}")
|
|
420
|
-
FileUtils.cp_r(Dir.glob("#{modules}/*"),
|
|
485
|
+
FileUtils.cp_r(Dir.glob("#{modules}/*"), tmp_modules_dir, remove_destination: true)
|
|
421
486
|
else
|
|
422
487
|
info 'nothing to do for modules'
|
|
423
488
|
end
|
|
@@ -428,7 +493,7 @@ module Kitchen
|
|
|
428
493
|
|
|
429
494
|
def resolve_with_librarian
|
|
430
495
|
Kitchen.mutex.synchronize do
|
|
431
|
-
Ansible::Librarian.new(ansiblefile,
|
|
496
|
+
Ansible::Librarian.new(ansiblefile, tmp_modules_dir, logger).resolve
|
|
432
497
|
end
|
|
433
498
|
end
|
|
434
499
|
end
|
data/provisioner_options.md
CHANGED
|
@@ -18,6 +18,7 @@ extra_vars | Hash.new | Hash to set the extra_vars passed to ansibile-playbook c
|
|
|
18
18
|
playbook | 'site.yml' | playbook for ansible-playbook to run
|
|
19
19
|
modules_path | | ansible repo manifests directory
|
|
20
20
|
ansible_verbose| false| Extra information logging
|
|
21
|
+
ansible_verbosity| 1| Sets the verbosity flag appropriately (e.g.: `1 => '-v', 2 => '-vv', 3 => '-vvv" ...`) Valid values are one of: `1, 2, 3, 4` OR `:info, :warn, :debug, :trace`.
|
|
21
22
|
update_package_repos| true| update OS repository metadata
|
|
22
23
|
chef_bootstrap_url |"https://www.getchef.com/chef/install.sh"| the chef (needed for busser to run tests)
|
|
23
24
|
ansiblefile_path | | Path to Aansiblefile
|
|
@@ -36,6 +37,7 @@ The provisioner can be configured globally or per suite, global settings act as
|
|
|
36
37
|
hosts: tomcat-servers
|
|
37
38
|
require_ansible_repo: true
|
|
38
39
|
ansible_verbose: true
|
|
40
|
+
ansible_verbosity: 2
|
|
39
41
|
|
|
40
42
|
platforms:
|
|
41
43
|
- name: nocm_ubuntu-12.04
|
metadata
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kitchen-ansible
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.2
|
|
5
|
+
prerelease:
|
|
5
6
|
platform: ruby
|
|
6
7
|
authors:
|
|
7
8
|
- Neill Turner
|
|
8
9
|
autorequire:
|
|
9
10
|
bindir: bin
|
|
10
11
|
cert_chain: []
|
|
11
|
-
date: 2014-
|
|
12
|
+
date: 2014-10-06 00:00:00.000000000 Z
|
|
12
13
|
dependencies: []
|
|
13
14
|
description: ! '== DESCRIPTION:
|
|
14
15
|
|
|
@@ -34,29 +35,29 @@ files:
|
|
|
34
35
|
- lib/kitchen-ansible/version.rb
|
|
35
36
|
- lib/kitchen/provisioner/ansible/librarian.rb
|
|
36
37
|
- lib/kitchen/provisioner/ansible_playbook.rb
|
|
37
|
-
- lib/kitchen/provisioner/ansible_playbook_spec.rb
|
|
38
38
|
- provisioner_options.md
|
|
39
39
|
homepage: https://github.com/neillturner/kitchen-ansible
|
|
40
40
|
licenses: []
|
|
41
|
-
metadata: {}
|
|
42
41
|
post_install_message:
|
|
43
42
|
rdoc_options: []
|
|
44
43
|
require_paths:
|
|
45
44
|
- lib
|
|
46
45
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
46
|
+
none: false
|
|
47
47
|
requirements:
|
|
48
48
|
- - ! '>='
|
|
49
49
|
- !ruby/object:Gem::Version
|
|
50
50
|
version: '0'
|
|
51
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
|
+
none: false
|
|
52
53
|
requirements:
|
|
53
54
|
- - ! '>='
|
|
54
55
|
- !ruby/object:Gem::Version
|
|
55
56
|
version: '0'
|
|
56
57
|
requirements: []
|
|
57
58
|
rubyforge_project: ! '[none]'
|
|
58
|
-
rubygems_version:
|
|
59
|
+
rubygems_version: 1.8.24
|
|
59
60
|
signing_key:
|
|
60
|
-
specification_version:
|
|
61
|
+
specification_version: 3
|
|
61
62
|
summary: ansible provisioner for test-kitchen
|
|
62
63
|
test_files: []
|
checksums.yaml
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
!binary "U0hBMQ==":
|
|
3
|
-
metadata.gz: !binary |-
|
|
4
|
-
ZDdjMTc4NWYzMTQ1ZjJiODIyY2UzNDhlMDZkNDc4MmUxNTdlMzQ1YQ==
|
|
5
|
-
data.tar.gz: !binary |-
|
|
6
|
-
OWU4MWIxODk3NTAzM2VjODA1NDg1MmNlMjZhZWE5MWQ2ZGM3MjcxZg==
|
|
7
|
-
SHA512:
|
|
8
|
-
metadata.gz: !binary |-
|
|
9
|
-
MjI1ZjhhNThiNmJhMjBhMmYyMWQ4NDg4MDlmODBmNWZjYzdlMDY4NjlkZDU2
|
|
10
|
-
NzM5NDFiYzAxZTU4MjM5MmQ5NTA1YjZkMzg2OGZlYzcwODc3ZDk5NzA1OWY0
|
|
11
|
-
OTZlMTBlMGM1ZTM0NjZmMDk4NDIxMDJjMzVhMTI2ODZmNDA2MzQ=
|
|
12
|
-
data.tar.gz: !binary |-
|
|
13
|
-
NzNmY2EzYzczOGY4MTlkZmU5OWFiNTcyNDM5OGIwNmRiZjQxMGYzY2QxMGMw
|
|
14
|
-
NjRlMGY1YjQ3NjNmOGY4NWMzY2NiMGM0OTA3NmU5OTNhNjYxMjZjZWRiMDRj
|
|
15
|
-
ZDEyMWU2N2E1YjgzMTllNzY4Nzg1ZWY1MzNmY2JhMjE0OTU3NDc=
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Neill Turner (<neillwturner@gmail.com>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 2013,2014 Neill Turner
|
|
6
|
-
#
|
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
# you may not use this file except in compliance with the License.
|
|
9
|
-
# You may obtain a copy of the License at
|
|
10
|
-
#
|
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
#
|
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
# See the License for the specific language governing permissions and
|
|
17
|
-
# limitations under the License.
|
|
18
|
-
|
|
19
|
-
require_relative '../../spec_helper'
|
|
20
|
-
require 'kitchen'
|
|
21
|
-
|
|
22
|
-
# Work around for lazy loading
|
|
23
|
-
require 'kitchen/provisioner/ansible_playbook'
|
|
24
|
-
|
|
25
|
-
describe Kitchen::Provisioner::AnsiblePlaybook do
|
|
26
|
-
let(:provisioner) do
|
|
27
|
-
Kitchen::Provisioner.for_plugin("ansible_playbook", {})
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "should give a sane run_command" do
|
|
31
|
-
provisioner.run_command.must_match /ansible-playbook/
|
|
32
|
-
end
|
|
33
|
-
end
|