class NodeSpec::Provisioning::Ansible

Constants

AUTO_DISCOVERY_HOST_TEMPLATE
CUSTOM_CONFIG_FILENAME
CUSTOM_INVENTORY_FILENAME

Public Class Methods

new(node) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 18
def initialize(node)
  @node = node
  @sudo_enabled = true
  @cmd_prefix_entries = []
  @tmp_files = []
end

Public Instance Methods

ansible_config(text) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 29
def ansible_config(text)
  file = create_temp_file(CUSTOM_CONFIG_FILENAME, text)
  @cmd_prefix_entries << "ANSIBLE_CONFIG=#{file.path.shellescape}"
end
ansible_module(module_name, module_arguments, options = []) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 59
def ansible_module(module_name, module_arguments, options = [])
  build_and_run("ansible #{@node.name} -m #{module_name} -a #{module_arguments.shellescape}", options)
end
ansible_playbook(playbook_path, options = []) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 55
def ansible_playbook(playbook_path, options = [])
  build_and_run("ansible-playbook #{playbook_path.shellescape} -l #{@node.name}", options)
end
enable_host_auto_discovery(group = nil) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 34
def enable_host_auto_discovery(group = nil)
  file = create_temp_file(CUSTOM_INVENTORY_FILENAME, ERB.new(AUTO_DISCOVERY_HOST_TEMPLATE).result(binding))
  @hostfile_option = "-i #{file.path.shellescape}"
end
run_as_sudo(enabled = true) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 47
def run_as_sudo(enabled = true)
  @sudo_enabled = enabled
end
set_config_path(path) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 25
def set_config_path(path)
  @cmd_prefix_entries << "ANSIBLE_CONFIG=#{path.shellescape}"
end
set_extra_vars(vars = {}) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 51
def set_extra_vars(vars = {})
  @extra_vars_option = "-e '#{JSON.generate(vars)}'"
end
set_host_key_checking(enabled) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 43
def set_host_key_checking(enabled)
  @cmd_prefix_entries << "ANSIBLE_HOST_KEY_CHECKING=#{enabled.to_s.capitalize}"
end
set_hostfile_path(path) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 39
def set_hostfile_path(path)
  @hostfile_option = "-i #{path.shellescape}"
end

Private Instance Methods

build_and_run(cmd, options = []) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 65
def build_and_run(cmd, options = [])
  ssh_session = @node.communicator.session
  key_option = ssh_session.options[:keys].is_a?(Array) ? ssh_session.options[:keys].join(',') : ssh_session.options[:keys]
  cmd = [
    (@cmd_prefix_entries.join(' ') unless @cmd_prefix_entries.empty?),
    cmd,
    @hostfile_option,
    "-u #{ssh_session.options[:user]}",
    "--private-key=#{key_option.shellescape}",
    sudo_option(ssh_session.options[:user]),
    "#{options.join(' ')}",
    @extra_vars_option
    ].compact.join(' ')

  run_command(cmd)
  @tmp_files.each(&:close!)
end
create_temp_file(filename, content) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 87
def create_temp_file(filename, content)
  Tempfile.new(filename).tap do |f|
    f.write(content)
    f.flush
    @tmp_files << f
  end
end
sudo_option(user) click to toggle source
# File lib/nodespec/provisioning/ansible.rb, line 83
def sudo_option(user)
  '--sudo' if user != 'root' and @sudo_enabled
end