Code Monkey home page Code Monkey logo

octopus-deploy-cookbook's Introduction

Octopus Deploy Cookbook

Cookbook Converge Build Status Code Climate Chef cookbook GitHub license

This cookbook is used for installing the Octopus Deploy server and Tentacle on Microsoft Windows machines.

**NOTE: This cookbook is managed by Cvent and not by the Octopus Deploy team.

NOTICE: Pre-Release

This is pre release and there will be major changes to this before its final release. The recipes for installation and configuration will be switched into resources so people can use the library easier. Once this is found stable it will be released as version 1.0.0, until this point lock down to any minor version that you use.

Resource/Provider

octopus_deploy_server

Actions

  • :install: Install a version of Octopus Deploy server
  • :configure: Install a version of Octopus Deploy server and configure it
  • :remove: Uninstall a version of the Octopus Deploy Server if it is installed

Attribute Parameters

  • :instance: Name attribute. The Octopus Deploy Server instance name (used for configuring the instance not install)
  • :version: Required. The version of Octopus Deploy Server to install
  • :checksum: The SHA256 checksum of the Octopus Deploy Server msi file to verify download
  • :home_path: The Octopus Deploy Server home directory (Defaults to C:\Octopus)
  • :install_url: The url for the installer to download.
  • :config_path: The Octopus Deploy Server config file path (Defaults to C:\Octopus\OctopusServer.config)
  • :connection_string: The Octopus Deploy Server connection string to the MSSQL Server instance. Required for :configure action.
  • :master_key: The Octopus Deploy Server master key for encryption, leave blank to generate one at creation
  • :node_name: The Octopus Deploy Server Node Name, will default to chef node name
  • :create_database: Whether Octopus Deploy Server should create the database with the connection string provided (Defaults to false)
  • :admin_user: A default admin user for Octopus Deploy Server to create. Requires machine to be joined to active directory, and admin_user must be an AD user
  • :license: The raw license key for Octopus Deploy Server to use
  • :start_service: Whether to start the Octopus Deploy Server service after creation of the instance (Defaults to True)

Example

Install version 3.17.1 of Octopus Deploy Server

octopus_deploy_server 'OctopusServer' do
  action :install
  version '3.17.1'
  checksum '<SHA256-checksum>'
end

This cookbook does not setup the database. You will need a preexisting SQLEXPRESS/MSSQL database instance

octopus_database = "OctopusDeploy"

octopus_deploy_server 'OctopusServer' do
  action [:install, :configure]
  version '3.17.1'
  checksum'cee5ef29d6e517d197687c50a041be47a3bd56a65010051ddc53dc0c515d39e5'
  connection_string "Data Source=(local)\\SQLEXPRESS;Initial Catalog=#{octopus_database};Integrated Security=True"
  node_name node.name
  create_database true
  license '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  start_service true
end

octopus_deploy_tentacle

Actions

  • :install: Install a version of Octopus Deploy Tentacle (Default)
  • :configure: Configure an instance of the octopus Deploy Tentacle
  • :register: Register Tentacle with Octopus Deploy Server
  • :remove: Remove an instance of the Octopus Deploy Tentacle
  • :uninstall: Uninstall a version of the Octopus Deploy Tentacle if it is installed

