Merge pull request #2952 from gildegoma/ansible-ssh-fixes
provisioner/ansible: Support SSH-Forwarding and Multiple SSH Private Keys
This commit is contained in:
commit
ee4fd10b1f
|
@ -1,24 +1,43 @@
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module Ansible
|
module Ansible
|
||||||
class Provisioner < Vagrant.plugin("2", :provisioner)
|
class Provisioner < Vagrant.plugin("2", :provisioner)
|
||||||
def provision
|
|
||||||
@logger = Log4r::Logger.new("vagrant::provisioners::ansible")
|
|
||||||
ssh = @machine.ssh_info
|
|
||||||
|
|
||||||
# Connect with Vagrant user (unless --user or --private-key are
|
def initialize(machine, config)
|
||||||
# overidden by 'raw_arguments').
|
super
|
||||||
|
|
||||||
|
@logger = Log4r::Logger.new("vagrant::provisioners::ansible")
|
||||||
|
@ssh_info = @machine.ssh_info
|
||||||
|
end
|
||||||
|
|
||||||
|
def provision
|
||||||
|
|
||||||
#
|
#
|
||||||
# TODO: multiple private key support
|
# 1) Default Settings (lowest precedence)
|
||||||
options = %W[--private-key=#{ssh[:private_key_path][0]} --user=#{ssh[:username]}]
|
#
|
||||||
|
|
||||||
|
# Connect with Vagrant SSH identity
|
||||||
|
options = %W[--private-key=#{@ssh_info[:private_key_path][0]} --user=#{@ssh_info[:username]}]
|
||||||
|
|
||||||
|
# Multiple SSH keys and/or SSH forwarding can be passed via
|
||||||
|
# ANSIBLE_SSH_ARGS environment variable, which requires 'ssh' mode.
|
||||||
|
# Note that multiple keys and ssh-forwarding settings are not supported
|
||||||
|
# by deprecated 'paramiko' mode.
|
||||||
|
options << "--connection=ssh" unless ansible_ssh_args.empty?
|
||||||
|
|
||||||
# By default we limit by the current machine.
|
# By default we limit by the current machine.
|
||||||
# This can be overridden by the limit config option.
|
# This can be overridden by the limit config option.
|
||||||
options << "--limit=#{@machine.name}"
|
options << "--limit=#{@machine.name}"
|
||||||
|
|
||||||
# Joker! Not (yet) supported arguments can be passed this way.
|
#
|
||||||
|
# 2) Configuration Joker
|
||||||
|
#
|
||||||
|
|
||||||
options.concat(self.as_array(config.raw_arguments)) if config.raw_arguments
|
options.concat(self.as_array(config.raw_arguments)) if config.raw_arguments
|
||||||
|
|
||||||
# Append Provisioner options (highest precedence):
|
#
|
||||||
|
# 3) Append Provisioner options (highest precedence):
|
||||||
|
#
|
||||||
|
|
||||||
options << "--inventory-file=#{self.setup_inventory_file}"
|
options << "--inventory-file=#{self.setup_inventory_file}"
|
||||||
options << "--extra-vars=#{self.get_extra_vars_argument}" if config.extra_vars
|
options << "--extra-vars=#{self.get_extra_vars_argument}" if config.extra_vars
|
||||||
options << "--sudo" if config.sudo
|
options << "--sudo" if config.sudo
|
||||||
|
@ -33,15 +52,21 @@ module VagrantPlugins
|
||||||
# Assemble the full ansible-playbook command
|
# Assemble the full ansible-playbook command
|
||||||
command = (%w(ansible-playbook) << options << config.playbook).flatten
|
command = (%w(ansible-playbook) << options << config.playbook).flatten
|
||||||
|
|
||||||
|
# Some Ansible options must be passed as environment variables
|
||||||
|
env = {
|
||||||
|
"ANSIBLE_FORCE_COLOR" => "true",
|
||||||
|
"ANSIBLE_HOST_KEY_CHECKING" => "#{config.host_key_checking}",
|
||||||
|
|
||||||
|
# Ensure Ansible output isn't buffered so that we receive ouput
|
||||||
|
# on a task-by-task basis.
|
||||||
|
"PYTHONUNBUFFERED" => 1
|
||||||
|
}
|
||||||
|
# Support Multiple SSH keys and SSH forwarding:
|
||||||
|
env["ANSIBLE_SSH_ARGS"] = ansible_ssh_args unless ansible_ssh_args.empty?
|
||||||
|
|
||||||
# Write stdout and stderr data, since it's the regular Ansible output
|
# Write stdout and stderr data, since it's the regular Ansible output
|
||||||
command << {
|
command << {
|
||||||
:env => {
|
:env => env,
|
||||||
"ANSIBLE_FORCE_COLOR" => "true",
|
|
||||||
"ANSIBLE_HOST_KEY_CHECKING" => "#{config.host_key_checking}",
|
|
||||||
# Ensure Ansible output isn't buffered so that we receive ouput
|
|
||||||
# on a task-by-task basis.
|
|
||||||
"PYTHONUNBUFFERED" => 1
|
|
||||||
},
|
|
||||||
:notify => [:stdout, :stderr],
|
:notify => [:stdout, :stderr],
|
||||||
:workdir => @machine.env.root_path.to_s
|
:workdir => @machine.env.root_path.to_s
|
||||||
}
|
}
|
||||||
|
@ -149,6 +174,24 @@ module VagrantPlugins
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ansible_ssh_args
|
||||||
|
@ansible_ssh_args ||= get_ansible_ssh_args
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_ansible_ssh_args
|
||||||
|
ssh_options = []
|
||||||
|
|
||||||
|
# Multiple Private Keys
|
||||||
|
@ssh_info[:private_key_path].drop(1).each do |key|
|
||||||
|
ssh_options << "-o IdentityFile=#{key}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# SSH Forwarding
|
||||||
|
ssh_options << "-o ForwardAgent=yes" if @ssh_info[:forward_agent]
|
||||||
|
|
||||||
|
ssh_options.join(' ')
|
||||||
|
end
|
||||||
|
|
||||||
def as_list_argument(v)
|
def as_list_argument(v)
|
||||||
v.kind_of?(Array) ? v.join(',') : v
|
v.kind_of?(Array) ? v.join(',') : v
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue