cloud-mu 2.1.0beta → 3.0.0beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (291) hide show
  1. checksums.yaml +5 -5
  2. data/Berksfile +4 -5
  3. data/Berksfile.lock +179 -0
  4. data/README.md +1 -6
  5. data/ansible/roles/geerlingguy.firewall/templates/firewall.bash.j2 +0 -0
  6. data/ansible/roles/mu-installer/README.md +33 -0
  7. data/ansible/roles/mu-installer/defaults/main.yml +2 -0
  8. data/ansible/roles/mu-installer/handlers/main.yml +2 -0
  9. data/ansible/roles/mu-installer/meta/main.yml +60 -0
  10. data/ansible/roles/mu-installer/tasks/main.yml +13 -0
  11. data/ansible/roles/mu-installer/tests/inventory +2 -0
  12. data/ansible/roles/mu-installer/tests/test.yml +5 -0
  13. data/ansible/roles/mu-installer/vars/main.yml +2 -0
  14. data/bin/mu-adopt +125 -0
  15. data/bin/mu-aws-setup +4 -4
  16. data/bin/mu-azure-setup +265 -0
  17. data/bin/mu-azure-tests +43 -0
  18. data/bin/mu-cleanup +20 -8
  19. data/bin/mu-configure +224 -98
  20. data/bin/mu-deploy +8 -3
  21. data/bin/mu-gcp-setup +16 -8
  22. data/bin/mu-gen-docs +92 -8
  23. data/bin/mu-load-config.rb +52 -12
  24. data/bin/mu-momma-cat +36 -0
  25. data/bin/mu-node-manage +34 -27
  26. data/bin/mu-self-update +2 -2
  27. data/bin/mu-ssh +12 -8
  28. data/bin/mu-upload-chef-artifacts +11 -4
  29. data/bin/mu-user-manage +3 -0
  30. data/cloud-mu.gemspec +8 -11
  31. data/cookbooks/firewall/libraries/helpers_iptables.rb +2 -2
  32. data/cookbooks/firewall/metadata.json +1 -1
  33. data/cookbooks/firewall/recipes/default.rb +5 -9
  34. data/cookbooks/mu-firewall/attributes/default.rb +2 -0
  35. data/cookbooks/mu-firewall/metadata.rb +1 -1
  36. data/cookbooks/mu-glusterfs/templates/default/mu-gluster-client.erb +0 -0
  37. data/cookbooks/mu-master/Berksfile +2 -2
  38. data/cookbooks/mu-master/files/default/check_mem.pl +0 -0
  39. data/cookbooks/mu-master/files/default/cloudamatic.png +0 -0
  40. data/cookbooks/mu-master/metadata.rb +5 -4
  41. data/cookbooks/mu-master/recipes/389ds.rb +1 -1
  42. data/cookbooks/mu-master/recipes/basepackages.rb +30 -10
  43. data/cookbooks/mu-master/recipes/default.rb +59 -7
  44. data/cookbooks/mu-master/recipes/firewall-holes.rb +1 -1
  45. data/cookbooks/mu-master/recipes/init.rb +65 -47
  46. data/cookbooks/mu-master/recipes/{eks-kubectl.rb → kubectl.rb} +4 -10
  47. data/cookbooks/mu-master/recipes/sssd.rb +2 -1
  48. data/cookbooks/mu-master/recipes/update_nagios_only.rb +6 -6
  49. data/cookbooks/mu-master/templates/default/web_app.conf.erb +2 -2
  50. data/cookbooks/mu-master/templates/mods/ldap.conf.erb +4 -0
  51. data/cookbooks/mu-php54/Berksfile +1 -2
  52. data/cookbooks/mu-php54/metadata.rb +4 -5
  53. data/cookbooks/mu-php54/recipes/default.rb +1 -1
  54. data/cookbooks/mu-splunk/templates/default/splunk-init.erb +0 -0
  55. data/cookbooks/mu-tools/Berksfile +3 -2
  56. data/cookbooks/mu-tools/files/default/Mu_CA.pem +33 -0
  57. data/cookbooks/mu-tools/libraries/helper.rb +20 -8
  58. data/cookbooks/mu-tools/metadata.rb +5 -2
  59. data/cookbooks/mu-tools/recipes/apply_security.rb +2 -3
  60. data/cookbooks/mu-tools/recipes/eks.rb +1 -1
  61. data/cookbooks/mu-tools/recipes/gcloud.rb +5 -30
  62. data/cookbooks/mu-tools/recipes/nagios.rb +1 -1
  63. data/cookbooks/mu-tools/recipes/rsyslog.rb +1 -0
  64. data/cookbooks/mu-tools/recipes/selinux.rb +19 -0
  65. data/cookbooks/mu-tools/recipes/split_var_partitions.rb +0 -1
  66. data/cookbooks/mu-tools/recipes/windows-client.rb +256 -122
  67. data/cookbooks/mu-tools/resources/disk.rb +3 -1
  68. data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +1 -1
  69. data/cookbooks/mu-tools/templates/default/etc_hosts.erb +1 -1
  70. data/cookbooks/mu-tools/templates/default/{kubeconfig.erb → kubeconfig-eks.erb} +0 -0
  71. data/cookbooks/mu-tools/templates/default/kubeconfig-gke.erb +27 -0
  72. data/cookbooks/mu-tools/templates/windows-10/sshd_config.erb +137 -0
  73. data/cookbooks/mu-utility/recipes/nat.rb +4 -0
  74. data/extras/alpha.png +0 -0
  75. data/extras/beta.png +0 -0
  76. data/extras/clean-stock-amis +2 -2
  77. data/extras/generate-stock-images +131 -0
  78. data/extras/git-fix-permissions-hook +0 -0
  79. data/extras/image-generators/AWS/centos6.yaml +17 -0
  80. data/extras/image-generators/{aws → AWS}/centos7-govcloud.yaml +0 -0
  81. data/extras/image-generators/{aws → AWS}/centos7.yaml +0 -0
  82. data/extras/image-generators/{aws → AWS}/rhel7.yaml +0 -0
  83. data/extras/image-generators/{aws → AWS}/win2k12.yaml +0 -0
  84. data/extras/image-generators/{aws → AWS}/win2k16.yaml +0 -0
  85. data/extras/image-generators/{aws → AWS}/windows.yaml +0 -0
  86. data/extras/image-generators/{gcp → Google}/centos6.yaml +1 -0
  87. data/extras/image-generators/Google/centos7.yaml +18 -0
  88. data/extras/python_rpm/build.sh +0 -0
  89. data/extras/release.png +0 -0
  90. data/extras/ruby_rpm/build.sh +0 -0
  91. data/extras/ruby_rpm/muby.spec +1 -1
  92. data/install/README.md +43 -5
  93. data/install/deprecated-bash-library.sh +0 -0
  94. data/install/installer +1 -1
  95. data/install/jenkinskeys.rb +0 -0
  96. data/install/mu-master.yaml +55 -0
  97. data/modules/mommacat.ru +41 -7
  98. data/modules/mu.rb +444 -149
  99. data/modules/mu/adoption.rb +500 -0
  100. data/modules/mu/cleanup.rb +235 -158
  101. data/modules/mu/cloud.rb +675 -138
  102. data/modules/mu/clouds/aws.rb +156 -24
  103. data/modules/mu/clouds/aws/alarm.rb +4 -14
  104. data/modules/mu/clouds/aws/bucket.rb +60 -18
  105. data/modules/mu/clouds/aws/cache_cluster.rb +8 -20
  106. data/modules/mu/clouds/aws/collection.rb +12 -22
  107. data/modules/mu/clouds/aws/container_cluster.rb +209 -118
  108. data/modules/mu/clouds/aws/database.rb +120 -45
  109. data/modules/mu/clouds/aws/dnszone.rb +7 -18
  110. data/modules/mu/clouds/aws/endpoint.rb +5 -15
  111. data/modules/mu/clouds/aws/firewall_rule.rb +144 -72
  112. data/modules/mu/clouds/aws/folder.rb +4 -11
  113. data/modules/mu/clouds/aws/function.rb +6 -16
  114. data/modules/mu/clouds/aws/group.rb +4 -12
  115. data/modules/mu/clouds/aws/habitat.rb +11 -13
  116. data/modules/mu/clouds/aws/loadbalancer.rb +40 -28
  117. data/modules/mu/clouds/aws/log.rb +5 -13
  118. data/modules/mu/clouds/aws/msg_queue.rb +9 -24
  119. data/modules/mu/clouds/aws/nosqldb.rb +4 -12
  120. data/modules/mu/clouds/aws/notifier.rb +6 -13
  121. data/modules/mu/clouds/aws/role.rb +69 -40
  122. data/modules/mu/clouds/aws/search_domain.rb +17 -20
  123. data/modules/mu/clouds/aws/server.rb +184 -94
  124. data/modules/mu/clouds/aws/server_pool.rb +33 -38
  125. data/modules/mu/clouds/aws/storage_pool.rb +5 -12
  126. data/modules/mu/clouds/aws/user.rb +59 -33
  127. data/modules/mu/clouds/aws/userdata/linux.erb +18 -30
  128. data/modules/mu/clouds/aws/userdata/windows.erb +9 -9
  129. data/modules/mu/clouds/aws/vpc.rb +214 -145
  130. data/modules/mu/clouds/azure.rb +978 -44
  131. data/modules/mu/clouds/azure/container_cluster.rb +413 -0
  132. data/modules/mu/clouds/azure/firewall_rule.rb +500 -0
  133. data/modules/mu/clouds/azure/habitat.rb +167 -0
  134. data/modules/mu/clouds/azure/loadbalancer.rb +205 -0
  135. data/modules/mu/clouds/azure/role.rb +211 -0
  136. data/modules/mu/clouds/azure/server.rb +810 -0
  137. data/modules/mu/clouds/azure/user.rb +257 -0
  138. data/modules/mu/clouds/azure/userdata/README.md +4 -0
  139. data/modules/mu/clouds/azure/userdata/linux.erb +137 -0
  140. data/modules/mu/clouds/azure/userdata/windows.erb +275 -0
  141. data/modules/mu/clouds/azure/vpc.rb +782 -0
  142. data/modules/mu/clouds/cloudformation.rb +12 -9
  143. data/modules/mu/clouds/cloudformation/firewall_rule.rb +5 -13
  144. data/modules/mu/clouds/cloudformation/server.rb +10 -1
  145. data/modules/mu/clouds/cloudformation/server_pool.rb +1 -0
  146. data/modules/mu/clouds/cloudformation/vpc.rb +0 -2
  147. data/modules/mu/clouds/google.rb +554 -117
  148. data/modules/mu/clouds/google/bucket.rb +173 -32
  149. data/modules/mu/clouds/google/container_cluster.rb +1112 -157
  150. data/modules/mu/clouds/google/database.rb +24 -47
  151. data/modules/mu/clouds/google/firewall_rule.rb +344 -89
  152. data/modules/mu/clouds/google/folder.rb +156 -79
  153. data/modules/mu/clouds/google/group.rb +272 -82
  154. data/modules/mu/clouds/google/habitat.rb +177 -52
  155. data/modules/mu/clouds/google/loadbalancer.rb +9 -34
  156. data/modules/mu/clouds/google/role.rb +1211 -0
  157. data/modules/mu/clouds/google/server.rb +491 -227
  158. data/modules/mu/clouds/google/server_pool.rb +233 -48
  159. data/modules/mu/clouds/google/user.rb +479 -125
  160. data/modules/mu/clouds/google/userdata/linux.erb +3 -3
  161. data/modules/mu/clouds/google/userdata/windows.erb +9 -9
  162. data/modules/mu/clouds/google/vpc.rb +381 -223
  163. data/modules/mu/config.rb +689 -214
  164. data/modules/mu/config/bucket.rb +1 -1
  165. data/modules/mu/config/cache_cluster.rb +1 -1
  166. data/modules/mu/config/cache_cluster.yml +0 -4
  167. data/modules/mu/config/container_cluster.rb +18 -9
  168. data/modules/mu/config/database.rb +6 -23
  169. data/modules/mu/config/firewall_rule.rb +9 -15
  170. data/modules/mu/config/folder.rb +22 -21
  171. data/modules/mu/config/habitat.rb +22 -21
  172. data/modules/mu/config/loadbalancer.rb +2 -2
  173. data/modules/mu/config/role.rb +9 -40
  174. data/modules/mu/config/server.rb +26 -5
  175. data/modules/mu/config/server_pool.rb +1 -1
  176. data/modules/mu/config/storage_pool.rb +2 -2
  177. data/modules/mu/config/user.rb +4 -0
  178. data/modules/mu/config/vpc.rb +350 -110
  179. data/modules/mu/defaults/{amazon_images.yaml → AWS.yaml} +37 -39
  180. data/modules/mu/defaults/Azure.yaml +17 -0
  181. data/modules/mu/defaults/Google.yaml +24 -0
  182. data/modules/mu/defaults/README.md +1 -1
  183. data/modules/mu/deploy.rb +168 -125
  184. data/modules/mu/groomer.rb +2 -1
  185. data/modules/mu/groomers/ansible.rb +104 -32
  186. data/modules/mu/groomers/chef.rb +96 -44
  187. data/modules/mu/kittens.rb +20602 -0
  188. data/modules/mu/logger.rb +38 -11
  189. data/modules/mu/master.rb +90 -8
  190. data/modules/mu/master/chef.rb +2 -3
  191. data/modules/mu/master/ldap.rb +0 -1
  192. data/modules/mu/master/ssl.rb +250 -0
  193. data/modules/mu/mommacat.rb +917 -513
  194. data/modules/scratchpad.erb +1 -1
  195. data/modules/tests/super_complex_bok.yml +0 -0
  196. data/modules/tests/super_simple_bok.yml +0 -0
  197. data/roles/mu-master.json +2 -1
  198. data/spec/azure_creds +5 -0
  199. data/spec/mu.yaml +56 -0
  200. data/spec/mu/clouds/azure_spec.rb +164 -27
  201. data/spec/spec_helper.rb +5 -0
  202. data/test/clean_up.py +0 -0
  203. data/test/exec_inspec.py +0 -0
  204. data/test/exec_mu_install.py +0 -0
  205. data/test/exec_retry.py +0 -0
  206. data/test/smoke_test.rb +0 -0
  207. metadata +90 -118
  208. data/cookbooks/mu-jenkins/Berksfile +0 -14
  209. data/cookbooks/mu-jenkins/CHANGELOG.md +0 -13
  210. data/cookbooks/mu-jenkins/LICENSE +0 -37
  211. data/cookbooks/mu-jenkins/README.md +0 -105
  212. data/cookbooks/mu-jenkins/attributes/default.rb +0 -42
  213. data/cookbooks/mu-jenkins/files/default/cleanup_deploy_config.xml +0 -73
  214. data/cookbooks/mu-jenkins/files/default/deploy_config.xml +0 -44
  215. data/cookbooks/mu-jenkins/metadata.rb +0 -21
  216. data/cookbooks/mu-jenkins/recipes/default.rb +0 -195
  217. data/cookbooks/mu-jenkins/recipes/node-ssh-config.rb +0 -54
  218. data/cookbooks/mu-jenkins/recipes/public_key.rb +0 -24
  219. data/cookbooks/mu-jenkins/templates/default/example_job.config.xml.erb +0 -24
  220. data/cookbooks/mu-jenkins/templates/default/org.jvnet.hudson.plugins.SSHBuildWrapper.xml.erb +0 -14
  221. data/cookbooks/mu-jenkins/templates/default/ssh_config.erb +0 -6
  222. data/cookbooks/nagios/Berksfile +0 -11
  223. data/cookbooks/nagios/CHANGELOG.md +0 -589
  224. data/cookbooks/nagios/CONTRIBUTING.md +0 -11
  225. data/cookbooks/nagios/LICENSE +0 -37
  226. data/cookbooks/nagios/README.md +0 -328
  227. data/cookbooks/nagios/TESTING.md +0 -2
  228. data/cookbooks/nagios/attributes/config.rb +0 -171
  229. data/cookbooks/nagios/attributes/default.rb +0 -228
  230. data/cookbooks/nagios/chefignore +0 -102
  231. data/cookbooks/nagios/definitions/command.rb +0 -33
  232. data/cookbooks/nagios/definitions/contact.rb +0 -33
  233. data/cookbooks/nagios/definitions/contactgroup.rb +0 -33
  234. data/cookbooks/nagios/definitions/host.rb +0 -33
  235. data/cookbooks/nagios/definitions/hostdependency.rb +0 -33
  236. data/cookbooks/nagios/definitions/hostescalation.rb +0 -34
  237. data/cookbooks/nagios/definitions/hostgroup.rb +0 -33
  238. data/cookbooks/nagios/definitions/nagios_conf.rb +0 -38
  239. data/cookbooks/nagios/definitions/resource.rb +0 -33
  240. data/cookbooks/nagios/definitions/service.rb +0 -33
  241. data/cookbooks/nagios/definitions/servicedependency.rb +0 -33
  242. data/cookbooks/nagios/definitions/serviceescalation.rb +0 -34
  243. data/cookbooks/nagios/definitions/servicegroup.rb +0 -33
  244. data/cookbooks/nagios/definitions/timeperiod.rb +0 -33
  245. data/cookbooks/nagios/libraries/base.rb +0 -314
  246. data/cookbooks/nagios/libraries/command.rb +0 -91
  247. data/cookbooks/nagios/libraries/contact.rb +0 -230
  248. data/cookbooks/nagios/libraries/contactgroup.rb +0 -112
  249. data/cookbooks/nagios/libraries/custom_option.rb +0 -36
  250. data/cookbooks/nagios/libraries/data_bag_helper.rb +0 -23
  251. data/cookbooks/nagios/libraries/default.rb +0 -90
  252. data/cookbooks/nagios/libraries/host.rb +0 -412
  253. data/cookbooks/nagios/libraries/hostdependency.rb +0 -181
  254. data/cookbooks/nagios/libraries/hostescalation.rb +0 -173
  255. data/cookbooks/nagios/libraries/hostgroup.rb +0 -119
  256. data/cookbooks/nagios/libraries/nagios.rb +0 -282
  257. data/cookbooks/nagios/libraries/resource.rb +0 -59
  258. data/cookbooks/nagios/libraries/service.rb +0 -455
  259. data/cookbooks/nagios/libraries/servicedependency.rb +0 -215
  260. data/cookbooks/nagios/libraries/serviceescalation.rb +0 -195
  261. data/cookbooks/nagios/libraries/servicegroup.rb +0 -144
  262. data/cookbooks/nagios/libraries/timeperiod.rb +0 -160
  263. data/cookbooks/nagios/libraries/users_helper.rb +0 -54
  264. data/cookbooks/nagios/metadata.rb +0 -25
  265. data/cookbooks/nagios/recipes/_load_databag_config.rb +0 -153
  266. data/cookbooks/nagios/recipes/_load_default_config.rb +0 -241
  267. data/cookbooks/nagios/recipes/apache.rb +0 -48
  268. data/cookbooks/nagios/recipes/default.rb +0 -204
  269. data/cookbooks/nagios/recipes/nginx.rb +0 -82
  270. data/cookbooks/nagios/recipes/pagerduty.rb +0 -143
  271. data/cookbooks/nagios/recipes/server_package.rb +0 -40
  272. data/cookbooks/nagios/recipes/server_source.rb +0 -164
  273. data/cookbooks/nagios/templates/default/apache2.conf.erb +0 -96
  274. data/cookbooks/nagios/templates/default/cgi.cfg.erb +0 -266
  275. data/cookbooks/nagios/templates/default/commands.cfg.erb +0 -13
  276. data/cookbooks/nagios/templates/default/contacts.cfg.erb +0 -37
  277. data/cookbooks/nagios/templates/default/hostgroups.cfg.erb +0 -25
  278. data/cookbooks/nagios/templates/default/hosts.cfg.erb +0 -15
  279. data/cookbooks/nagios/templates/default/htpasswd.users.erb +0 -6
  280. data/cookbooks/nagios/templates/default/nagios.cfg.erb +0 -22
  281. data/cookbooks/nagios/templates/default/nginx.conf.erb +0 -62
  282. data/cookbooks/nagios/templates/default/pagerduty.cgi.erb +0 -185
  283. data/cookbooks/nagios/templates/default/resource.cfg.erb +0 -27
  284. data/cookbooks/nagios/templates/default/servicedependencies.cfg.erb +0 -15
  285. data/cookbooks/nagios/templates/default/servicegroups.cfg.erb +0 -14
  286. data/cookbooks/nagios/templates/default/services.cfg.erb +0 -14
  287. data/cookbooks/nagios/templates/default/templates.cfg.erb +0 -31
  288. data/cookbooks/nagios/templates/default/timeperiods.cfg.erb +0 -13
  289. data/extras/image-generators/aws/centos6.yaml +0 -18
  290. data/modules/mu/defaults/google_images.yaml +0 -16
  291. data/roles/mu-master-jenkins.json +0 -24
@@ -1,14 +0,0 @@
1
- source 'https://supermarket.chef.io'
2
- source chef_repo: ".."
3
-
4
- metadata
5
-
6
- # Mu Cookbooks
7
- cookbook 'mu-master'
8
- cookbook 'mu-utility'
9
- cookbook 'mu-tools'
10
-
11
- # Supermarket Cookbooks
12
- cookbook 'java', '~> 2.2.0'
13
- cookbook 'jenkins', '~> 6.2.0'
14
- cookbook 'chef-vault', '~> 3.1.1'
@@ -1,13 +0,0 @@
1
- mu-jenkins CHANGELOG
2
- ====================
3
-
4
- This file is used to list changes made in each version of the mu-jenkins cookbook.
5
-
6
- 0.1.0
7
- -----
8
- - [your_name] - Initial release of mu-jenkins
9
-
10
- - - -
11
- Check the [Markdown Syntax Guide](http://daringfireball.net/projects/markdown/syntax) for help with Markdown.
12
-
13
- The [Github Flavored Markdown page](http://github.github.com/github-flavored-markdown/) describes the differences between markdown on github and standard markdown.
@@ -1,37 +0,0 @@
1
- Through accessing, reading, or utilizing this software in any manner whatsoever
2
- or through any means whatsoever, whether the access, reading or use is either
3
- solely looking at this software or this software has been integrated into any
4
- derivative work, the party accessing, reading, or utilizing the software
5
- directly or indirectly agrees to abide by the following license.
6
-
7
- The eGlobalTech Cloud Automation Platform is the Copyright (c) 2014 of Global
8
- Tech Inc. All rights reserved.
9
-
10
- Redistribution and use in source and binary forms, with or without
11
- modification, are permitted provided that the following conditions are met:
12
-
13
- 1. Redistributions of source code must retain the above copyright notice, this
14
- list of conditions and the following disclaimer.
15
-
16
- 2. Redistributions in binary form must reproduce the above copyright notice,
17
- this list of conditions and the following disclaimer in the documentation
18
- and/or other materials provided with the distribution.
19
-
20
- 3. Neither the name of the copyright holder nor the names of its contributors
21
- may be used to endorse or promote products derived from this software without
22
- specific prior written permission.
23
-
24
- Global Tech, Inc. is the co-owner of any derivative works created with this
25
- software.
26
-
27
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
28
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
29
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
30
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
31
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
33
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
35
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
-
@@ -1,105 +0,0 @@
1
- mu-jenkins Cookbook
2
- ===================
3
- This cookbook creates a working Jenkins installation. It can be deployed on a standalone node (see demo/jenkins.yaml) or as a Jenkins server on the mu-master itself.
4
-
5
- Requirements
6
- ------------
7
- This is a wrapper cookbook that is meant to be run after a Jenkins install using the Jenkins community cookbook. The recipe uses some groovy scripts to manage jenkins authentication from chef itself, and create an additional administrave Jenkins user for interactive work.
8
-
9
- A jenkins vault must be present before invoking. Two items are required
10
- - A users item containing passwords for each user enumerated in the default.jenkins_users attribute (see below). The mu-user password is required, as we need at least one interactive Jenkins user
11
- - An admin item containing a public and private keypair that will be used by chef to authenticate to Jenkins after disabling anonymous authentication, and a username for this user
12
-
13
- A third optional ssh item is used to store a keypair used by Jenkins to SSH to other nodes, to allow Jenkins to run code locally as part of a Jenkins job.
14
-
15
- Create the vault items along these lines:
16
-
17
- admin:
18
- ```
19
- #!/usr/local/ruby-current/bin/ruby
20
- require "openssl"
21
- require 'net/ssh'
22
- key = OpenSSL::PKey::RSA.new 2048
23
- public_key = "#{key.public_key.ssh_type} #{[key.public_key.to_blob].pack('m0')}"
24
- vault_opts="--mode client -u mu -F json"
25
- vault_cmd = "knife vault create jenkins admin '{ \"public_key\":\"#{public_key}\", \"private_key\":\"#{key.to_pem.chomp!.gsub(/\n/, "\\n")}\", \"username\": \"master_user\" }' #{vault_opts} --search name:MU-MASTER"
26
- exec vault_cmd
27
- ```
28
-
29
- users:
30
- ```knife vault create jenkins users '{"mu_user_password":"feefiefoefum"}' --mode client -F json -u mu --search name:MU-MASTER```
31
-
32
-
33
- #### packages
34
- - `java` - jenkins needs Java to run
35
- - `jenkins` - mu-jenkins needs jenkins to actually be installed
36
-
37
- Attributes
38
- ----------
39
- Some basic attributes on the java install and node address, plus Jenkins specifics:
40
-
41
- #### mu-jenkins::default
42
- <table>
43
- <tr>
44
- <th>Key</th>
45
- <th>Type</th>
46
- <th>Description</th>
47
- <th>Default</th>
48
- </tr>
49
- <tr>
50
- <td><tt>default.jenkins_users</tt></td>
51
- <td>Hash</td>
52
- <td>Jenkins users to create with their properties (excepting password) and a single vault to retrieve creds from</td>
53
- <td><tt>:user_name => "mu_user", :fullname => "Mu-Demo-User", :email => "mu-developers@googlegroups.com", :vault => "jenkins", :vault_item => "users"}</tt></td>
54
- </tr>
55
- <tr>
56
- <td><tt>default.jenkins_ssh_urls</tt></td>
57
- <td>Array</td>
58
- <td>IP addresses / DNS names of nodes Jenkins will SSH into</td>
59
- <td><tt>[node[:ipaddress]]</tt></td>
60
- </tr>
61
- <tr>
62
- <td><tt>default.jenkins_plugins</tt></td>
63
- <td>Whitespace string</td>
64
- <td>plugins to install</td>
65
- <td><tt>%w{github ssh deploy}</tt></td>
66
- </tr>
67
- <tr>
68
- <td><tt>default.jenkins_ssh_vault</tt></td>
69
- <td>Hash</td>
70
- <td>Preexisting vault containing a public private keypair that will be used to SSH to other nodes</td>
71
- <td><tt>:vault => "jenkins", :item => "ssh"</tt></td>
72
- </tr>
73
- <tr>
74
- <td><tt>default.jenkins_admin_vault</tt></td>
75
- <td>Hash</td>
76
- <td>Preexisting vault containing a public private keypair used by Chef to authenticate to Jenkins. This also include the username of the Jenkins user</td>
77
- <td><tt>:vault => "jenkins", :item => "admin"</tt></td>
78
- </tr>
79
- </table>
80
-
81
- Usage
82
- -----
83
- #### mu-jenkins::default
84
- This cookbook can run in a standalone mode which creates a basic Jenkins install on a target node, or a mu-master mode which creates a Jenkins server on a mu master.
85
-
86
- In either case the runlist will look like:
87
- ``` run_list:
88
- - recipe[java]
89
- - recipe[jenkins::master]
90
- - recipe[mu-jenkins]
91
- ```
92
-
93
- In the mu-master mode the cookbook is invoked with the role[mu-master-jenkins], which adds some attributes to trigger the jenkins-apache recipe, which places Jenkins behind a mu-master apache reverse proxy:
94
-
95
- chef-client -l info -o recipe[java],recipe[jenkins::master],recipe[mu-jenkins]
96
-
97
-
98
- Contributing
99
- ------------
100
- Usual Cloudamatic process via pull request
101
-
102
-
103
- License and Authors
104
- -------------------
105
- Authors: Ami Rahav, Robert Patt-Corner
@@ -1,42 +0,0 @@
1
-
2
- default['jenkins_users'] = [
3
- # {:user_name => "mu_user", :fullname => "Mu-Demo-User", :email => ENV['MU_ADMIN_EMAIL'], :vault => "jenkins", :vault_item => "users"}
4
- ]
5
-
6
- default['jenkins_ssh_urls'] = [node['ipaddress']]
7
- default['jenkins_plugins'] = %w{
8
- token-macro git github deploy ldap scm-api git-client active-directory
9
- ansicolor matrix-auth matrix-project workflow-scm-step junit workflow-api
10
- workflow-step-api ssh credentials ssh-credentials plain-credentials mailer
11
- display-url-api structs script-security jackson2-api
12
- }
13
-
14
- default['jenkins_ports_direct'] = %w{8080 443}
15
- default['jenkins']['master']['jenkins_args'] = "" if default['jenkins']['master']['jenkins_args'].nil?
16
- jenkins_args = "" if node['jenkins']['master']['jenkins_args'].nil?
17
- override['jenkins']['master']['jenkins_args'] = "#{jenkins_args} --prefix=/jenkins"
18
- default['jenkins']['master']['jvm_options'] = '-Xmx1024m -Djenkins.install.runSetupWizard=false'
19
-
20
-
21
- alpn_version = '8.1.11.v20170118'
22
- default['jenkins']['alpn']['version'] = alpn_version
23
- default['jenkins']['alpn']['download_link'] = "http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/#{alpn_version}/alpn-boot-#{alpn_version}.jar"
24
-
25
- # This isn't really true, but the Java libraries lose their minds over
26
- # self-signed SSL certs like the one you'll usually find on
27
- # https://#{$MU_CFG['public_address']}/jenkins (the real URL)
28
- default['jenkins']['master']['endpoint'] = "http://localhost:8080/jenkins"
29
- default['jenkins_ssh_vault'] = {
30
- :vault => "jenkins", :item => "ssh"
31
- }
32
-
33
- default['jenkins_admin_vault'] = {
34
- :vault => "jenkins", :item => "admin"
35
- }
36
-
37
- override['java']['jdk_version'] = 8
38
- override['java']['flavor'] = 'oracle'
39
- override['java']['jdk']['8']['x86_64']['url'] = 'http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz'
40
- override['java']['jdk']['8']['x86_64']['checksum'] = '75b2cb2249710d822a60f83e28860053'
41
- override["java"]["oracle"]["accept_oracle_download_terms"] = true
42
- override['java']['oracle']['jce']['enabled'] = true
@@ -1,73 +0,0 @@
1
- <?xml version='1.0' encoding='UTF-8'?>
2
- <project>
3
- <actions/>
4
- <description>Clean up an extant Cloudamatic Deploy</description>
5
- <keepDependencies>false</keepDependencies>
6
- <properties>
7
- <hudson.security.AuthorizationMatrixProperty>
8
- <blocksInheritance>true</blocksInheritance>
9
- <permission>hudson.model.Item.Cancel:master_user</permission>
10
- <permission>hudson.model.Item.Cancel:mu_user</permission>
11
- <permission>hudson.model.Item.Delete:master_user</permission>
12
- <permission>hudson.model.Item.Delete:mu_user</permission>
13
- <permission>hudson.model.Item.Read:master_user</permission>
14
- <permission>hudson.model.Item.Read:mu_user</permission>
15
- <permission>hudson.model.Item.Workspace:master_user</permission>
16
- <permission>hudson.model.Item.Workspace:mu_user</permission>
17
- <permission>hudson.model.Item.Build:master_user</permission>
18
- <permission>hudson.model.Item.Build:mu_user</permission>
19
- <permission>hudson.model.Item.Move:master_user</permission>
20
- <permission>hudson.model.Item.Move:mu_user</permission>
21
- <permission>hudson.model.Item.Configure:master_user</permission>
22
- <permission>hudson.model.Item.Configure:mu_user</permission>
23
- <permission>hudson.model.Item.Discover:master_user</permission>
24
- <permission>hudson.model.Item.Discover:mu_user</permission>
25
- </hudson.security.AuthorizationMatrixProperty>
26
- <hudson.model.ParametersDefinitionProperty>
27
- <parameterDefinitions>
28
- <com.seitenbau.jenkins.plugins.dynamicparameter.ChoiceParameterDefinition plugin="dynamicparameter@0.2.0">
29
- <name>Target_Deploy</name>
30
- <description></description>
31
- <__uuid>8a5d5b3c-c975-44f8-a1e2-7d3c4f3306f8</__uuid>
32
- <__remote>false</__remote>
33
- <__script>def proc = &quot;ls -1a /home/jenkins/.mu/var/deployments/&quot;.execute()
34
- def b = new StringBuffer()
35
- proc.consumeProcessErrorStream(b)
36
- def list = proc.text.readLines()
37
- </__script>
38
- <__localBaseDirectory serialization="custom">
39
- <hudson.FilePath>
40
- <default>
41
- <remote>/home/jenkins/dynamic_parameter/classpath</remote>
42
- </default>
43
- <boolean>true</boolean>
44
- </hudson.FilePath>
45
- </__localBaseDirectory>
46
- <__remoteBaseDirectory>dynamic_parameter_classpath</__remoteBaseDirectory>
47
- <__classPath></__classPath>
48
- <readonlyInputField>false</readonlyInputField>
49
- </com.seitenbau.jenkins.plugins.dynamicparameter.ChoiceParameterDefinition>
50
- </parameterDefinitions>
51
- </hudson.model.ParametersDefinitionProperty>
52
- </properties>
53
- <scm class="hudson.scm.NullSCM"/>
54
- <canRoam>true</canRoam>
55
- <disabled>false</disabled>
56
- <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
57
- <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
58
- <triggers/>
59
- <concurrentBuild>false</concurrentBuild>
60
- <builders>
61
- <hudson.tasks.Shell>
62
- <command>source ~/.murc
63
- mu-cleanup $Target_Deploy
64
- </command>
65
- </hudson.tasks.Shell>
66
- </builders>
67
- <publishers/>
68
- <buildWrappers>
69
- <hudson.plugins.ansicolor.AnsiColorBuildWrapper plugin="ansicolor@0.4.1">
70
- <colorMapName>xterm</colorMapName>
71
- </hudson.plugins.ansicolor.AnsiColorBuildWrapper>
72
- </buildWrappers>
73
- </project>
@@ -1,44 +0,0 @@
1
- <project>
2
- <actions/>
3
- <description></description>
4
- <keepDependencies>false</keepDependencies>
5
- <properties>
6
- <hudson.security.AuthorizationMatrixProperty>
7
- <blocksInheritance>true</blocksInheritance>
8
- <permission>hudson.model.Item.Cancel:master_user</permission>
9
- <permission>hudson.model.Item.Cancel:mu_user</permission>
10
- <permission>hudson.model.Item.Delete:master_user</permission>
11
- <permission>hudson.model.Item.Delete:mu_user</permission>
12
- <permission>hudson.model.Item.Read:master_user</permission>
13
- <permission>hudson.model.Item.Read:mu_user</permission>
14
- <permission>hudson.model.Item.Workspace:master_user</permission>
15
- <permission>hudson.model.Item.Workspace:mu_user</permission>
16
- <permission>hudson.model.Item.Build:master_user</permission>
17
- <permission>hudson.model.Item.Build:mu_user</permission>
18
- <permission>hudson.model.Item.Move:master_user</permission>
19
- <permission>hudson.model.Item.Move:mu_user</permission>
20
- <permission>hudson.model.Item.Configure:master_user</permission>
21
- <permission>hudson.model.Item.Configure:mu_user</permission>
22
- <permission>hudson.model.Item.Discover:master_user</permission>
23
- <permission>hudson.model.Item.Discover:mu_user</permission>
24
- </hudson.security.AuthorizationMatrixProperty>
25
- </properties>
26
- <scm class="hudson.scm.NullSCM"/>
27
- <canRoam>true</canRoam>
28
- <disabled>false</disabled>
29
- <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
30
- <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
31
- <triggers/>
32
- <concurrentBuild>false</concurrentBuild>
33
- <builders>
34
- <hudson.tasks.Shell>
35
- <command>/opt/mu/bin/mu-deploy /opt/mu/lib/demo/simple-server.yaml</command>
36
- </hudson.tasks.Shell>
37
- </builders>
38
- <publishers/>
39
- <buildWrappers>
40
- <hudson.plugins.ansicolor.AnsiColorBuildWrapper plugin="ansicolor@0.4.1">
41
- <colorMapName>xterm</colorMapName>
42
- </hudson.plugins.ansicolor.AnsiColorBuildWrapper>
43
- </buildWrappers>
44
- </project>
@@ -1,21 +0,0 @@
1
- name 'mu-jenkins'
2
- maintainer 'eGlobalTech, Inc'
3
- maintainer_email 'mu-developers@googlegroups.com'
4
- license 'BSD-3-Clause'
5
- description 'Installs/Configures mu-jenkins'
6
- long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
7
- source_url 'https://github.com/cloudamatic/mu'
8
- issues_url 'https://github.com/cloudamatic/mu/issues'
9
- chef_version '>= 12.1' if respond_to?(:chef_version)
10
- version '0.6.0'
11
-
12
- %w( amazon centos redhat windows ).each do |os|
13
- supports os
14
- end
15
-
16
- depends 'java', '~> 2.2.0'
17
- depends 'jenkins', '~> 6.2.0'
18
- depends 'chef-vault', '~> 3.1.1'
19
- depends 'mu-master'
20
- depends 'mu-utility'
21
- depends 'mu-tools'
@@ -1,195 +0,0 @@
1
- # Cookbook Name:: mu-jenkins
2
- # Recipe:: default
3
- #
4
- # Copyright 2015, eGlobalTech, Inc
5
- #
6
- # All rights reserved - Do Not Redistribute
7
- #
8
-
9
- include_recipe 'mu-tools::disable-requiretty'
10
- include_recipe 'chef-vault'
11
-
12
- directory "/opt/java_jce" do
13
- mode 0755
14
- end
15
-
16
- admin_vault = chef_vault_item(node['jenkins_admin_vault']['vault'], node['jenkins_admin_vault']['item'])
17
-
18
- directory "Mu Jenkins home #{node['jenkins']['master']['home']}" do
19
- path node['jenkins']['master']['home']
20
- owner "jenkins"
21
- recursive true
22
- notifies :restart, 'service[jenkins]', :immediately
23
- end
24
-
25
- package %w{git bzip2}
26
-
27
- #remote_file "#{node['jenkins']['master']['home']}/plugins/mailer.jpi" do
28
- # source "http://updates.jenkins-ci.org/latest/mailer.hpi"
29
- # owner "jenkins"
30
- #end
31
-
32
- ruby_block 'wait for jenkins' do
33
- block do
34
- sleep 30
35
- end
36
- action :nothing
37
- end
38
-
39
-
40
- # If security was enabled in a previous chef run then set the private key in the run_state
41
- # now as required by the Jenkins cookbook
42
- if node['application_attributes']['jenkins_auth_set']
43
- ruby_block 'set jenkins private key' do
44
- block do
45
- Chef::Log.info("Setting the previously enabled jenkins private key")
46
- node.run_state[:jenkins_private_key] = admin_vault['private_key'].strip
47
- end
48
- end
49
- end
50
-
51
- restart_jenkins = false
52
-
53
- directory "mu-jenkins fix #{Chef::Config[:file_cache_path]} perms" do
54
- path Chef::Config[:file_cache_path]
55
- mode 0755
56
- end
57
- cacheparent = File.expand_path("..", Chef::Config[:file_cache_path])
58
- directory "mu-jenkins fix #{cacheparent} perms" do
59
- path cacheparent
60
- mode 0755
61
- end
62
-
63
-
64
- # Download ALPN Jar file and fix to JENKINS_JAVA_OPTIONS
65
- # open_jdk_version = `java -version 2>&1`
66
- open_jdk_version = shell_out('java -version 2>&1').stdout.str
67
- if open_jdk_version.include?("openjdk version \"1.8") and node['platform_family'] == 'rhel'
68
-
69
- remote_file 'download_anlp_jar' do
70
- source node['jenkins']['alpn']['download_link']
71
- path "/home/jenkins/alpn-boot-#{node['jenkins']['alpn']['version']}.jar"
72
- owner "jenkins"
73
- notifies :restart, "service[jenkins]",:delayed
74
- end
75
-
76
- service "jenkins" do
77
- action :nothing
78
- end
79
-
80
- end
81
-
82
-
83
-
84
-
85
- node['jenkins_plugins'].each { |plugin|
86
- # if !::File.exist?("#{node['jenkins']['master']['home']}/plugins/#{plugin}.jpi")
87
- # restart_jenkins = true
88
- # end
89
- # XXX this runs as the 'jenkins' user, yet download the files as 0600/root
90
- jenkins_plugin plugin
91
- # do
92
- # notifies :restart, 'service[jenkins]', :delayed
93
- #not_if { ::File.exist?("#{node['jenkins']['master']['home']}/plugins/#{plugin}.jpi") }
94
- # end
95
- }
96
-
97
- if !node['application_attributes']['jenkins_auth_set']
98
- jenkins_command 'safe-restart'
99
- jenkins_private_key_credentials admin_vault['username'] do
100
- id '1671945-9fa7-4d24-ac87-51ea3b2aef4c'
101
- description admin_vault['username']
102
- private_key admin_vault['private_key'].strip
103
- end
104
- end
105
-
106
- # The Jenkins service user that this cookbook uses MUST exist in our directory
107
- mu_master_user admin_vault['username'] do
108
- realname admin_vault['username']
109
- # email $MU_CFG['jenkins']['admin_email'] || $MU_CFG['admin_email']
110
- email "mu-developers@googlegroups.com"
111
- end
112
-
113
- # Add the admin user only if it has not been added already then notify the resource
114
- # to configure the permissions for the admin user. Note that we check for existence of jenkins_auth_set,
115
- # not value
116
- jenkins_user admin_vault['username'] do
117
- full_name admin_vault['username']
118
- email "mu-developers@googlegroups.com"
119
- public_keys [admin_vault['public_key'].strip]
120
- #not_if { node['application_attributes'].attribute?('jenkins_auth_set') }
121
- end
122
-
123
-
124
- # Configure the permissions so that login is required and the admin user is an administrator
125
- # after this point the private key will be required to execute jenkins scripts (including querying
126
- # if users exist) so we notify the `set the security_enabled flag` resource to set this up.
127
- # Also note that since Jenkins 1.556 the private key cannot be used until after the admin user
128
- # has been added to the security realm
129
- uidsearch = "uid={0}"
130
- uidsearch = "sAMAccountName={0}" if $MU_CFG['ldap']['type'] == "Active Directory"
131
- membersearch = "(| (member={0}) (uniqueMember={0}) (memberUid={1}))"
132
- membersearch = "memberUid={0}" if $MU_CFG['ldap']['type'] == "389 Directory Services"
133
- bind_creds = chef_vault_item($MU_CFG['ldap']['bind_creds']['vault'], $MU_CFG['ldap']['bind_creds']['item'])
134
- jenkins_admins = ::MU::Master.listUsers.delete_if { |_u, data| !data['admin'] }.keys
135
- #jenkins_regular = ::MU::Master.listUsers.delete_if { |u, data| data['admin'] or u == "jenkins" }.keys
136
- regular_user_perms = ["Item.BUILD", "Item.CREATE", "Item.DISCOVER", "Item.READ"]
137
- jenkins_script 'configure_jenkins_auth' do
138
- command <<-EOH.gsub(/^ {4}/, '')
139
- import jenkins.model.*
140
- import hudson.security.*
141
- import org.jenkinsci.plugins.*
142
- def instance = Jenkins.getInstance()
143
- def hudsonRealm = new HudsonPrivateSecurityRealm(false)
144
- String groupSearchFilter = 'memberUid={0}'
145
- SecurityRealm ldapRealm = new LDAPSecurityRealm(server='ldap://#{$MU_CFG['ldap']['dcs'].first}', rootDN = '#{$MU_CFG['ldap']['base_dn']}', userSearchBase='#{$MU_CFG['ldap']['user_ou'].sub(/,.*/, "")}', userSearch="#{uidsearch}", groupSearchBase='#{$MU_CFG['ldap']['group_ou'].sub(/,.*/, "")}', groupSearchFilter="", groupMembershipFilter = '#{membersearch}', managerDN = '#{bind_creds[$MU_CFG['ldap']['bind_creds']['username_field']]}', managerPasswordSecret = '#{bind_creds[$MU_CFG['ldap']['bind_creds']['password_field']]}', inhibitInferRootDN = false, disableMailAddressResolver = false, cache = null)
146
- instance.setSecurityRealm(ldapRealm)
147
- def strategy = new ProjectMatrixAuthorizationStrategy()
148
- strategy.add(Jenkins.ADMINISTER, "#{$MU_CFG['ldap']['admin_group_name']}")
149
- strategy.add(Jenkins.ADMINISTER, "#{admin_vault['username']}")
150
- #{jenkins_admins.map { |u| "strategy.add(Jenkins.ADMINISTER, \"#{u}\")" }.join("\n")}
151
- strategy.add(Jenkins.READ, "authenticated")
152
- #{regular_user_perms.map { |p| "strategy.add(hudson.model.#{p}, \"authenticated\")" }.join("\n")}
153
- instance.setAuthorizationStrategy(strategy)
154
- instance.save()
155
- EOH
156
- # not_if "grep managerDN #{node['jenkins']['master']['home']}/config.xml | grep #{bind_creds[$MU_CFG['ldap']['bind_creds']['username_field']]}"
157
- notifies :run, 'ruby_block[configure_jenkins_auth_set]', :immediately
158
- action :nothing unless !::File.size?("#{node['jenkins']['master']['home']}/config.xml") or !::File.read("#{node['jenkins']['master']['home']}/config.xml").match(bind_creds[$MU_CFG['ldap']['bind_creds']['username_field']])
159
- end
160
-
161
- file "#{node['jenkins']['master']['home']}/user-list-chef-guard" do
162
- content "
163
- #{jenkins_admins.map { |u| "strategy.add(Jenkins.ADMINISTER, \"#{u}\")" }.join("\n")}
164
- #{regular_user_perms.map { |p| "strategy.add(Jenkins.#{p}, \"authenticated\")" }.join("\n")}
165
- #{bind_creds[$MU_CFG['ldap']['bind_creds']['username_field']]}
166
- "
167
- notifies :execute, "jenkins_script[configure_jenkins_auth]", :immediately
168
- end
169
-
170
- # Set the security enabled flag and set the run_state to use the configured private key
171
- ruby_block 'configure_jenkins_auth_set' do
172
- block do
173
- node.run_state[:jenkins_private_key] = admin_vault['private_key'].strip
174
- node.normal['application_attributes']['jenkins_auth_set'] = true
175
- node.save
176
- end
177
- action :nothing
178
- end
179
-
180
-
181
-
182
- # Configure users from the vault
183
- #node['jenkins_users'].each { |user|
184
- # user_vault = chef_vault_item(user[:vault], user[:vault_item])
185
- #
186
- # # XXX This is dangerous. What if we stupidly step on the account of a
187
- # # "real" user?
188
- # ::MU::Master::LDAP.manageUser(user[:user_name], name: user[:fullname], password: user_vault[user[:user_name]+"_password"], admin: false, email: user[:email])
189
- # jenkins_user user[:user_name] do
190
- # full_name user[:fullname]
191
- # email user[:email]
192
- # password user_vault["#{user[:user_name]}_password"]
193
- # sensitive true
194
- # end
195
- #}