sambot 0.1.178 → 0.1.179

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sambot.rb +1 -0
  3. data/lib/sambot/chef/cookbook.rb +12 -10
  4. data/lib/sambot/chef/generator.rb +4 -4
  5. data/lib/sambot/cli.rb +6 -11
  6. data/lib/sambot/config.rb +8 -16
  7. data/lib/sambot/template.rb +1 -1
  8. data/lib/sambot/templates/.env +4 -0
  9. data/lib/sambot/templates/.rubocop.yml +1 -1
  10. data/lib/sambot/templates/bootstrap_scripts/google/bootstrap.ps1.erb +51 -0
  11. data/lib/sambot/templates/bootstrap_scripts/google/bootstrap.sh.erb +47 -0
  12. data/lib/sambot/templates/bootstrap_scripts/local/docker/bootstrap.ps1.erb +94 -0
  13. data/lib/sambot/templates/bootstrap_scripts/local/docker/bootstrap.sh.erb +80 -0
  14. data/lib/sambot/templates/bootstrap_scripts/local/vagrant/bootstrap.ps1.erb +99 -0
  15. data/lib/sambot/templates/bootstrap_scripts/local/vagrant/bootstrap.sh.erb +90 -0
  16. data/lib/sambot/templates/docker-compose.yml +10 -0
  17. data/lib/sambot/templates/test_kitchen/local.yml.erb +0 -3
  18. data/lib/sambot/templates/vault-config +0 -0
  19. data/lib/sambot/testing/consul_helper.rb +1 -1
  20. data/lib/sambot/testing/fixtures.rb +17 -0
  21. data/lib/sambot/testing/vault_helper.rb +21 -15
  22. data/lib/sambot/version.rb +1 -1
  23. metadata +10 -8
  24. data/lib/sambot/templates/.consul.yml +0 -0
  25. data/lib/sambot/templates/.vault.yml +0 -0
  26. data/lib/sambot/templates/bootstrap_scripts/local/sidecar_vault/bootstrap.ps1.erb +0 -33
  27. data/lib/sambot/templates/bootstrap_scripts/local/sidecar_vault/bootstrap.sh.erb +0 -45
  28. data/lib/sambot/templates/bootstrap_scripts/local/standalone_vault/bootstrap.ps1.erb +0 -33
  29. data/lib/sambot/templates/bootstrap_scripts/local/standalone_vault/bootstrap.sh.erb +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5765d9dc51f85ddd7a58784b996444a30023a0f2
4
- data.tar.gz: 3286429d57369a7968bc2ffd0e74784d1404ac58
3
+ metadata.gz: a0e07b3e1bac4b8ba2285c15bb23b2a8548289be
4
+ data.tar.gz: 836a12b7924d4996e8b50585071493ec96eb564d
5
5
  SHA512:
6
- metadata.gz: ac4bf37f94930957188b13f9805f0805f458731658a25207c027a4abcfdf1aa31093ad29e29d3c319f2d218c6046320ad84914743879dda8ba79c3ba8d070f49
7
- data.tar.gz: c51a0fb82a4271539bfb2316cacb0f524e406ab4a71c90d297964c305b7b4bacfcdf0b24a94bc183dea88c218ca9f318a6854a97ad16cd40070db5e71ebb8706
6
+ metadata.gz: bbf7ee2e814fb8c4aca795c0782b3709253219c669d59b894164dc4a3dc19179e0d5c0cad9478b45f3ca96a3e6dc131c40410583fc235b15bebc4c114156edc5
7
+ data.tar.gz: a298786b80ced0a64ed2226d69d5fa01025c38a9179de710dc09144fff99a185bf23af4aaf2f024ba9ecfc89c38b72ef826e23a42bdac69a1fc0a4e30d354b23
data/lib/sambot.rb CHANGED
@@ -10,6 +10,7 @@ require_relative 'sambot/fs'
10
10
 
11
11
  require_relative 'sambot/testing/consul_helper'
12
12
  require_relative 'sambot/testing/vault_helper'
13
+ require_relative 'sambot/testing/fixtures'
13
14
 
14
15
  require_relative 'sambot/chef/kitchen'
15
16
  require_relative 'sambot/chef/metadata'
@@ -9,6 +9,8 @@ module Sambot
9
9
  GENERATED_FILES = {
10
10
  'teamcity.sh.erb': {eruby: true, dest: 'teamcity.sh', platform: [:windows, :centos]},
11
11
  'chefignore': {eruby: false, dest: 'chefignore', platform: [:windows, :centos]},
12
+ 'docker-compose.yml': {eruby: false, dest: 'chefignore', platform: [:windows, :centos]},
13
+ '.env': {eruby: false, dest: 'chefignore', platform: [:windows, :centos]},
12
14
  'Berksfile': {eruby: false, dest: 'Berksfile', platform: [:windows, :centos]},
13
15
  '.rubocop.yml': {eruby: false, dest: '.rubocop.yml', platform: [:windows, :centos]},
14
16
  '.gitignore.sample': {eruby: false, dest: '.gitignore', platform: [:windows, :centos]},
@@ -18,10 +20,10 @@ module Sambot
18
20
 
19
21
  class << self
20
22
 
21
- def build(config, cloud, vault_setup = nil)
22
- create_files(config, true)
23
- Generator.from_templates(config, cloud, vault_setup, GENERATED_FILES)
24
- Kitchen.setup(cloud, config, vault_setup)
23
+ def build(config, cloud, local_workflow)
24
+ create_files(config)
25
+ Generator.from_templates(config, cloud, local_workflow, GENERATED_FILES)
26
+ Kitchen.setup(cloud, config, local_workflow)
25
27
  Metadata.generate(config)
26
28
  Hooks.copy()
27
29
  UI.info('The cookbook has been successfully built.')
@@ -54,14 +56,14 @@ module Sambot
54
56
 
55
57
  private
56
58
 
57
- def create_files(config, build_phase = false)
58
- ['.vault.yml', '.consul.yml', 'README.md'].each { |resource| FS.copy(resource) unless FS.exist?(resource) }
59
- ['spec', 'test', 'attributes', 'vault'].each { |resource| FS.mkdir(resource) unless FS.exist?(resource) }
60
- Dir.chdir('attributes') { FileUtils.touch('default.rb') unless build_phase }
61
- Dir.chdir('spec') { FS.copy('spec_helper.rb') unless FS.exist?('spec_helper.rb') unless build_phase }
59
+ def create_files(config)
60
+ ['README.md'].each { |resource| FS.copy(resource) unless FS.exist?(resource) }
61
+ ['spec', 'test', 'attributes', 'local_testing'].each { |resource| FS.mkdir(resource) unless FS.exist?(resource) }
62
+ Dir.chdir('attributes') { FileUtils.touch('default.rb') unless FS.exist?('default.rb') }
63
+ Dir.chdir('spec') { FS.copy('spec_helper.rb') unless FS.exist?('spec_helper.rb') }
62
64
  ['recipes', 'libraries', 'resources', 'files', 'templates'].each { |target| FS.mkdir(target) unless FS.exist?(target) }
63
65
  Dir.chdir('recipes') do
64
- FileUtils.touch('default.rb') unless FS.exist?('default.rb') && !build_phase
66
+ FileUtils.touch('default.rb') unless FS.exist?('default.rb')
65
67
  end
66
68
  unless FS.exist?('.config.yml')
67
69
  Template.new('.config.yml.erb').write({config: config}, '.config.yml')
@@ -5,9 +5,9 @@ module Sambot
5
5
  module Chef
6
6
  class Generator
7
7
 
8
- def self.from_templates(config, cloud, vault_setup, generated_files)
8
+ def self.from_templates(config, cloud, local_workflow, generated_files)
9
9
  generated_files.each { |template_name, opts| generate_from_template(template_name.to_s, opts, config) }
10
- generate_bootstrap_scripts(config, cloud, vault_setup)
10
+ generate_bootstrap_scripts(config, cloud, local_workflow)
11
11
  end
12
12
 
13
13
  private
@@ -29,8 +29,8 @@ module Sambot
29
29
  Template.new("bootstrap_scripts/#{path}/bootstrap.#{suffix}.erb").process({eruby: true, dest: "bootstrap.#{suffix}"})
30
30
  end
31
31
 
32
- def self.generate_bootstrap_scripts(config, cloud, vault_setup)
33
- cloud != 'local'? bootstrap(config, cloud) : bootstrap(config, "local/#{vault_setup}_vault")
32
+ def self.generate_bootstrap_scripts(config, cloud, local_workflow)
33
+ cloud != 'local'? bootstrap(config, cloud) : bootstrap(config, "local/#{local_workflow}")
34
34
  end
35
35
 
36
36
  def self.exists!(path)
data/lib/sambot/cli.rb CHANGED
@@ -10,17 +10,11 @@ module Sambot
10
10
  execute { Chef::Cookbook.clean() }
11
11
  end
12
12
 
13
- desc 'populate', 'Populates either Vault or Consul with seed data'
14
- option :vault, :type => :boolean
15
- option :consul, :type => :boolean
13
+ desc 'populate', 'Populates Vault and Consul with seed data'
16
14
  def populate
17
15
  execute do
18
- unless options[:vault] || options[:consul]
19
- UI.error('Please select the datastore you are populating from the following: --vault or --consul')
20
- exit
21
- end
22
- Sambot::Testing::VaultHelper.load_secrets if options[:vault]
23
- Sambot::Testing::ConsulHelper.load_values if options[:consul]
16
+ Sambot::Testing::VaultHelper.load_secrets(Config.read)
17
+ Sambot::Testing::ConsulHelper.load_values(Config.read)
24
18
  end
25
19
  end
26
20
 
@@ -33,7 +27,7 @@ module Sambot
33
27
  option :local, :type => :boolean
34
28
  option :google, :type => :boolean
35
29
  option :rackspace, :type => :boolean
36
- option :vault, :type => :string, :default => 'standalone'
30
+ option :docker, :type => :boolean
37
31
  def build
38
32
  execute do
39
33
  cloud = nil
@@ -44,7 +38,8 @@ module Sambot
44
38
  UI.error('Please select which environment this is building for using one of the following flags: --local, --rackspace or --google')
45
39
  exit
46
40
  end
47
- Chef::Cookbook.build(Config.read, cloud, options[:vault])
41
+ local_workflow = options[:docker] ? 'docker' : 'vagrant'
42
+ Chef::Cookbook.build(Config.read, cloud, local_workflow)
48
43
  end
49
44
  end
50
45
 
data/lib/sambot/config.rb CHANGED
@@ -56,32 +56,24 @@ module Sambot
56
56
  end
57
57
 
58
58
  def dependencies=(value)
59
- @opts['dependencies'] = @opts[:dependencies] = value
59
+ @opts['dependencies'] = value
60
60
  end
61
61
 
62
62
  def transform_hashes(obj)
63
63
  obj.is_a?(Hash) ? "#{obj.keys.first}', '#{obj.values.first}" : obj
64
64
  end
65
65
 
66
- def description
67
- @opts['description'] || @opts[:description]
68
- end
66
+ def description; @opts['description']; end
69
67
 
70
- def identifier
71
- @opts['identifier'] || @opts[:identifier]
72
- end
68
+ def identifier; @opts['identifier']; end
73
69
 
74
- def suites
75
- @opts['suites'] || @opts[:suites]
76
- end
70
+ def suites; @opts['suites']; end
77
71
 
78
- def version
79
- @opts['version'] || @opts[:version]
80
- end
72
+ def version; @opts['version']; end
81
73
 
82
- def name
83
- @opts['name'] || @opts[:name]
84
- end
74
+ def secrets; @opts['secrets']; end
75
+
76
+ def name; @opts['name']; end
85
77
 
86
78
  def runs_on_centos?
87
79
  available_platforms.include?('centos')
@@ -22,7 +22,7 @@ module Sambot
22
22
  File.delete(opts[:dest]) if File.exist?(opts[:dest])
23
23
  if opts[:eruby]
24
24
  UI.debug("Parsing #{self.path} using Erubis")
25
- self.write({}, opts[:dest])
25
+ self.write(opts, opts[:dest])
26
26
  else
27
27
  FileUtils.cp(self.path, opts[:dest].to_s)
28
28
  end
@@ -0,0 +1,4 @@
1
+ VC_VAULT_ADDR=http://127.0.0.1:8200
2
+ VAULT_ADDR=http://127.0.0.1:8200
3
+ VC_VAULT_TOKEN=root
4
+ VAULT_TOKEN=root
@@ -7,5 +7,5 @@ Style/MutableConstant:
7
7
  Exclude:
8
8
  - recipes/linux_chefdk_setup.rb
9
9
 
10
- Style/EmptyLinesAroundBlockBody:
10
+ Layout/EmptyLinesAroundBlockBody:
11
11
  Enabled: false
@@ -1,3 +1,28 @@
1
+ #################################################################################
2
+ # PROVISIONING A WINDOWS BOX #
3
+ #################################################################################
4
+ # #
5
+ # All our instances need to access Vault in order to retrieve secrets such as #
6
+ # credentials or certificates. #
7
+ # #
8
+ # This bootstrap script provides the capability to do so. #
9
+ # #
10
+ # When an instance is created through Terraform or Rundeck, this script is #
11
+ # provided to bootstrap the box. When the script is generated a wrapper token #
12
+ # is also generated - present in ENV['GCP_VAULT_TOKEN'] - which is used by #
13
+ # the instance to obtain the real token it needs from Vault. #
14
+ # #
15
+ # Once the real token has been obtained, it is periodicially renewed by the #
16
+ # as-vault-token tool. #
17
+ # #
18
+ # The periodic running of this task is managed by the as-vault-token cookbook. #
19
+ # #
20
+ #################################################################################
21
+
22
+ #################################################################################
23
+ # Miscellaneous Windows configuration. #
24
+ #################################################################################
25
+
1
26
  netsh advfirewall firewall add rule name="winrm" dir=in action=allow protocol=TCP localport=5985
2
27
  winrm quickconfig -q
3
28
  winrm set winrm/config/service @{AllowUnencrypted="true"}
@@ -6,6 +31,21 @@ winrm set winrm/config/service/auth @{Basic="true"}
6
31
  Add-Type -AssemblyName "System.IO.Compression.FileSystem"
7
32
  [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
8
33
 
34
+ #################################################################################
35
+ # Install Hashicorp Vault. #
36
+ #################################################################################
37
+
38
+ $wc = New-Object System.Net.WebClient
39
+ $url = "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_windows_amd64.zip"
40
+ $output = "C:\Program Files\vault"
41
+ $zipfile = "$output\$($url.Split('/')[-1])"
42
+ $wc.DownloadFile($url, "$zipfile")
43
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
44
+
45
+ #################################################################################
46
+ # Install Advertising Studio's as-vault-tool binary. #
47
+ #################################################################################
48
+
9
49
  $output = "C:\Program Files\vault"
10
50
  New-Item $output -ItemType Directory -Force
11
51
  $url = "https://storage.googleapis.com/ads-devops-chef/as-vault-tool/<%= ENV['AS_VAULT_TOOL_VERSION'] %>/windows_amd64.zip"
@@ -13,6 +53,10 @@ $zipfile = "$output\$($url.Split('/')[-1])"
13
53
  $wc.DownloadFile($url, $zipfile)
14
54
  [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
15
55
 
56
+ #################################################################################
57
+ # Create the tokens.json file containing the Vault access token. #
58
+ #################################################################################
59
+
16
60
  $json = @"
17
61
  {
18
62
  "vault-addr": "<%= ENV['GCP_VAULT_ADDR'] %>",
@@ -25,4 +69,11 @@ $json = @"
25
69
  New-Item 'C:\ProgramData\vault' -ItemType Directory -Force
26
70
  Set-Content -Path 'C:\ProgramData\vault\tokens.json' -Value $json
27
71
 
72
+ ###### TODO - NEED TO ADD GROUPS STUFF!!!!!
73
+
74
+ #################################################################################
75
+ # Get the real token from the wrapped token and store it in the #
76
+ # tokens.json file. #
77
+ #################################################################################
78
+
28
79
  & "$output\as-vault-tool" tokenrenew
@@ -1,6 +1,37 @@
1
1
  #!/bin/bash -e
2
2
 
3
+ #################################################################################
4
+ # PROVISIONING A LINUX BOX #
5
+ #################################################################################
6
+ # #
7
+ # All our instances need to access Vault in order to retrieve secrets such as #
8
+ # credentials or certificates. #
9
+ # #
10
+ # This bootstrap script provides the capability to do so. #
11
+ # #
12
+ # When an instance is created through Terraform or Rundeck, this script is #
13
+ # provided to bootstrap the box. When the script is generated a wrapper token #
14
+ # is also generated - present in ENV['GCP_VAULT_TOKEN'] - which is used by #
15
+ # the instance to obtain the real token it needs from Vault. #
16
+ # #
17
+ # Once the real token has been obtained, it is periodicially renewed by the #
18
+ # as-vault-token tool. #
19
+ # #
20
+ # The periodic running of this task is managed by the as-vault-token cookbook. #
21
+ # #
22
+ #################################################################################
23
+
24
+ #################################################################################
25
+ # Miscellaneous Linux configuration. #
26
+ #################################################################################
27
+
3
28
  yum install -y unzip wget
29
+
30
+ #################################################################################
31
+ # Create the tokens.json file so that Chef and other applications can access #
32
+ # the Vault server. #
33
+ #################################################################################.
34
+
4
35
  if [ ! -d /etc/vault ]; then mkdir /etc/vault; fi
5
36
 
6
37
  cat << EOF > /etc/vault/tokens.json
@@ -12,9 +43,25 @@ cat << EOF > /etc/vault/tokens.json
12
43
  }
13
44
  EOF
14
45
 
46
+ groupadd -fg 9897 vault-tokens
47
+ usermod -aG vault-tokens root
48
+
49
+ chmod 0640 /etc/vault/tokens.json
50
+ chown root:vault-tokens /etc/vault/tokens.json
51
+
52
+ #################################################################################
53
+ # Install Advertising Studio's as-vault-tool binary. #
54
+ #################################################################################
55
+
15
56
  if [ ! -d /opt/as-vault-tool/<%= ENV['AS_VAULT_TOOL_VERSION'] %> ]; then
16
57
  mkdir -p /opt/as-vault-tool/<%= ENV['AS_VAULT_TOOL_VERSION'] %>
17
58
  fi
18
59
  wget https://storage.googleapis.com/ads-devops-chef/as-vault-tool/<%= ENV['AS_VAULT_TOOL_VERSION'] %>/linux_amd64.zip
19
60
  unzip linux_amd64 -d /opt/as-vault-tool/<%= ENV['AS_VAULT_TOOL_VERSION'] %>/
61
+
62
+ #################################################################################
63
+ # Get the real token from the wrapped token and store it in the #
64
+ # tokens.json file. #
65
+ #################################################################################
66
+
20
67
  /opt/as-vault-tool/<%= ENV['AS_VAULT_TOOL_VERSION'] %>/as-vault-tool tokenrenew
@@ -0,0 +1,94 @@
1
+ #################################################################################
2
+ # PROVISIONING A WINDOWS BOX #
3
+ #################################################################################
4
+ # #
5
+ # All our instances need to access Vault in order to retrieve secrets such as #
6
+ # credentials or certificates. #
7
+ # #
8
+ # This bootstrap script provides the capability to do so. #
9
+ # #
10
+ # When an instance is created through Terraform or Rundeck, this script is #
11
+ # provided to bootstrap the box. When the script is generated a wrapper token #
12
+ # is also generated which is used by the instance to obtain the real token #
13
+ # it needs from Vault. #
14
+ # #
15
+ # Once the real token has been obtained, it is periodicially renewed by the #
16
+ # as-vault-token tool. #
17
+ # #
18
+ # The periodic running of this task is managed by the as-vault-token cookbook. #
19
+ # #
20
+ # When testing a cookbook using the 'sidecar' method this periodic renewal #
21
+ # along with the added security provided by the wrapper token is not required #
22
+ # given the Vault instance is located on the test instance. #
23
+ # #
24
+ # The token used by the test instance is therefore simply the root token and #
25
+ # no unwrapping takes place. #
26
+ # #
27
+ #################################################################################
28
+
29
+ #################################################################################
30
+ # Miscellaneous Windows configuration. #
31
+ #################################################################################
32
+
33
+ $env:VAULT_ADDR="http://127.0.0.1:8200"
34
+ $env:VAULT_TOKEN="root"
35
+
36
+ Add-Type -AssemblyName "System.IO.Compression.FileSystem"
37
+ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
38
+
39
+ #################################################################################
40
+ # Install Hashicorp Vault #
41
+ #################################################################################
42
+
43
+ New-Item 'C:\Program Files\vault' -ItemType Directory -Force
44
+ $wc = New-Object System.Net.WebClient
45
+ $url = "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_windows_amd64.zip"
46
+ $output = "C:\Program Files\vault"
47
+ $zipfile = "$output\$($url.Split('/')[-1])"
48
+ $wc.DownloadFile($url, "$zipfile")
49
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
50
+
51
+ #################################################################################
52
+ # Install Advertising Studio's as-vault-tool binary. #
53
+ #################################################################################
54
+
55
+ $url = "https://storage.googleapis.com/ads-devops-chef/as-vault-tool/1.0.2/windows_amd64.zip"
56
+ $zipfile = "$output\$($url.Split('/')[-1])"
57
+ $wc.DownloadFile($url, $zipfile)
58
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
59
+
60
+ #################################################################################
61
+ #################################################################################
62
+ # Everything above this marker in pre-installed on the #
63
+ # adstudio/windows-provisioned/v* boxes. #
64
+ #################################################################################
65
+ #################################################################################
66
+
67
+ #################################################################################
68
+ # Create the tokens.json file containing the Vault access token. #
69
+ #################################################################################
70
+
71
+ $json = @"
72
+ {
73
+ "vault-addr": "$env:VAULT_ADDR",
74
+ "skip-verify": true,
75
+ "wrapped": "",
76
+ "access": "$env:VAULT_TOKEN"
77
+ }
78
+ "@
79
+
80
+ New-Item 'C:\ProgramData\vault' -ItemType Directory -Force
81
+ Set-Content -Path 'C:\ProgramData\vault\tokens.json' -Value $json
82
+
83
+ #################################################################################
84
+ # Create the 'vault-tokens' group so other services/applications apart from #
85
+ # 'root' can access the file. #
86
+ #################################################################################
87
+
88
+ XXXXX
89
+
90
+ #################################################################################
91
+ # Populate Vault with test secrets using the Chef embedded Ruby. #
92
+ #################################################################################
93
+
94
+ XXXXX
@@ -0,0 +1,80 @@
1
+ #!/bin/bash -e
2
+
3
+ #################################################################################
4
+ # PROVISIONING A LINUX BOX #
5
+ #################################################################################
6
+ # #
7
+ # All our instances need to access Vault in order to retrieve secrets such as #
8
+ # credentials or certificates. #
9
+ # #
10
+ # This bootstrap script provides the capability to do so. #
11
+ # #
12
+ # When an instance is created through Terraform or Rundeck, this script is #
13
+ # provided to bootstrap the box. When the script is generated a wrapper token #
14
+ # is also generated which is used by the instance to obtain the real token #
15
+ # it needs from Vault. #
16
+ # #
17
+ # Once the real token has been obtained, it is periodicially renewed by the #
18
+ # as-vault-token tool. #
19
+ # #
20
+ # The periodic running of this task is managed by the as-vault-token cookbook. #
21
+ # #
22
+ # When testing a cookbook using the 'sidecar' method this periodic renewal #
23
+ # along with the added security provided by the wrapper token is not required #
24
+ # given the Vault instance is located on the test instance. #
25
+ # #
26
+ # The token used by the test instance is therefore simply the root token and #
27
+ # no unwrapping takes place. #
28
+ # #
29
+ #################################################################################
30
+
31
+ #################################################################################
32
+ # Download and install Hashicorp Vault. #
33
+ #################################################################################
34
+
35
+ wget "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_linux_amd64.zip"
36
+ unzip vault_0.6.5_linux_amd64.zip -d /usr/bin
37
+ sudo mkdir /etc/vault
38
+
39
+ #################################################################################
40
+ # Install Advertising Studio's as-vault-tool binary. #
41
+ #################################################################################
42
+
43
+ echo "Download and install as-vault-tool"
44
+ if [ ! -d "/opt/as-vault-tool/1.0.2" ]; then sudo mkdir -p /opt/as-vault-tool/1.0.2; fi
45
+ if [ ! -f /opt/as-vault-tool/1.0.2/as-vault-tool ]; then
46
+ curl --fail -sSO https://storage.googleapis.com/ads-devops-chef/as-vault-tool/1.0.2/linux_amd64.zip > /dev/null 2>&1
47
+ sudo unzip linux_amd64 -d /opt/as-vault-tool/1.0.2/
48
+ fi
49
+
50
+ #################################################################################
51
+ # Use the Vault server on the host machine running under Docker. #
52
+ #################################################################################
53
+
54
+ export VAULT_ADDR=http://10.0.2.2:8200
55
+ export VAULT_TOKEN=root
56
+
57
+ #################################################################################
58
+ # Create the tokens.json file so that Chef and other applications can access #
59
+ # the Vault server. #
60
+ #################################################################################
61
+
62
+ echo "Create the addressing file so that Chef and other applications can access the Vault server"
63
+ cat << EOF > /etc/vault/tokens.json
64
+ {
65
+ "vault-addr": "${VAULT_ADDR}",
66
+ "skip-verify": true,
67
+ "wrapped": "",
68
+ "access": "root"
69
+ }
70
+ EOF
71
+
72
+ #################################################################################
73
+ # Create the 'vault-tokens' group so other services/applications apart from #
74
+ # 'root' can access the file. #
75
+ #################################################################################
76
+
77
+ groupadd -fg 9897 vault-tokens
78
+ usermod -aG vault-tokens root
79
+ chmod 0640 /etc/vault/tokens.json
80
+ chown root:vault-tokens /etc/vault/tokens.json
@@ -0,0 +1,99 @@
1
+ #################################################################################
2
+ # PROVISIONING A WINDOWS BOX #
3
+ #################################################################################
4
+ # #
5
+ # All our instances need to access Vault in order to retrieve secrets such as #
6
+ # credentials or certificates. #
7
+ # #
8
+ # This bootstrap script provides the capability to do so. #
9
+ # #
10
+ # When an instance is created through Terraform or Rundeck, this script is #
11
+ # provided to bootstrap the box. When the script is generated a wrapper token #
12
+ # is also generated which is used by the instance to obtain the real token #
13
+ # it needs from Vault. #
14
+ # #
15
+ # Once the real token has been obtained, it is periodicially renewed by the #
16
+ # as-vault-token tool. #
17
+ # #
18
+ # The periodic running of this task is managed by the as-vault-token cookbook. #
19
+ # #
20
+ # Given this script is for local Test-Kitchen use only, the wrapped token is #
21
+ # generated on the test instance and then unwrapped immediately. No renewal #
22
+ # takes place when testing - except when testing the as-vault-token #
23
+ # cookbook of course!
24
+ # #
25
+ #################################################################################
26
+
27
+ #################################################################################
28
+ # Miscellaneous Windows configuration. #
29
+ #################################################################################
30
+
31
+ $env:VAULT_ADDR="http://192.168.255.5:8200"
32
+ $env:VAULT_TOKEN="root"
33
+
34
+ Add-Type -AssemblyName "System.IO.Compression.FileSystem"
35
+ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
36
+
37
+ #################################################################################
38
+ # Install Hashicorp Vault. #
39
+ #################################################################################
40
+
41
+ New-Item 'C:\Program Files\vault' -ItemType Directory -Force
42
+ $wc = New-Object System.Net.WebClient
43
+ $url = "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_windows_amd64.zip"
44
+ $output = "C:\Program Files\vault"
45
+ $zipfile = "$output\$($url.Split('/')[-1])"
46
+ $wc.DownloadFile($url, "$zipfile")
47
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
48
+
49
+ #################################################################################
50
+ # Install Advertising Studio's as-vault-tool binary. #
51
+ #################################################################################
52
+
53
+ $url = "https://storage.googleapis.com/ads-devops-chef/as-vault-tool/1.0.2/windows_amd64.zip"
54
+ $zipfile = "$output\$($url.Split('/')[-1])"
55
+ $wc.DownloadFile($url, $zipfile)
56
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
57
+
58
+ #################################################################################
59
+ # Generate the wrapped token which is normally provided by the bootstrapping #
60
+ # system. #
61
+ #################################################################################
62
+
63
+ $token = ($(& "$output\vault" token-create -policy=nightswatch-ro -role=nightswatch-ro -wrap-ttl=72h) -match '^wrapping_token:').Split(' ')[-1].Trim()
64
+
65
+ #################################################################################
66
+ # Create the tokens.json file containing the Vault access token. #
67
+ #################################################################################
68
+
69
+ $json = @"
70
+ {
71
+ "vault-addr": "$env:VAULT_ADDR",
72
+ "skip-verify": true,
73
+ "wrapped": "$token",
74
+ "access": ""
75
+ }
76
+ "@
77
+
78
+ New-Item 'C:\ProgramData\vault' -ItemType Directory -Force
79
+ Set-Content -Path 'C:\ProgramData\vault\tokens.json' -Value $json
80
+
81
+ #################################################################################
82
+ # Create the 'vault-tokens' group so other services/applications apart from #
83
+ # 'root' can access the file. #
84
+ #################################################################################
85
+
86
+ ###### TODO - NEED TO ADD GROUPS STUFF!!!!!
87
+
88
+ #################################################################################
89
+ # Get the real token from the wrapped token and store it in the #
90
+ # tokens.json file. #
91
+ #################################################################################
92
+
93
+ & "$output\as-vault-tool" tokenrenew
94
+
95
+ #################################################################################
96
+ # Populate Vault with test secrets using the Chef embedded Ruby. #
97
+ #################################################################################
98
+
99
+ XXXXX
@@ -0,0 +1,90 @@
1
+ #!/bin/bash -e
2
+
3
+ #################################################################################
4
+ # PROVISIONING A LINUX BOX #
5
+ #################################################################################
6
+ # #
7
+ # All our instances need to access Vault in order to retrieve secrets such as #
8
+ # credentials or certificates. #
9
+ # #
10
+ # This bootstrap script provides the capability to do so. #
11
+ # #
12
+ # When an instance is created through Terraform or Rundeck, this script is #
13
+ # provided to bootstrap the box. When the script is generated a wrapper token #
14
+ # is also generated which is used by the instance to obtain the real token #
15
+ # it needs from Vault. #
16
+ # #
17
+ # Once the real token has been obtained, it is periodicially renewed by the #
18
+ # as-vault-token tool. #
19
+ # #
20
+ # The periodic running of this task is managed by the as-vault-token cookbook. #
21
+ # #
22
+ # Given this script is for local Test-Kitchen use only, the wrapped token is #
23
+ # generated on the test instance and then unwrapped immediately. No renewal #
24
+ # takes place when testing - except when testing the as-vault-token #
25
+ # cookbook of course!
26
+ # #
27
+ #################################################################################
28
+
29
+ #################################################################################
30
+ # Miscellaneous Windows configuration. #
31
+ #################################################################################
32
+
33
+ export VAULT_ADDR=http://192.168.255.5:8200
34
+ export VAULT_TOKEN=root
35
+
36
+ sudo yum install -y unzip
37
+
38
+ #################################################################################
39
+ # Download and install Hashicorp Vault. #
40
+ #################################################################################
41
+
42
+ wget "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_linux_amd64.zip"
43
+ unzip vault_0.6.5_linux_amd64.zip -d /usr/bin
44
+ sudo mkdir /etc/vault
45
+
46
+ #################################################################################
47
+ # Generate the wrapped token which is normally provided by the bootstrapping #
48
+ # system. #
49
+ #################################################################################
50
+
51
+ token=$(vault token-create -policy=nightswatch-ro -role=nightswatch-ro -wrap-ttl=72h | awk '/^wrapping_token:/ {print $2}')
52
+
53
+ #################################################################################
54
+ # Create the tokens.json file so that Chef and other applications can access #
55
+ # the Vault server. #
56
+ #################################################################################
57
+
58
+ cat << EOF > /etc/vault/tokens.json
59
+ {
60
+ "vault-addr": "${VAULT_ADDR}",
61
+ "skip-verify": true,
62
+ "wrapped": "${token}",
63
+ "access": ""
64
+ }
65
+ EOF
66
+
67
+ #################################################################################
68
+ # Create the 'vault-tokens' group so other services/applications apart from #
69
+ # 'root' can access the file. #
70
+ #################################################################################
71
+
72
+ groupadd -fg 9897 vault-tokens
73
+ usermod -aG vault-tokens root
74
+ chmod 0640 /etc/vault/tokens.json
75
+ chown root:vault-tokens /etc/vault/tokens.json
76
+
77
+ #################################################################################
78
+ # Install Advertising Studio's as-vault-tool binary. #
79
+ #################################################################################
80
+
81
+ sudo mkdir -p /opt/as-vault-tool/1.0.2
82
+ wget https://storage.googleapis.com/ads-devops-chef/as-vault-tool/1.0.2/linux_amd64.zip
83
+ sudo unzip linux_amd64 -d /opt/as-vault-tool/1.0.2/
84
+
85
+ #################################################################################
86
+ # Get the real token from the wrapped token and store it in the #
87
+ # tokens.json file. #
88
+ #################################################################################
89
+
90
+ sudo /opt/as-vault-tool/1.0.2/as-vault-tool tokenrenew
@@ -0,0 +1,10 @@
1
+ version: '2'
2
+ services:
3
+ vault:
4
+ image: vault
5
+ container_name: vault
6
+ ports:
7
+ - "8200:8200"
8
+ cap_add:
9
+ - IPC_LOCK
10
+ entrypoint: vault server -dev -log-level=debug -dev-listen-address=0.0.0.0:8200 -dev-root-token-id=root
@@ -17,9 +17,6 @@ platforms:
17
17
  <!--% if @platforms.include?('centos') %-->
18
18
  - name: centos-7.2
19
19
  driver:
20
- <!--% if @vault_setup == 'sidecar' %-->
21
- box: adstudio/centos-provisioned-v5
22
- <!--% end %-->
23
20
  network:
24
21
  - ["private_network", {ip: "192.168.255.10"}]
25
22
  <!--% end %-->
Binary file
@@ -5,7 +5,7 @@ module Sambot
5
5
 
6
6
  class << self
7
7
 
8
- def load_values(filename)
8
+ def load_values(config)
9
9
  end
10
10
 
11
11
  end
@@ -0,0 +1,17 @@
1
+
2
+ module Sambot
3
+ module Testing
4
+ class Fixtures
5
+
6
+ class << self
7
+
8
+ def get_path(spec, fixture_file)
9
+ parts = spec.split('spec')
10
+ File.join(parts[0], 'spec/fixtures', parts[1] + 'spec', fixture_file)
11
+ end
12
+
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,6 @@
1
1
  require 'yaml'
2
2
  require 'vault'
3
+ require 'fileutils'
3
4
 
4
5
  module Sambot
5
6
  module Testing
@@ -7,30 +8,35 @@ module Sambot
7
8
 
8
9
  class << self
9
10
 
10
- def load_secrets(filename = '.vault.yml', src = 'vault')
11
- if File.exist?(filename)
12
- read_secrets(filename, src)
13
- else
14
- UI.info("No secrets configuration file is available so Vault was not populated with any secrets")
15
- return 0
11
+ VAULT_CONFIG_BINARY = 'vault-config'
12
+ WORKING_DIR = '/tmp/sambot/testing/vault'
13
+ VAULT_POLICIES_REPO = 'git@github.exacttarget.com:ads-devops/vault-policies.git'
14
+
15
+ def setup
16
+ FileUtils.rm_r(WORKING_DIR) if Dir.exist?(WORKING_DIR)
17
+ FileUtils.mkpath WORKING_DIR
18
+ Dir.chdir WORKING_DIR do
19
+ `git clone --depth=1 --single-branch -q #{VAULT_POLICIES_REPO}`
20
+ Dir.chdir 'vault-policies/dev/vault-config' do
21
+ FS.copy(VAULT_CONFIG_BINARY)
22
+ `./#{VAULT_CONFIG_BINARY} config`
23
+ end
16
24
  end
17
25
  end
18
26
 
19
- private
20
-
21
- def read_secrets(filename, src)
22
- UI.info("Reading the secrets configuration file")
23
- contents = File.read(filename)
24
- if contents.empty?
27
+ def load_secrets(config, src = 'local_testing')
28
+ UI.info("Reading secrets from the configuration file")
29
+ if config.secrets.empty?
25
30
  UI.info("No secrets were found in the secrets configuration file")
26
31
  return 0
27
32
  else
28
- store_secrets(contents, src)
33
+ store_secrets(config.secrets, src)
29
34
  end
30
35
  end
31
36
 
32
- def store_secrets(contents, src)
33
- secrets = YAML.load(contents)
37
+ private
38
+
39
+ def store_secrets(secrets, src)
34
40
  counter = 0
35
41
  secrets.each do |secret|
36
42
  secret['keys'].each do |item|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sambot
4
- VERSION = '0.1.178'.freeze
4
+ VERSION = '0.1.179'.freeze
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sambot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.178
4
+ version: 0.1.179
5
5
  platform: ruby
6
6
  authors:
7
7
  - Olivier Kouame
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-20 00:00:00.000000000 Z
11
+ date: 2017-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor-hollaback
@@ -405,20 +405,20 @@ files:
405
405
  - lib/sambot/runtime.rb
406
406
  - lib/sambot/template.rb
407
407
  - lib/sambot/templates/.config.yml.erb
408
- - lib/sambot/templates/.consul.yml
408
+ - lib/sambot/templates/.env
409
409
  - lib/sambot/templates/.gitignore.sample
410
410
  - lib/sambot/templates/.rubocop.yml
411
- - lib/sambot/templates/.vault.yml
412
411
  - lib/sambot/templates/Berksfile
413
412
  - lib/sambot/templates/README.md
414
413
  - lib/sambot/templates/Vagrantfile.erb
415
414
  - lib/sambot/templates/bootstrap_scripts/google/bootstrap.ps1.erb
416
415
  - lib/sambot/templates/bootstrap_scripts/google/bootstrap.sh.erb
417
- - lib/sambot/templates/bootstrap_scripts/local/sidecar_vault/bootstrap.ps1.erb
418
- - lib/sambot/templates/bootstrap_scripts/local/sidecar_vault/bootstrap.sh.erb
419
- - lib/sambot/templates/bootstrap_scripts/local/standalone_vault/bootstrap.ps1.erb
420
- - lib/sambot/templates/bootstrap_scripts/local/standalone_vault/bootstrap.sh.erb
416
+ - lib/sambot/templates/bootstrap_scripts/local/docker/bootstrap.ps1.erb
417
+ - lib/sambot/templates/bootstrap_scripts/local/docker/bootstrap.sh.erb
418
+ - lib/sambot/templates/bootstrap_scripts/local/vagrant/bootstrap.ps1.erb
419
+ - lib/sambot/templates/bootstrap_scripts/local/vagrant/bootstrap.sh.erb
421
420
  - lib/sambot/templates/chefignore
421
+ - lib/sambot/templates/docker-compose.yml
422
422
  - lib/sambot/templates/git_hooks/pre-commit
423
423
  - lib/sambot/templates/git_hooks/pre-push
424
424
  - lib/sambot/templates/metadata.rb.erb
@@ -427,9 +427,11 @@ files:
427
427
  - lib/sambot/templates/test_kitchen/google.yml.erb
428
428
  - lib/sambot/templates/test_kitchen/local.yml.erb
429
429
  - lib/sambot/templates/test_kitchen/rackspace.yml.erb
430
+ - lib/sambot/templates/vault-config
430
431
  - lib/sambot/templates/vault_helper.rb
431
432
  - lib/sambot/templates/winrm_config
432
433
  - lib/sambot/testing/consul_helper.rb
434
+ - lib/sambot/testing/fixtures.rb
433
435
  - lib/sambot/testing/vault_helper.rb
434
436
  - lib/sambot/ui.rb
435
437
  - lib/sambot/version.rb
File without changes
File without changes
@@ -1,33 +0,0 @@
1
- $env:VAULT_ADDR="http://127.0.0.1:8200"
2
- $env:VAULT_TOKEN="root"
3
-
4
- Add-Type -AssemblyName "System.IO.Compression.FileSystem"
5
- [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
6
-
7
- New-Item 'C:\Program Files\vault' -ItemType Directory -Force
8
- $wc = New-Object System.Net.WebClient
9
- $url = "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_windows_amd64.zip"
10
- $output = "C:\Program Files\vault"
11
- $zipfile = "$output\$($url.Split('/')[-1])"
12
- $wc.DownloadFile($url, "$zipfile")
13
- [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
14
-
15
- $url = "https://storage.googleapis.com/ads-devops-chef/as-vault-tool/1.0.2/windows_amd64.zip"
16
- $zipfile = "$output\$($url.Split('/')[-1])"
17
- $wc.DownloadFile($url, $zipfile)
18
- [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
19
-
20
- $token = ($(& "$output\vault" token-create -policy=nightswatch-ro -role=nightswatch-ro -wrap-ttl=72h) -match '^wrapping_token:').Split(' ')[-1].Trim()
21
- $json = @"
22
- {
23
- "vault-addr": "$env:VAULT_ADDR",
24
- "skip-verify": true,
25
- "wrapped": "$token",
26
- "access": ""
27
- }
28
- "@
29
-
30
- New-Item 'C:\ProgramData\vault' -ItemType Directory -Force
31
- Set-Content -Path 'C:\ProgramData\vault\tokens.json' -Value $json
32
-
33
- & "$output\as-vault-tool" tokenrenew
@@ -1,45 +0,0 @@
1
- #!/bin/bash -e
2
-
3
- echo "Install required tools"
4
- sudo yum install -y unzip wget epel-release zlib-devel bzip2 openssl-devel libyaml-devel libffi-devel readline-devel gdbm-devel ncurses-devel gcc gcc-c++ make
5
-
6
- echo "Download and install Hashicorp Vault"
7
- if [ ! -f /usr/bin/vault ]; then
8
- curl --fail -sSO "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_linux_amd64.zip" > /dev/null 2>&1
9
- unzip vault_0.6.5_linux_amd64.zip -d /usr/bin;
10
- fi
11
- if [ ! -d "/etc/vault" ]; then sudo mkdir /etc/vault; fi
12
-
13
- echo "Download and install Hashicorp Consul"
14
- if [ ! -f /usr/bin/consul ]; then
15
- curl --fail -sSO "https://releases.hashicorp.com/consul/0.8.5/consul_0.8.5_linux_amd64.zip" > /dev/null 2>&1
16
- unzip consul_0.8.5_linux_amd64.zip -d /usr/bin;
17
- fi
18
- if [ ! -d "/etc/consul" ]; then sudo mkdir /etc/consul; fi
19
-
20
- ########## Everything above this line is pre-installed on the 'adstudio-centos-provisioned-v*' box ############
21
-
22
- echo "Launch the Consul Agent in Development mode"
23
- consul agent -dev -server -bootstrap < /dev/null &> /dev/null &
24
-
25
- echo "Launch the Vault Server in Development mode"
26
- export VAULT_ADDR="http://127.0.0.1:8200"
27
- export VAULT_TOKEN="root"
28
- vault server -dev -dev-root-token-id=${VAULT_TOKEN} -dev-listen-address=0.0.0.0:8200 < /dev/null &> /dev/null &
29
- sleep 5
30
- vault mount -path=dev generic
31
-
32
- echo "Create the addressing file so that Chef and other applications can access the Vault server"
33
- cat << EOF > /etc/vault/tokens.json
34
- {
35
- "vault-addr": "${VAULT_ADDR}",
36
- "skip-verify": true,
37
- "wrapped": "",
38
- "access": "root"
39
- }
40
- EOF
41
-
42
- echo "Populate Vault with test secrets using the Chef embedded Ruby"
43
- /opt/chef/embedded/bin/gem install sambot --no-ri --no-doc
44
- cd /vagrant
45
- /opt/chef/embedded/bin/sambot populate --vault
@@ -1,33 +0,0 @@
1
- $env:VAULT_ADDR="http://192.168.255.5:8200"
2
- $env:VAULT_TOKEN="root"
3
-
4
- Add-Type -AssemblyName "System.IO.Compression.FileSystem"
5
- [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
6
-
7
- New-Item 'C:\Program Files\vault' -ItemType Directory -Force
8
- $wc = New-Object System.Net.WebClient
9
- $url = "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_windows_amd64.zip"
10
- $output = "C:\Program Files\vault"
11
- $zipfile = "$output\$($url.Split('/')[-1])"
12
- $wc.DownloadFile($url, "$zipfile")
13
- [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
14
-
15
- $url = "https://storage.googleapis.com/ads-devops-chef/as-vault-tool/1.0.2/windows_amd64.zip"
16
- $zipfile = "$output\$($url.Split('/')[-1])"
17
- $wc.DownloadFile($url, $zipfile)
18
- [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $output)
19
-
20
- $token = ($(& "$output\vault" token-create -policy=nightswatch-ro -role=nightswatch-ro -wrap-ttl=72h) -match '^wrapping_token:').Split(' ')[-1].Trim()
21
- $json = @"
22
- {
23
- "vault-addr": "$env:VAULT_ADDR",
24
- "skip-verify": true,
25
- "wrapped": "$token",
26
- "access": ""
27
- }
28
- "@
29
-
30
- New-Item 'C:\ProgramData\vault' -ItemType Directory -Force
31
- Set-Content -Path 'C:\ProgramData\vault\tokens.json' -Value $json
32
-
33
- & "$output\as-vault-tool" tokenrenew
@@ -1,24 +0,0 @@
1
- #!/bin/bash -e
2
-
3
- export VAULT_ADDR=http://192.168.255.5:8200
4
- export VAULT_TOKEN=root
5
-
6
- sudo yum install -y unzip
7
- wget "https://releases.hashicorp.com/vault/0.6.5/vault_0.6.5_linux_amd64.zip"
8
- unzip vault_0.6.5_linux_amd64.zip -d /usr/bin
9
- sudo mkdir /etc/vault
10
-
11
- token=$(vault token-create -policy=nightswatch-ro -role=nightswatch-ro -wrap-ttl=72h | awk '/^wrapping_token:/ {print $2}')
12
- cat << EOF > /etc/vault/tokens.json
13
- {
14
- "vault-addr": "${VAULT_ADDR}",
15
- "skip-verify": true,
16
- "wrapped": "${token}",
17
- "access": ""
18
- }
19
- EOF
20
-
21
- sudo mkdir -p /opt/as-vault-tool/1.0.2
22
- wget https://storage.googleapis.com/ads-devops-chef/as-vault-tool/1.0.2/linux_amd64.zip
23
- sudo unzip linux_amd64 -d /opt/as-vault-tool/1.0.2/
24
- sudo /opt/as-vault-tool/1.0.2/as-vault-tool tokenrenew