Attribute Parameters

  • :instance: Name attribute. The Octopus Deploy Tentacle instance name (used for configuring the instance not install)
  • :version: Required. The version of Octopus Deploy Tentacle to install
  • :checksum: The SHA256 checksum of the Octopus Deploy Tentacle msi file to verify download
  • :home_path: The Octopus Deploy Instance home directory (Defaults to C:\Octopus)
  • :config_path: The Octopus Deploy Instance config file path (Defaults to C:\Octopus\Tentacle.config)
  • :app_path: The Octopus Deploy Instance application directory (Defaults to C:\Octopus\Applications)
  • :trusted_cert: The Octopus Deploy Instance trusted Server cert
  • :port: The Octopus Deploy Instance port to listen on for listening Tentacle (Defaults to 10933)
  • :configure_firewall: Whether cookbook will open firewall on listen Tentacles (Defaults to false)
  • :polling: Whether this Octopus Deploy Instance is a polling Tentacle (Defaults to False)
  • :cert_file: Where to export the Octopus Deploy Instance cert (Defaults to C:\Octopus\tentacle_cert.txt)
  • :upgrades_enabled: Whether to upgrade or downgrade the Tentacle version if the windows installer version does not match what is provided in the resource. (Defaults to True)
  • :server: Url to Octopus Deploy Server (e.g https://octopus.example.com)
  • :api_key: Api Key used to register Tentacle to Octopus Server
  • :roles: Array of roles to apply to Tentacle when registering with Octopus Deploy Server (e.g ["web-server","app-server"])
  • :environment: Which environment or environments the Tentacle will become part of when registering with Octopus Deploy Server (Defaults to node.chef_environment). Accepts string or array.
  • :forced_registration: Whether the command should include --force to support overwriting tentacle references that already exist in Octopus Server
  • :tenants: Optional array of tenants to add to the Tentacle. Tenant must already exist on Octopus Deploy Server. Requires Octopus 3.4
  • :tenant_tags: Optional array of tenant tags to add to the Tentacle. Tags must already exist on Octopus Deploy Server. If tag is part of a tag group, include the group name followed by a slash <groupname>/<tag>. e.g ( Priority/VIP, Datacenter/US ).. Requires Octopus 3.4
  • :tentacle_name: Optional custom name for Tentacle. Defaults to the Chef node name
  • :service_user: Optional service user name. Defaults to Local System
  • :service_password: Password for service user
  • :public_dns: Optional DNS/IP value to use when registring with the octopus server. Defaults to node['fqdn']
  • :tenated_deployment_participation: Optional type of deployments allowed [:Untenanted, :Tenanted, :TenantedOrUntenanted] (requires tentacle 3.19.0 or newer)

Examples

Install version 3.2.24 of Octopus Deploy Tentacle

This will simply install the version of the Tentacle that is specified.

octopus_deploy_tentacle 'Tentacle' do
  action :install
  version '3.2.24'
  checksum '147f84241c912da1c8fceaa6bda6c9baf980a77e55e61537880238feb3b7000a'
end
Install version 3.2.24 of Octopus Deploy Tentacle and configure it

This will install the Tentacle and then configure the Tentacle on the machine to communicate with the Octopus Deploy server. It can also update firewall rules if enabled.

octopus_deploy_tentacle 'Tentacle' do
  action [:install, :configure]
  version '3.2.24'
  checksum '147f84241c912da1c8fceaa6bda6c9baf980a77e55e61537880238feb3b7000a'
  trusted_cert 'b5b7ea6537852fb5b7ea6537852f3428'
  # You can enable this resource to update firewall rules as well
  configure_firewall true
end
Register Listening Tentacle with the Octopus Deploy Server

This will check if the Tentacle is registered on the Octopus Deploy server and if it is not will register the Tentacle in the environment with the tags that are specified.

# You will first need to generate an api key
# In Octopus Deploy Server GUI click your Name -> Profile -> API keys
octopus_deploy_tentacle 'Tentacle' do
  action :register
  server 'https://octopus.example.com'
  api_key '12345678910'
  roles ['database']
  # You can set polling to true for a polling Tentacle setup
  # polling true
end

octopus_deploy_tools

Actions

  • :install: Install a version of Octopus Deploy tools (Default)

Attribute Parameters

  • :path: The Octopus Deploy tools directory (Defaults to C:\Octopus)
  • :source: Required. The url to download the tools from
  • :checksum: The SHA256 checksum of the Octopus Deploy tools zip file to verify download

Examples

Install version 4.5.1 of Octopus Deploy tools

This will simply install the version of the tools that is specified to the C:\fun folder

octopus_deploy_tools 'C:\fun' do
  action :install
  source 'https://download.octopusdeploy.com/octopus-tools/4.5.1/OctopusTools.4.5.1.zip'
  checksum 'd6794027d413764e7a892547fba9ed410bfa0a53425b178f628128d2b1aebb5f' # sha256 checksum
end

Assumptions

One major assumption of this cookbook is that you already have .net40 installed on your server. If you do not then you might need to do that before this cookbook. In addition, some of the resources in here require Chef version 12 in order to work.

Known Issues

This does not work with Octopus Deploy versions less than 3.2.3 because of a bug in exporting Tentacle certificates

Tentacle roles are only used the first time a Tentacle is registered with an Octopus Deploy Server. Updating Tentacle roles in cookbook will not update roles on Octopus Deploy Server.

Registering multiple Tentacles on the same machine is not supported.

Switching Tentacle modes between 'polling' & 'listening' is not currently supported.

License and Author

Copyright:: 2015, Cvent, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Please refer to the license file for more license information.

octopus-deploy-cookbook's People

Contributors

brentm5 avatar dependabot[bot] avatar dk-ebeisecker avatar gdavison avatar georgevanburgh avatar namankumarcvent avatar nootn00t avatar ramezjm avatar spuder avatar vanessalove avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

octopus-deploy-cookbook's Issues

Connection string is sometimes required

If you use the octopus_server resource, you must provide a connection string if you wish to use the :configure action

 ================================================================================
           Error executing action `configure` on resource 'octopus_deploy_server[OctopusServer]'
           ================================================================================

           Mixlib::ShellOut::ShellCommandFailed
           ------------------------------------
           powershell_script[configure-server-OctopusServer] (C:/Users/vagrant/AppData/Local/Temp/kitchen/cache/cookbooks/octopus-deploy/resources/server.rb line 76) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
           ---- Begin output of "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/vagrant/AppData/Local/Temp/chef-script20170920-2732-b3ylnp.ps1" ----
           STDOUT:
           STDERR: ===============================================================================Missing required value for option '--storageConnectionString'.

           Octopus.Shared.Internals.Options.OptionException

       at Octopus.Shared.Internals.Options.OptionValueCollection.AssertValid(Int32 index)

       at Octopus.Shared.Internals.Options.OptionSet.<>c__DisplayClass16_0.<Add>b__0(OptionValueCollection v)

       at Octopus.Shared.Internals.Options.Option.Invoke(OptionContext c)

       at Octopus.Shared.Internals.Options.OptionSet.Parse(IEnumerable`1 arguments)

       at Octopus.Shared.Startup.AbstractCommand.Start(String[] commandLineArguments, ICommandRuntime commandRuntime, OptionSet commonOptions)

       at Octopus.Shared.Startup.ConsoleHost.Run(Action`1 start, Action shutdown)

       at Octopus.Shared.Startup.OctopusProgram.Run()

No resource for service_name provider

This is more of a feature request. You currently have the provider for service_name set to service_name(instance) which yields the result "OctopusDeploy Tentacle - Machine Name" as the actual windows service name. The issue arises when this configuration attempts to perform a service name check (or not if block) and because I cannot override this value it causes my wrapper to error out. This is due to inconsistencies in how you define the service name and how the service has been deployed in my environment.

Error if node name not specified

You will get an error if you don't specify the node name when creating an octopus server

ERROR: Command returned 100 Configuring Cluster Node Name
-----> Starting Kitchen (v1.16.0)
-----> Converging <server-netdocuments-windows-2012r2>...
       Preparing files for transfer
       Preparing dna.json
       Resolving cookbook dependencies with Berkshelf 5.6.4...
       Removing non-cookbook files before transfer
       Preparing validation.pem
       Preparing client.rb
-----> Chef Omnibus installation detected (install only if missing)
       Transferring files to <server-netdocuments-windows-2012r2>
       Starting Chef Client, version 12.16.42
       resolving cookbooks for run list: ["nd-octopus::server"]
       Synchronizing Cookbooks:
         - nd-octopus (0.8.1)
         - windows (1.43.0)
         - windows_firewall (3.0.2)
         - octopus-deploy (0.12.0)
         - chef_handler (3.0.2)
       Installing Cookbook Gems:
       Compiling Cookbooks...
       Converging 2 resources
       Recipe: nd-octopus::server
         * chocolatey_package[MsSqlServer2014Express] action install (up to date)
         * octopus_deploy_server[OctopusServer] action install[2017-09-21T03:22:19+00:00] WARN: Please use the package resource available in Chef Client 12.6.
       windows_package will be removed in the next major version release
       of the Windows cookbook.


           * remote_file[C:\Users\vagrant\AppData\Local\Temp\kitchen\cache/octopus-server.msi] action create (up to date)
           * windows_package[Octopus Deploy Server] action install (up to date)
            (up to date)
         * octopus_deploy_server[OctopusServer] action configure[2017-09-21T03:22:21+00:00] WARN: Please use the package resource available in Chef Client 12.6.
       windows_package will be removed in the next major version release
       of the Windows cookbook.


           * remote_file[C:\Users\vagrant\AppData\Local\Temp\kitchen\cache/octopus-server.msi] action create (up to date)
           * windows_package[Octopus Deploy Server] action install (up to date)
           * powershell_script[create-instance-OctopusServer] action run (skipped due to not_if)
           * powershell_script[configure-server-OctopusServer] action run

             ================================================================================
             Error executing action `run` on resource 'powershell_script[configure-server-OctopusServer]'
             ================================================================================

             Mixlib::ShellOut::ShellCommandFailed
             ------------------------------------
             Expected process to exit with [0], but received '1'
             ---- Begin output of "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/vagrant/AppData/Local/Temp/chef-script20170921-768-bsxbyt.ps1" ----
             STDOUT:
             STDERR: ===============================================================================Missing required value for option '--serverNodeName'.

             Octopus.Shared.Internals.Options.OptionException

         at Octopus.Shared.Internals.Options.OptionValueCollection.AssertValid(Int32 index)

         at Octopus.Shared.Internals.Options.OptionSet.<>c__DisplayClass16_0.<Add>b__0(OptionValueCollection v)

         at Octopus.Shared.Internals.Options.Option.Invoke(OptionContext c)

         at Octopus.Shared.Internals.Options.OptionSet.Parse(IEnumerable`1 arguments)

         at Octopus.Shared.Startup.AbstractCommand.Start(String[] commandLineArguments, ICommandRuntime commandRuntime, OptionSet commonOptions)

         at Octopus.Shared.Startup.ConsoleHost.Run(Action`1 start, Action shutdown)

         at Octopus.Shared.Startup.OctopusProgram.Run()

             -------------------------------------------------------------------------------

             Terminating process with exit code 100

             Full error details are available in the log files at:

             C:\Octopus\Logs

             C:\Users\vagrant\AppData\Local\Octopus\Logs

             If you need help, please send these log files to https://octopus.com/support

             -------------------------------------------------------------------------------



             C:\Users\vagrant\AppData\Local\Temp\chef-script20170921-768-bsxbyt.ps1 :

             ERROR: Command returned 100 Configuring Cluster Node Name

          + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorExcep

         tion

          + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio

         n,chef-script20170921-768-bsxbyt.ps1
             ---- End output of "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/vagrant/AppData/Local/Temp/chef-script20170921-768-bsxbyt.ps1" ----
             Ran "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/vagrant/AppData/Local/Temp/chef-script20170921-768-bsxbyt.ps1" returned 1

             Resource Declaration:
             ---------------------
             # In C:/Users/vagrant/AppData/Local/Temp/kitchen/cache/cookbooks/octopus-deploy/resources/server.rb

       76:   powershell_script "configure-server-#{instance}" do # ~FC009
       77:     action :run
       78:     cwd server_install_location
       79:     sensitive new_resource.sensitive
       80:     code <<-EOH
       81:     .\\Octopus.Server.exe configure --instance "#{instance}" --home "#{home_path}" --console
       82:     #{catch_powershell_error('Configuring Home Dir')}
       83:     .\\Octopus.Server.exe configure --instance "#{instance}" --storageConnectionString "#{connection_string}" --console
       84:     #{catch_powershell_error('Configuring Database Connection')}
       85:     .\\Octopus.Server.exe configure --instance "#{instance}" --upgradeCheck "True" --upgradeCheckWithStatistics "True" --console
       86:     #{catch_powershell_error('Configuring Upgrade Checks')}
       87:     .\\Octopus.Server.exe configure --instance "#{instance}" --webAuthenticationMode "Domain" --console
       88:     #{catch_powershell_error('Configuring authentication')}
       89:     .\\Octopus.Server.exe configure --instance "#{instance}" --serverNodeName "#{node_name}" --console
       90:     #{catch_powershell_error('Configuring Cluster Node Name')}
       91:     .\\Octopus.Server.exe configure --instance "#{instance}" --webForceSSL "False" --webListenPrefixes "http://localhost:80/" --commsListenPort "10943" --console
       92:     #{catch_powershell_error('Configuring Listen Ports')}
       93:     #{".\\Octopus.Server.exe configure --instance \"#{instance}\" --masterkey \"#{master_key}\" --console; #{catch_powershell_error('Configuring Master Key')}" if master_key}
       94:     #{".\\Octopus.Server.exe database --instance \"#{instance}\" --create --console; #{catch_powershell_error('Create Database')}" if create_database}
       95:     .\\Octopus.Server.exe service --instance "#{instance}" --stop --console
       96:     #{catch_powershell_error('Stop Service')}
       97:     #{".\\Octopus.Server.exe admin --instance \"#{instance}\" --username \"#{admin_user}\" --console; #{catch_powershell_error('Set administrator')}" if admin_user}
       98:     #{".\\Octopus.Server.exe license --instance \"#{instance}\" --licenseBase64 \"#{Base64.encode64(license)}\" --console; #{catch_powershell_error('Configuring License')}" if license}
       99:     .\\Octopus.Server.exe service --instance "#{instance}" --install --reconfigure --console
             100:     #{catch_powershell_error('Create Service')}
             101:     EOH
             102:     not_if { ::Win32::Service.exists?(service_name) }
             103:   end
             104:

             Compiled Resource:
             ------------------
             # Declared in C:/Users/vagrant/AppData/Local/Temp/kitchen/cache/cookbooks/octopus-deploy/resources/server.rb:76:in `block in class_from_file'

             powershell_script("configure-server-OctopusServer") do
        action [:run]
        retries 0
        retry_delay 2
        default_guard_interpreter :powershell_script
        command "configure-server-OctopusServer"
        backup 5
        cwd "C:\\Program Files\\Octopus Deploy\\Octopus"
        returns 0
        code "    .\\Octopus.Server.exe configure --instance \"OctopusServer\" --home \"C:\\Octopus\" --console\n    if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Configuring Home Dir\" }\n    .\\Octopus.Server.exe configure --instance \"OctopusServer\" --storageConnectionString \"Server=(local)\\SQLExpress;Database=OnlineStore;Integrated Security=SSPI\" --console\n    if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Configuring Database Connection\" }\n    .\\Octopus.Server.exe configure --instance \"OctopusServer\" --upgradeCheck \"True\" --upgradeCheckWithStatistics \"True\" --console\n    if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Configuring Upgrade Checks\" }\n    .\\Octopus.Server.exe configure --instance \"OctopusServer\" --webAuthenticationMode \"Domain\" --console\n    if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Configuring authentication\" }\n    .\\Octopus.Server.exe configure --instance \"OctopusServer\" --serverNodeName \"\" --console\n    if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Configuring Cluster Node Name\" }\n    .\\Octopus.Server.exe configure --instance \"OctopusServer\" --webForceSSL \"False\" --webListenPrefixes \"http://localhost:80/\" --commsListenPort \"10943\" --console\n    if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Configuring Listen Ports\" }\n    \n    .\\Octopus.Server.exe database --instance \"OctopusServer\" --create --console; if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Create Database\" }\n    .\\Octopus.Server.exe service --instance \"OctopusServer\" --stop --console\n    if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Stop Service\" }\n    \n    \n    .\\Octopus.Server.exe service --instance \"OctopusServer\" --install --reconfigure --console\n    if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Create Service\" }\n"
        interpreter "powershell.exe"
        declared_type :powershell_script
        cookbook_name "nd-octopus"
        not_if { #code block }
             end

             Platform:
             ---------
             x64-mingw32

Add configuration of Server resource

Should be able to configure a server with the octopus_deploy_server resource. The scope of this is the following:

  • 3.0+ nodes
  • Fresh install
  • Sql server instance already configured
  • Some Hardcoded Default values
  • System level service (not running as a particular user)
  • Will not reconfigure if changes are made to individual config changes.

Open firewall

Removing the firewall functionality from #33 and splitting into its own enhancement.

Firewall

  • Create flag to allow user to control if the firewall is managed with cookbook or GPO.
  • Add windows_firewall_rule to either :register or :configure resource.

In metadata.rb

depends 'windows_firewall', '~> 3.0.2'

In providers/tentacle.rb

  firewall = windows_firewall_rule 'Octopus Deploy Tentacle' do
    localport lazy { port.to_s }
    dir :in
    protocol 'TCP'
    firewall_action :allow
    action :create
    only_if { polling == false }
  end

and

  new_resource.updated_by_last_action(actions_updated?([firewall, register_listening_instance, register_polling_instance]))

option_list doesn't handle nil

If you call option_list on a nil or undefined object, it throws an error.

           ================================================================================
           Error executing action `register` on resource 'octopus_deploy_tentacle[Tentacle]'
           ================================================================================

           NoMethodError
           -------------
           undefined method `map' for nil:NilClass

           Resource Declaration:


option_list is only currently used in a couple of places, and those are all required attributes.

Make it so that option_list can handle optional attributes (nil)

Support multiple environments

Currently the environment attribute must be a string.
In Chef each machine can only be part of 1 environment. In Octopus Deploy a machine can be part of multiple environments.

Change environment to an array.

This isn't a high priority, and is would probably be a breaking change.

admin_user only works for LDAP

If you define admin_user on a machine that isn't part of an active directory domain, and you don't specify password, you will get error The LDAP server is unavailable

 * octopus_deploy_server[OctopusServer] action configure[2017-09-21T21:26:34+00:00] WARN: Please use the package resource available in Chef Client 12.6.
       windows_package will be removed in the next major version release
       of the Windows cookbook.


           * remote_file[C:\Users\vagrant\AppData\Local\Temp\kitchen\cache/octopus-server.msi] action create
           * windows_package[Octopus Deploy Server] action install
           * powershell_script[create-instance-OctopusServer] action run (skipped due to not_if)
           * powershell_script[configure-server-OctopusServer] action run

             ================================================================================
             Error executing action `run` on resource 'powershell_script[configure-server-OctopusServer]'
             ================================================================================

             Mixlib::ShellOut::ShellCommandFailed
             ------------------------------------
             Expected process to exit with [0], but received '1'
             ---- Begin output of "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Windows/Temp/chef-script20170921-2604-15ivxwd.ps1" ----
             STDOUT:
             STDERR: ===============================================================================The server could not be contacted.

             System.DirectoryServices.AccountManagement.PrincipalServerDownException

         at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)

         at System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()

         at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container, ContextOptions options, String userName, String password)

         at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container)

         at Octopus.Server.Extensibility.Authentication.DirectoryServices.DirectoryServices.DirectoryServicesContextProvider.GetContext(String domain)

         at Octopus.Server.Extensibility.Authentication.DirectoryServices.DirectoryServices.UserMatcher.Match(String name, CancellationToken cancellationToken)

         at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()

         at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)

         at Octopus.Server.Commands.AdminCommand.Start()

         at Octopus.Shared.Startup.AbstractCommand.Start(String[] commandLineArguments, ICommandRuntime commandRuntime, OptionSet commonOptions)

         at Octopus.Shared.Startup.ConsoleHost.Run(Action`1 start, Action shutdown)

         at Octopus.Shared.Startup.OctopusProgram.Run()



             --Inner Exception--

             The LDAP server is unavailable.

             System.DirectoryServices.Protocols.LdapException

         at System.DirectoryServices.Protocols.LdapConnection.Connect()

         at System.DirectoryServices.Protocols.LdapConnection.SendRequestHelper(DirectoryRequest request, Int32& messageID)

         at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout)

         at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)

             -------------------------------------------------------------------------------

Polling tentacles need service restarted

Trying to deploy octopus in mass. I find polling tentacles are installed properly, however they always fail their health check until I manually restart the service.

This is strange because the configure tentacle resource notifies the windows service to restart with a :delayed timer, yet it looks like the restart happens before the register action happens.

Recipe: nd-octopus::tentacle
  * octopus_deploy_tentacle[Tentacle] action install
    * remote_file[C:\chef\cache/octopus-tentacle.msi] action create (up to date)
    * windows_package[Octopus Deploy Tentacle] action install (up to date)
     (up to date)
  * octopus_deploy_tentacle[Tentacle] action configure
    * windows_firewall_rule[Octopus Deploy Tentacle] action create (skipped due to only_if)
    * octopus_deploy_tentacle[Tentacle] action install
      * remote_file[C:\chef\cache/octopus-tentacle.msi] action create (up to date)
      * windows_package[Octopus Deploy Tentacle] action install (up to date)
       (up to date)
    * directory[C:\Octopus] action create (up to date)
    * powershell_script[generate-tentacle-cert] action run
      - execute "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/sowen/AppData/Local/Temp/2/chef-script20160817-2116-176koe7.ps1"
    * powershell_script[create-instance-Tentacle] action run
      - execute "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/sowen/AppData/Local/Temp/2/chef-script20160817-2116-1h1q6d6.ps1"
    * powershell_script[configure-tentacle-Tentacle] action run
      - execute "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/sowen/AppData/Local/Temp/2/chef-script20160817-2116-qnlanm.ps1"
    * windows_service[OctopusDeploy Tentacle] action enable (up to date)
    * windows_service[OctopusDeploy Tentacle] action start (up to date)
    * windows_service[OctopusDeploy Tentacle] action restart
      - restart service windows_service[OctopusDeploy Tentacle]

  * octopus_deploy_tentacle[Tentacle] action register
    * powershell_script[register-Tentacle-tentacle] action run
      - execute "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/sowen/AppData/Local/Temp/2/chef-script20160817-2116-1913boz.ps1"

