summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorechohack <echohack@users.noreply.github.com>2019-06-13 11:29:36 -0700
committerechohack <echohack@users.noreply.github.com>2019-06-17 18:06:42 -0700
commitf59239c0977b9ae58936264fe9a6a26d1143f677 (patch)
treea0648eb670cf6a0d805e74c66faba25aabf7f19e
parente4490790fb0e075c3d685dc245b258f929e64c73 (diff)
downloadchef-f59239c0977b9ae58936264fe9a6a26d1143f677.tar.gz
added scaffolding-chef plan
Signed-off-by: echohack <echohack@users.noreply.github.com>
-rw-r--r--habitat-packages/.bldr.toml4
-rw-r--r--habitat-packages/chef-client/config/client.rb (renamed from habitat/config/client.rb)0
-rw-r--r--habitat-packages/chef-client/default.toml (renamed from habitat/default.toml)0
-rw-r--r--habitat-packages/chef-client/hooks/init (renamed from habitat/hooks/init)0
-rw-r--r--habitat-packages/chef-client/hooks/run (renamed from habitat/hooks/run)0
-rw-r--r--habitat-packages/chef-client/plan.sh (renamed from habitat/plan.sh)0
-rw-r--r--habitat-packages/scaffolding-chef/README.md15
-rw-r--r--habitat-packages/scaffolding-chef/lib/scaffolding.ps1132
-rw-r--r--habitat-packages/scaffolding-chef/lib/scaffolding.sh171
-rw-r--r--habitat-packages/scaffolding-chef/plan.ps115
-rw-r--r--habitat-packages/scaffolding-chef/plan.sh28
11 files changed, 365 insertions, 0 deletions
diff --git a/habitat-packages/.bldr.toml b/habitat-packages/.bldr.toml
new file mode 100644
index 0000000000..a58453e9a6
--- /dev/null
+++ b/habitat-packages/.bldr.toml
@@ -0,0 +1,4 @@
+[chef-client]
+plan_path = "chef-client/*"
+[scaffolding-chef]
+plan_path = "scaffolding-chef/*"
diff --git a/habitat/config/client.rb b/habitat-packages/chef-client/config/client.rb
index db38c62510..db38c62510 100644
--- a/habitat/config/client.rb
+++ b/habitat-packages/chef-client/config/client.rb
diff --git a/habitat/default.toml b/habitat-packages/chef-client/default.toml
index 2bea08934b..2bea08934b 100644
--- a/habitat/default.toml
+++ b/habitat-packages/chef-client/default.toml
diff --git a/habitat/hooks/init b/habitat-packages/chef-client/hooks/init
index a23344b2a9..a23344b2a9 100644
--- a/habitat/hooks/init
+++ b/habitat-packages/chef-client/hooks/init
diff --git a/habitat/hooks/run b/habitat-packages/chef-client/hooks/run
index 598d609d7f..598d609d7f 100644
--- a/habitat/hooks/run
+++ b/habitat-packages/chef-client/hooks/run
diff --git a/habitat/plan.sh b/habitat-packages/chef-client/plan.sh
index 5569999a12..5569999a12 100644
--- a/habitat/plan.sh
+++ b/habitat-packages/chef-client/plan.sh
diff --git a/habitat-packages/scaffolding-chef/README.md b/habitat-packages/scaffolding-chef/README.md
new file mode 100644
index 0000000000..e75a9391bf
--- /dev/null
+++ b/habitat-packages/scaffolding-chef/README.md
@@ -0,0 +1,15 @@
+# Chef Scaffolding for Habitat
+
+This will take a Chef policy file, and build it for use as a habitat service.
+
+```
+scaffold_policy_name="base"
+pkg_name=chef-base
+pkg_origin=adam
+pkg_version="0.1.0"
+pkg_maintainer="The Habitat Maintainers <humans@habitat.sh>"
+pkg_license=("Apache-2.0")
+pkg_description="The Chef $scaffold_policy_name Policy"
+pkg_upstream_url="http://chef.io"
+pkg_scaffolding="core/scaffolding-chef"
+```
diff --git a/habitat-packages/scaffolding-chef/lib/scaffolding.ps1 b/habitat-packages/scaffolding-chef/lib/scaffolding.ps1
new file mode 100644
index 0000000000..d4107a01aa
--- /dev/null
+++ b/habitat-packages/scaffolding-chef/lib/scaffolding.ps1
@@ -0,0 +1,132 @@
+#
+# A scaffolding for Chef Policyfile packages
+#
+
+if (!$scaffold_policy_name) {
+ Write-Host "You must set `$scaffold_policy_name to a valid policy name. For example:`n `$scaffold_policy_name=base `n Will build a base.rb policyfile."
+ exit 1
+}
+
+function Load-Scaffolding {
+ $scaffold_chef_client = "stuartpreston/chef-client-detox"
+ $scaffold_chef_dk = "core/chef-dk"
+
+ $pkg_deps += @("$scaffold_chef_client", "core/cacerts")
+ $pkg_build_deps += @("$scaffold_chef_dk", "core/git")
+ $pkg_svc_run = "set_just_so_you_will_render"
+}
+
+function Invoke-DefaultBuildService {
+ New-Item -ItemType directory -Path "$pkg_prefix/hooks"
+
+ Add-Content -Path "$pkg_prefix/hooks/run" -Value @"
+function Invoke-ChefClient {
+ {{pkgPathFor "stuartpreston/chef-client-detox"}}/bin/chef-client.bat -z -l {{cfg.log_level}} -c $pkg_svc_config_path/client-config.rb -j $pkg_svc_config_path/attributes.json --once --no-fork --run-lock-timeout {{cfg.run_lock_timeout}}
+}
+
+`$splay_duration = Get-Random -InputObject (0..{{cfg.splay}}) -Count 1
+
+`$splay_first_run_duration = Get-Random -InputObject (0..{{cfg.splay_first_run}}) -Count 1
+
+`$env:SSL_CERT_FILE="{{pkgPathFor "core/cacerts"}}/ssl/cert.pem"
+
+cd {{pkg.path}}
+
+Start-Sleep -Seconds `$splay_first_run_duration
+Invoke-ChefClient
+
+while(`$true){
+ Start-Sleep -Seconds `$splay_duration
+ Start-Sleep -Seconds {{cfg.interval}}
+ Invoke-ChefClient
+}
+"@
+}
+
+
+function Invoke-DefaultBuild {
+ if (!(Test-Path -Path "$scaffold_policyfile_path")) {
+ Write-BuildLine "Could not detect a policyfiles directory, this is required to proceed!"
+ exit 1
+ }
+
+ Remove-Item "$scaffold_policyfile_path/*.lock.json" -Force
+ $policyfile = "$scaffold_policyfile_path/$scaffold_policy_name.rb"
+
+ Get-Content $policyfile | ? { $_.StartsWith("include_policy") } | % {
+ $p = $_.Split()[1]
+ $p = $p.Replace("`"", "").Replace(",", "")
+ Write-BuildLine "Detected included policyfile, $p.rb, installing"
+ chef install "$scaffold_policyfile_path/$p.rb"
+ }
+ Write-BuildLine "Installing $policyfile"
+ chef install "$policyfile"
+}
+
+function Invoke-DefaultInstall {
+ Write-BuildLine "Exporting Chef Infra Repository"
+ chef export "$scaffold_policyfile_path/$scaffold_policy_name.lock.json" "$pkg_prefix"
+
+ Write-BuildLine "Creating Chef Infra configuration"
+ New-Item -ItemType directory -Path "$pkg_prefix/config"
+ Add-Content -Path "$pkg_prefix/.chef/config.rb" -Value @"
+cache_path "$($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$pkg_svc_data_path/cache").Replace("\","/"))"
+node_path "$($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$pkg_svc_data_path/nodes").Replace("\","/"))"
+role_path "$($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$pkg_svc_data_path/roles").Replace("\","/"))"
+chef_zero.enabled true
+ENV['PSModulePath'] += "C:/Program\ Files/WindowsPowerShell/Modules"
+"@
+
+ Write-BuildLine "Creating initial bootstrap configuration"
+ Copy-Item -Path "$pkg_prefix/.chef/config.rb" -Destination "$pkg_prefix/config/bootstrap-config.rb"
+ Add-Content -Path "$pkg_prefix/config/bootstrap-config.rb" -Value @"
+ENV['PATH'] += ";C:/WINDOWS;C:/WINDOWS/system32/;C:/WINDOWS/system32/WindowsPowerShell/v1.0;C:/ProgramData/chocolatey/bin"
+"@
+
+ Write-BuildLine "Creating Chef Infra client configuration"
+ Copy-Item -Path "$pkg_prefix/.chef/config.rb" -Destination "$pkg_prefix/config/client-config.rb"
+ Add-Content -Path "$pkg_prefix/config/client-config.rb" -Value @"
+ssl_verify_mode {{cfg.ssl_verify_mode}}
+ENV['PATH'] += "{{cfg.env_path_prefix}}"
+
+{{#if cfg.data_collector.enable ~}}
+chef_guid "{{sys.member_id}}"
+data_collector.token "{{cfg.data_collector.token}}"
+data_collector.server_url "{{cfg.data_collector.server_url}}"
+{{/if ~}}
+"@
+
+ Write-BuildLine "Generating config/attributes.json"
+ Add-Content -Path "$pkg_prefix/config/attributes.json" -Value @"
+{{#if cfg.attributes}}
+{{toJson cfg.attributes}}
+{{else ~}}
+{}
+{{/if ~}}
+"@
+
+ Write-BuildLine "Generating Chef Habiat configuration, default.toml"
+ Add-Content -Path "$pkg_prefix/default.toml" -Value @"
+interval = 1800
+splay = 1800
+splay_first_run = 0
+run_lock_timeout = 1800
+log_level = "warn"
+env_path_prefix = ";C:/WINDOWS;C:/WINDOWS/system32/;C:/WINDOWS/system32/WindowsPowerShell/v1.0;C:/ProgramData/chocolatey/bin"
+ssl_verify_mode = ":verify_peer"
+
+[chef_license]
+acceptance = "undefined"
+
+[data_collector]
+enable = false
+token = "set_to_your_token"
+server_url = "set_to_your_url"
+"@
+
+ $scaffold_data_bags_path = "not_using_data_bags" # Set default to some string so Test-Path returns false instead of error. Thanks Powershell!
+ if (Test-Path "$scaffold_data_bags_path") {
+ Write-BuildLine "Detected a data bags directory, installing into package"
+ Copy-Item "$scaffold_data_bags_path/*" -Destination "$pkg_prefix" -Recurse
+ }
+}
diff --git a/habitat-packages/scaffolding-chef/lib/scaffolding.sh b/habitat-packages/scaffolding-chef/lib/scaffolding.sh
new file mode 100644
index 0000000000..a938717def
--- /dev/null
+++ b/habitat-packages/scaffolding-chef/lib/scaffolding.sh
@@ -0,0 +1,171 @@
+#
+# A scaffolding for Chef Policyfile packages
+#
+
+if [ -z "${scaffold_policy_name+x}" ]; then
+ echo "You must set \$scaffold_policy_name to a valid policy name. For example:"
+ echo
+ echo "\$scaffold_policy_name=base"
+ echo
+ echo "Will build a base.rb policyfile"
+ exit 1
+fi
+
+scaffolding_load() {
+ : "${scaffold_chef_client:=chef/chef-client}"
+ : "${scaffold_chef_dk:=chef/chef-dk}"
+
+ pkg_deps=(
+ "${pkg_deps[@]}"
+ "$scaffold_chef_client"
+ "core/cacerts"
+ )
+ pkg_build_deps=(
+ "${pkg_build_deps[@]}"
+ "$scaffold_chef_dk"
+ "core/git"
+ )
+
+ pkg_svc_user="root"
+ pkg_svc_run="set_just_so_you_will_render"
+}
+
+do_default_download() {
+ return 0
+}
+
+do_default_verify() {
+ return 0
+}
+
+do_default_unpack() {
+ return 0
+}
+
+do_default_build_service() {
+ ## Create hooks
+ mkdir -p "$pkg_prefix/hooks"
+ chmod 0750 "$pkg_prefix/hooks"
+
+ # Run hook
+ cat << EOF >> "$pkg_prefix/hooks/run"
+#!/bin/sh
+
+chef_client_cmd()
+{
+ chef-client -z -l {{cfg.log_level}} -c $pkg_svc_config_path/client-config.rb -j $pkg_svc_config_path/attributes.json --once --no-fork --run-lock-timeout {{cfg.run_lock_timeout}}
+}
+
+SPLAY_DURATION=\$({{pkgPathFor "core/coreutils"}}/bin/shuf -i 0-{{cfg.splay}} -n 1)
+
+SPLAY_FIRST_RUN_DURATION=\$({{pkgPathFor "core/coreutils"}}/bin/shuf -i 0-{{cfg.splay_first_run}} -n 1)
+
+export SSL_CERT_FILE="{{pkgPathFor "core/cacerts"}}/ssl/cert.pem"
+
+cd {{pkg.path}}
+
+# After the first run of the chef-client,
+# export the new package ident so that
+# other software can bind to it.
+# For example, this is useful for InSpec
+# to execute its run hook immediately after
+# the chef-client run has finished.
+
+exec 2>&1
+sleep \$SPLAY_FIRST_RUN_DURATION
+chef_client_cmd
+
+while true; do
+
+sleep \$SPLAY_DURATION
+sleep {{cfg.interval}}
+chef_client_cmd
+done
+EOF
+ chmod 0750 "$pkg_prefix/hooks/run"
+}
+
+do_default_build() {
+ if [ -d "$PLAN_CONTEXT/../policyfiles" ]; then
+ _policyfile_path="$PLAN_CONTEXT/../policyfiles"
+ else
+ if [ -d "$PLAN_CONTEXT/../../policyfiles" ]; then
+ _policyfile_path="$PLAN_CONTEXT/../../policyfiles"
+ else
+ if [ -d "$PLAN_CONTEXT/../../../policyfiles" ]; then
+ _policyfile_path="$PLAN_CONTEXT/../../../policyfiles"
+ else
+ echo "Cannot detect a policyfiles directory!"
+ exit 1
+ fi
+ fi
+ fi
+ rm -f "$_policyfile_path"/*.lock.json
+ policyfile="$_policyfile_path/$scaffold_policy_name.rb"
+ for x in $(grep include_policy "$policyfile" | awk -F "," '{print $1}' | awk -F '"' '{print $2}' | tr -d " "); do
+ chef install "$_policyfile_path/$x.rb"
+ done
+ chef install "$policyfile"
+}
+
+do_default_install() {
+ chef export "$_policyfile_path/$scaffold_policy_name.lock.json" "$pkg_prefix"
+
+ mkdir -p "$pkg_prefix/config"
+ chmod 0750 "$pkg_prefix/config"
+ cat << EOF >> "$pkg_prefix/.chef/config.rb"
+cache_path "$pkg_svc_data_path/cache"
+node_path "$pkg_svc_data_path/nodes"
+role_path "$pkg_svc_data_path/roles"
+
+chef_zero.enabled true
+EOF
+
+ cp "$pkg_prefix/.chef/config.rb" "$pkg_prefix/config/bootstrap-config.rb"
+ cat << EOF >> "$pkg_prefix/config/bootstrap-config.rb"
+ENV['PATH'] = "/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:#{ENV['PATH']}"
+EOF
+
+ cp "$pkg_prefix/.chef/config.rb" "$pkg_prefix/config/client-config.rb"
+ cat << EOF >> "$pkg_prefix/config/client-config.rb"
+ssl_verify_mode {{cfg.ssl_verify_mode}}
+ENV['PATH'] = "{{cfg.env_path_prefix}}:#{ENV['PATH']}"
+
+{{#if cfg.data_collector.enable ~}}
+chef_guid "{{sys.member_id}}"
+data_collector.token "{{cfg.data_collector.token}}"
+data_collector.server_url "{{cfg.data_collector.server_url}}"
+{{/if ~}}
+EOF
+ chmod 0640 "$pkg_prefix/config/client-config.rb"
+
+ cat << EOF >> "$pkg_prefix/config/attributes.json"
+{{#if cfg.attributes ~}}
+{{toJson cfg.attributes}}
+{{else ~}}
+{}
+{{/if ~}}
+EOF
+
+ ## Create config
+ cat << EOF >> "$pkg_prefix/default.toml"
+interval = 1800
+splay = 1800
+splay_first_run = 0
+run_lock_timeout = 1800
+log_level = "warn"
+chef_client_ident = "" # this is blank by default so it can be populated from the bind
+env_path_prefix = "/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"
+ssl_verify_mode = ":verify_peer"
+
+[data_collector]
+enable = false
+token = "set_to_your_token"
+server_url = "set_to_your_url"
+EOF
+ chmod 0640 "$pkg_prefix/default.toml"
+}
+
+do_default_strip() {
+ return 0
+}
diff --git a/habitat-packages/scaffolding-chef/plan.ps1 b/habitat-packages/scaffolding-chef/plan.ps1
new file mode 100644
index 0000000000..d61241056a
--- /dev/null
+++ b/habitat-packages/scaffolding-chef/plan.ps1
@@ -0,0 +1,15 @@
+$pkg_name="scaffolding-chef"
+$pkg_description="Scaffolding for Chef Policyfiles"
+$pkg_origin="chef"
+$pkg_version="0.6.0"
+$pkg_maintainer="The Habitat Maintainers <humans@habitat.sh>"
+$pkg_license=("Apache-2.0")
+$pkg_upstream_url="https://www.chef.sh"
+$pkg_build_deps=@(
+ "core/chefdk"
+ "core/git"
+ )
+function Invoke-Install {
+ New-Item -ItemType directory -Path "${pkg_prefix}/lib"
+ Copy-Item -Path "$PLAN_CONTEXT/lib/scaffolding.ps1" -Destination "$pkg_prefix/lib/scaffolding.ps1"
+}
diff --git a/habitat-packages/scaffolding-chef/plan.sh b/habitat-packages/scaffolding-chef/plan.sh
new file mode 100644
index 0000000000..d3d49dfdc3
--- /dev/null
+++ b/habitat-packages/scaffolding-chef/plan.sh
@@ -0,0 +1,28 @@
+pkg_name=scaffolding-chef
+pkg_description="Scaffolding for Chef Policyfiles"
+pkg_origin=chef
+pkg_version="0.5.0"
+pkg_maintainer="The Habitat Maintainers <humans@habitat.sh>"
+pkg_license=('Apache-2.0')
+pkg_source=nope
+pkg_upstream_url="https://www.chef.sh"
+
+do_download() {
+ return 0
+}
+
+do_verify() {
+ return 0
+}
+
+do_unpack() {
+ return 0
+}
+
+do_build() {
+ return 0
+}
+
+do_install() {
+ install -D -m 0644 "$PLAN_CONTEXT/lib/scaffolding.sh" "$pkg_prefix/lib/scaffolding.sh"
+}