Starting audit phase๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ

Cleanup use of fancy_bool method

The fancy_bool function is used in an awkward spot and is not named very appropriately. It should probably be called powershell_boolean since that is what its purpose is for.

generate cert fails the first time

I find that every time I try and use test kitchen to install a tentacle, I get this error

          * powershell_script[generate-tentacle-cert] action run

             ================================================================================
             Error executing action `run` on resource 'powershell_script[generate-tentacle-cert]'
             ================================================================================

             Mixlib::ShellOut::ShellCommandFailed
             ------------------------------------
             Expected process to exit with [0], but received '1'
             ---- Begin output of "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/ADMINI~1/AppData/Local/Temp/chef-script20160804-1440-10ljeji.ps1" ----
             STDOUT:
             STDERR: C:\Users\Administrator\AppData\Local\Temp\chef-script20160804-1440-10ljeji.ps1
             : ERROR: Command returned 100 Generating Cert for the machine
          + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorExcep
         tion
          + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio
         n,chef-script20160804-1440-10ljeji.ps1
             ---- End output of "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/ADMINI~1/AppData/Local/Temp/chef-script20160804-1440-10ljeji.ps1" ----
             Ran "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Users/ADMINI~1/AppData/Local/Temp/chef-script20160804-1440-10ljeji.ps1" returned 1

             Resource Declaration:
             ---------------------
             # In C:/Users/ADMINI~1/AppData/Local/Temp/kitchen/cache/cookbooks/octopus-deploy/providers/tentacle.rb

       83:   generate_cert = powershell_script 'generate-tentacle-cert' do
       84:     action :run
       85:     cwd tentacle_install_location
       86:     code <<-EOH
       87:       .\\Tentacle.exe new-certificate -e "#{cert_file}" --console
       88:       #{catch_powershell_error('Generating Cert for the machine')}
       89:     EOH
       90:     not_if { cert_file.nil? || ::File.exist?(cert_file) }
       91:   end
       92:

             Compiled Resource:
             ------------------
             # Declared in C:/Users/ADMINI~1/AppData/Local/Temp/kitchen/cache/cookbooks/octopus-deploy/providers/tentacle.rb:83:in `block in class_from_file'

             powershell_script("generate-tentacle-cert") do
        action [:run]
        retries 0
        retry_delay 2
        default_guard_interpreter :powershell_script
        command "generate-tentacle-cert"
        backup 5
        cwd "C:\\Program Files\\Octopus Deploy\\Tentacle"
        returns 0
        code "      .\\Tentacle.exe new-certificate -e \"c:\\Octopus\\tentacle_cert.txt\" --console\n      if ( ! $? ) { throw \"ERROR: Command returned $LastExitCode Generating Cert for the machine\" }\n"
        interpreter "powershell.exe"
        declared_type :powershell_script
        cookbook_name "nd-octopus"
        not_if { #code block }
             end

             Platform:
             ---------
             x64-mingw32

Questions:

  • Why Does it generate the certificate before creating the tentacle? Most of the documentation I find shows the opposite order
Tentacle.exe create-instance --instance "Tentacle" --config "C:\Octopus\Tentacle.config" --console
Tentacle.exe new-certificate --instance "Tentacle" --if-blank --console

http://docs.octopusdeploy.com/display/OD/Automating+Tentacle+installation

  • Why does the new cert generation not use --if-blank

    Tentacle.exe new-certificate --if-blank --console

  generate_cert = powershell_script 'generate-tentacle-cert' do
    action :run
    cwd tentacle_install_location
    code <<-EOH
      .\\Tentacle.exe new-certificate -e "#{cert_file}" --console
      #{catch_powershell_error('Generating Cert for the machine')}
    EOH
    not_if { cert_file.nil? || ::File.exist?(cert_file) }
  end

Register tentacle with the octopus server

From what I can tell, it appears that this cookbook does not automate the registering of the tentacle with the octopus server.

http://docs.octopusdeploy.com/display/OD/Automating+Tentacle+installation

"netsh" advfirewall firewall add rule "name=Octopus Deploy Tentacle" dir=in action=allow protocol=TCP localport=10933
Tentacle.exe register-with --instance "Tentacle" --server "http://YOUR_OCTOPUS" --apiKey="API-YOUR_API_KEY" --role "web-server" --environment "Staging" --comms-style TentaclePassive --console
Tentacle.exe service --instance "Tentacle" --install --start --console

Am I reading the documentation correctly? If so, how would you then register tentacles with the server? Do you use powershell?

Registration fails if octopus is uninstalled and reinstalled

If you uninstall the tentacle and delete the cert, then try and run chef, the installation/registration will fail with error: See this gist for full chef error

Octopus logs

2016-08-16 20:09:47.2058      7 FATAL  No certificate has been generated for this Tentacle. Please run the new-certificate command before starting.

The octopus logs are a bit misleading since the cert has been generated, it just wasn't imported because the cert was generated with the -e flag.

 -e, --export-file=VALUE    Exports a new certificate to the specified file
                               as unprotected base64 text, but does not save it
                               to the Tentacle configuration; for use with the
                               import-certificate command

Cause

There are multiple factors that create the code path that causes this problem

  • Uninstalling octopus tentacle does not remove the windows service (it still shows up in services.msc, but is disabled. Possibly a bug in octopus msi)
  • The cookbook has 2 resources that generate and register a cert. The registration gets skipped because the service still exists, triggering guard interpreter: not_if { ::Win32::Service.exists?(service_name) }

https://github.com/cvent/octopus-deploy-cookbook/blob/master/providers/tentacle.rb#L131

  • Because the generate cert command uses the -e option, the cert is only generated, not registered.

Work Around

Manually delete windows service before attempting to run chef

Possible Solutions

  • Combine cert generate & cert register into 1 resource
  • Change the guard interpreter to something other than ::Win32::Service.exists?(service_name)
  • Avoid using the -e option so the cert is automatically registered when generated (might require reordering resources so the tentacle is created before cert is generated)
  • Ignore this problem & document the steps to avoid this code path.

Add tools resource to install Octo.exe

I think it makes sense to include a resource to install Octo.exe tool to a configurable location on disk. It should just have an :install action for now which could be expanded to remove later.

Here is what needs to happen from a high level:

  • Download a version of the Octo tools zip file
  • Create a folder in a configurable location to put the tools
  • Unzip the tools into that location
  • Optionally add the folder to the path

Windows_package resource is deprecated

Don't use windows_package anymore since it is deprecated in favor of the built in package resource as of chef 12

    * octopus_deploy_tentacle[Tentacle] action install[2016-08-02T19:31:17+00:00] WARN: Please use the package resource available in Chef Client 12.6.
   windows_package will be removed in the next major version release
   of the Windows cookbook.

Octopus.Server.exe configure --webAuthenticationMode "Domain" is deprecated

The cookbook runs this command which will be deprecated in 4.x

.\Octopus.Server.exe configure --webAuthenticationMode "Domain"
--webAuthenticationMode has been deprecated and will be removed in Octopus 4.0. Please enable and configure the individu
al authentication providers you wish to use. See http://g.octopushq.com/AuthenticationProviders

Warn if octopus server is unavailable

Enhancement

Add a powershell_script resource that attempts to call the octopus server api.
If the octopus api is unavailable, log a warning and continue with the chef run.

  • only if api_key is defined
  • only if server is defined
  • only in :register resource, or any other resource where the api is used.

Document database assumptions for server

I'm a bit confused on how the database is set up. The readme shows that you can use create_database property to setup the database, but it assumes a database sever is already installed.

Looking at appvoyer and travis, I don't see how you are testing the octopus server. The connection string is

'Data Source=localhostdba;Initial Catalog=octo;Integrated Security=False;User ID=octo;Password=password'

Yet nowhere is sql installed. Are you using a golden image with sql express already installed? I can't get the server cookbook to converge without an actual database to point to.

Move to simpler 12.5+ style resources

The new resources in 12.5+ are great and before a 1.0.0 release we should move to this style. We can use compat resource to help solve backwards compatible issues but I believe a 1.0.0 release would make more sense to support 12.5+ only

Improve readme on limitations of database automation

The example I added to the readme for creating an octopus server has a major limitation: It will not grant db_owner rights to the SYSTEM account for the database

I've spent many many hours trying to automate this with powershell with no luck.

https://stackoverflow.com/questions/18468637/powershell-user-mapping-sql-server-2012

https://social.msdn.microsoft.com/Forums/en-US/1450a382-dec8-4a64-a8ff-53862cff8d10/unable-to-add-domain-user-as-sysadmin-in-sql-server-2012-using-powershell?forum=sqldatabaseengine

Warn users that this cookbook wont give you a 100% working octopus server.

Work around

Install sql server managment studio

chocolatey_package 'sql-server-management-studio' do
  action :install
end

Click 'Security'-> 'Logins' -> 'NT AUTHORITY\SYSTEM' -> 'properties'
Click "User Mappings' and grant db_owner rights to the OctopusDeploy database

Octopus.Server.exe configure --storageConnectionString deprecated

The octopus logs warn that this command will be deprecated in 4.0

WARN    'Octopus.Server.exe configure --storageConnectionString' has been deprecated and will be removed in Octopus 4.0. Please use the 'Octopus.Server.exe database --connectionString' command instead. 

Come up with a way to test the register resource for tentacles

Goals

The goals of this should be that the register functionality should be able to be tested in appveyor so that we can verify the service started up and that the tentacle registered successfully.

First thoughts

I think this can be achieved because appveyor has sql server installed on the machines already and we can configure our tests cases to create and setup our sql server instance and start up the server instance. Then we could write a custom powershell script to connect via basic auth and setup a simple test environment with roles and whatnot to verify that we can register a tentacle. There would be some sort of hacking to inject the generated auth key into the tentacle chef-client run, but having this path tested would be more powerful. THe appveyor build would go something like this:

  • Setup the machine with chefdk just like normal
  • Update the server test converge steps to connect to the local appveyor database
  • Run chef exec kitchen converge server (instead of just a global converge)
  • Run a script to mock and setup some data as well as write out some login information to disk so that we can read it into the tentacle to register
  • Run chef exec kitchen converge tentacle
  • Come up with another script to validate that the host is registered from the API.

I think this approach could work long term.

Argument Error with Chef 13.

ArgumentError

Cannot specify both default and name_property/name_attribute together on property path of resource octopus_deploy_tools

System Info:

chef_version=13.0.118
platform=windows
platform_version=6.3.9600
ruby=ruby 2.4.1p111 (2017-03-22 revision 58053) [x64-mingw32]
program_name=C:/opscode/chef/bin/chef-client
executable=C:/opscode/chef/bin/chef-client

Configure option on Tentacle always skipped due to not_if

Hi, looks like the tentacle configure option is always skipped due to the fact that the windows service is already created before this. Or am I doing something wrong here?
Love to fix this with another check not_if check if this is actually the case.

Regards,
Jeroen

Server configure action fails because of service restart

When configuring the octopus deploy server instance I am getting a timeout error because of the restart service command that happens immediately after configuration. BEcause we only support configuring a fresh service install this should be able to be removed.

Initial tentacle install is failing with error '100 Generating Cert for the machine'

Hi all, I am trying to provision some Windows 2012 servers but I can't get the Octopus Tentacle install step through.

If fails on the first Chef run with:

ERROR: Command returned
100 Generating Cert for the machine

Recipe
octopus_deploy_tentacle 'Tentacle' do
version node['octopus_server']['version']
trusted_cert node['tentacle']['trusted_cert']
configure_firewall true
action [:install, :configure]
end

Stack trace
Message=Failed Chef Client run eaba2e43-6477-49d4-b122-434cc56155c2 in 69.342504 seconds.
Exception type: Mixlib::ShellOut::ShellCommandFailed
Exception message: octopus_deploy_tentacle[Tentacle] (temp_octopus_deploy::tentacle line 19) had an error: Mixlib::ShellOut::ShellCommandFailed: powershell_script[generate-tentacle-cert-Tentacle] (C:/chef/cache/cookbooks/octopus-deploy/resources/tentacle.rb line 84) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Windows/Temp/chef-script20170629-3004-1c1mrwb.ps1" ----
STDOUT:
STDERR: C:\Windows\Temp\chef-script20170629-3004-1c1mrwb.ps1 : ERROR: Command returned
100 Generating Cert for the machine
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorExcep
tion
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio
n,chef-script20170629-3004-1c1mrwb.ps1
---- End output of "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Windows/Temp/chef-script20170629-3004-1c1mrwb.ps1" ----
Ran "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -InputFormat None -File "C:/Windows/Temp/chef-script20170629-3004-1c1mrwb.ps1" returned 1
Exception backtrace: C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/mixlib-shellout-2.2.7-universal-mingw32/lib/mixlib/shellout.rb:289:in invalid!' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/mixlib-shellout-2.2.7-universal-mingw32/lib/mixlib/shellout.rb:276:in error!'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/mixin/shell_out.rb:120:in shell_out!' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider/execute.rb:58:in block in action_run'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/mixin/why_run.rb:52:in add_action' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider.rb:202:in converge_by'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider/execute.rb:56:in action_run' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider/script.rb:64:in action_run'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider/windows_script.rb:57:in action_run' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider/powershell_script.rb:35:in action_run'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider.rb:171:in run_action' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource.rb:591:in run_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:69:in run_action' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:97:in block (2 levels) in converge'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:97:in each' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:97:in block in converge'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/resource_list.rb:94:in block in execute_each_resource' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:114:in call_iterator_block'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:85:in step' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:103:in iterate'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:55:in each_with_index' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/resource_list.rb:92:in execute_each_resource'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:96:in converge' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider.rb:212:in compile_and_converge_action'
(eval):2:in action_configure' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/provider.rb:171:in run_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource.rb:591:in run_action' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:69:in run_action'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:97:in block (2 levels) in converge' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:97:in each'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:97:in block in converge' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/resource_list.rb:94:in block in execute_each_resource'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:114:in call_iterator_block' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:85:in step'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:103:in iterate' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/stepable_iterator.rb:55:in each_with_index'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/resource_collection/resource_list.rb:92:in execute_each_resource' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/runner.rb:96:in converge'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/client.rb:715:in block in converge' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/client.rb:710:in catch'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/client.rb:710:in converge' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/client.rb:749:in converge_and_save'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/client.rb:286:in run' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application.rb:273:in run_with_graceful_exit_option'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application.rb:249:in block in run_chef_client' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/local_mode.rb:44:in with_server_connectivity'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application.rb:232:in run_chef_client' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application/client.rb:464:in sleep_then_run_chef_client'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application/client.rb:451:in block in interval_run_chef_client' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application/client.rb:450:in loop'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application/client.rb:450:in interval_run_chef_client' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application/client.rb:434:in run_application'
C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/lib/chef/application.rb:59:in run' C:/opscode/chef/embedded/lib/ruby/gems/2.4.0/gems/chef-13.0.118-universal-mingw32/bin/chef-client:26:in <top (required)>'
C:/opscode/chef/bin/chef-client:69:in load' C:/opscode/chef/bin/chef-client:69:in

'

The other change I needed to make was to fork the octopus-deploy cookbook to change the installer_url so that it can pick up the file locally. (Our servers don't have access to the internet)

Any pointers appreciated. I noticed #32 but I am not using TestKitchen and wish to avoid running anything manually on the server itself.

Update: This is using version 0.12.0 of the octopus-deploy cookbook.

Cheers,
Barry.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.