class Kitchen::Provisioner::AnsiblePlaybook

Ansible Playbook provisioner.

Attributes

tmp_dir[RW]

Public Class Methods

new(provisioner_config) click to toggle source
Calls superclass method
# File lib/kitchen/provisioner/ansible_playbook.rb, line 43
def initialize(provisioner_config)
  config = Kitchen::Provisioner::Ansible::Config.new(provisioner_config)
  super(config)

  @os = Kitchen::Provisioner::Ansible::Os.make(ansible_platform, config)
end

Public Instance Methods

_run(cmd, idempotence = false) click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 415
def _run(cmd, idempotence = false)
  [
    cmd,
    ansible_inventory_flag,
    ansible_limit_flag,
    ansible_connection_flag,
    "-M #{File.join(config[:root_path], 'modules')}",
    ansible_verbose_flag,
    ansible_check_flag,
    ansible_diff_flag,
    ansible_vault_flag,
    private_key,
    extra_vars,
    extra_vars_file,
    tags(idempotence),
    ansible_extra_flags,
    playbook_remote_path
  ].join(' ')
end
ansible_command(script) click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 458
def ansible_command(script)
  if config[:ansible_sudo].nil? || config[:ansible_sudo] == true
    s = https_proxy ? "https_proxy=#{https_proxy}" : nil
    p = http_proxy ? "http_proxy=#{http_proxy}" : nil
    n = no_proxy ? "no_proxy=#{no_proxy}" : nil
    p || s || n ? " #{p} #{s} #{n} #{config[:sudo_command]} -s #{cd_ansible} #{script}" : "#{config[:sudo_command]} -s #{cd_ansible} #{script}"
  else
    return script
  end
end
ansible_galacy_collection_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 482
def ansible_galacy_collection_command
  cmd = [
    'ansible-galaxy', 'collection', 'install', '--force',
    '-p', File.join(config[:root_path], 'collections'),
    '-r', File.join(config[:root_path], galaxy_requirements_collections)
  ].join(' ')
  cmd = "https_proxy=#{https_proxy} #{cmd}" if https_proxy
  cmd = "http_proxy=#{http_proxy} #{cmd}" if http_proxy
  cmd = "no_proxy=#{no_proxy} #{cmd}" if no_proxy
  cmd
end
ansible_galaxy_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 469
def ansible_galaxy_command
  cmd = [
      'ansible-galaxy', 'install', '--force',
      galaxy_cert_ignore,
      '-p', File.join(config[:root_path], 'roles'),
      '-r', File.join(config[:root_path], galaxy_requirements)
  ].join(' ')
  cmd = "https_proxy=#{https_proxy} #{cmd}" if https_proxy
  cmd = "http_proxy=#{http_proxy} #{cmd}" if http_proxy
  cmd = "no_proxy=#{no_proxy} #{cmd}" if no_proxy
  cmd
end
cd_ansible() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 494
def cd_ansible
 # this is not working so just return nil for now
 # File.exist?('ansible.cfg') ? "cd #{config[:root_path]};" : nil
 nil
end
cleanup_sandbox() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 303
def cleanup_sandbox
  return if sandbox_path.nil?
  debug("Cleaning up local sandbox in #{sandbox_path}")
  FileUtils.rmtree(sandbox_path)
end
create_sandbox() { || ... } click to toggle source
Calls superclass method
# File lib/kitchen/provisioner/ansible_playbook.rb, line 277
def create_sandbox
  super
  debug("Creating local sandbox in #{sandbox_path}")

  yield if block_given?

  prepare_playbook
  prepare_inventory
  prepare_modules
  prepare_roles
  prepare_ansible_cfg
  prepare_group_vars
  prepare_additional_copy_path
  prepare_host_vars
  prepare_hosts
  prepare_spec
  prepare_library_plugins
  prepare_callback_plugins
  prepare_filter_plugins
  prepare_lookup_plugins
  prepare_ansible_vault_password_file
  prepare_kerberos_conf_file
  prepare_additional_ssh_private_keys
  info('Finished Preparing files for transfer')
end
custom_post_install_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 262
      def custom_post_install_command
        <<-INSTALL
          #{config[:custom_post_install_command]}
        INSTALL
      end
custom_pre_install_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 255
      def custom_pre_install_command
        <<-INSTALL

          #{config[:custom_pre_install_command]}
        INSTALL
      end
detect_debug() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 121
def detect_debug
  if ARGV.include? 'debug' or config[:show_command_output]
    result = "/dev/stdout"
  else
    result = "/dev/null"
  end
  return result
end
finalize_config!(instance) click to toggle source
Calls superclass method
# File lib/kitchen/provisioner/ansible_playbook.rb, line 50
def finalize_config!(instance)
  config.instance = instance
  super(instance)
end
init_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 268
def init_command
  dirs = %w(modules roles group_vars host_vars collections)
         .map { |dir| File.join(config[:root_path], dir) }.join(' ')
  cmd = "#{sudo_env('rm')} -rf #{dirs};"
  cmd += " mkdir -p #{config[:root_path]}"
  debug(cmd)
  cmd
end
install_busser_prereqs() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 154
      def install_busser_prereqs
        install = ''
        install << <<-INSTALL
          #{Util.shell_helpers}
          # Fix for https://github.com/test-kitchen/busser/issues/12
          if [ -h /usr/bin/ruby ]; then
              L=$(readlink -f /usr/bin/ruby)
              #{sudo_env('rm')} /usr/bin/ruby
              #{sudo_env('ln')} -s $L /usr/bin/ruby
          fi
          INSTALL

        if require_ruby_for_busser
          install << <<-INSTALL
            if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
            if [ -z `grep -q 'Amazon Linux' /etc/system-release` ]; then
            rhelversion6=$(cat /etc/redhat-release | grep 'release 6')
            rhelversion7=$(cat /etc/redhat-release | grep 'release 7')
            # For CentOS6/CentOS7/RHEL6/RHEL7 install ruby from SCL
            if [ -n "$rhelversion6" ] || [ -n "$rhelversion7" ]; then
            if [ ! -d "/opt/rh/ruby200" ]; then
              echo "-----> Installing ruby200 SCL in CentOS6/CentOS7/RHEL6/RHEL7 to install busser to run tests"
              #{sudo_env('yum')} install -y centos-release-scl > #{detect_debug}
              #{sudo_env('yum')} install -y ruby200 > #{detect_debug}
              #{sudo_env('yum')} install -y ruby200-ruby-devel > #{detect_debug}
              echo "-----> Enabling ruby200"
              source /opt/rh/ruby200/enable
              echo "/opt/rh/ruby200/root/usr/lib64" | sudo tee -a /etc/ld.so.conf
              #{sudo_env('ldconfig')}
              #{sudo_env('ln')} -sf /opt/rh/ruby200/root/usr/bin/ruby /usr/bin/ruby
              #{sudo_env('ln')} -sf /opt/rh/ruby200/root/usr/bin/gem /usr/bin/gem
            fi
            else
              if [ ! $(which ruby) ]; then
                #{update_packages_redhat_cmd} > #{detect_debug}
                #{sudo_env('yum')} -y install ruby ruby-devel > #{detect_debug}
              fi
            fi
            else
                #{update_packages_redhat_cmd} > #{detect_debug}
                #{sudo_env('yum')} -y install ruby ruby-devel gcc > #{detect_debug}
            fi
            elif [ -f /etc/SuSE-release ]  || [ -f /etc/SUSE-brand ]; then
                #{update_packages_suse_cmd} > #{detect_debug}
                #{sudo_env('zypper')} --non-interactive install ruby ruby-devel ca-certificates ca-certificates-cacert ca-certificates-mozilla > #{detect_debug}
                #{sudo_env('gem')} sources --add https://rubygems.org/
            elif [ -f /etc/alpine-release ]  || [ -d /etc/apk ]; then
                #{update_packages_alpine_cmd}
                #{sudo_env('apk')} add ruby ruby-dev ruby-io-console ca-certificates > #{detect_debug}
            else
              if [ ! $(which ruby) ]; then
                #{update_packages_debian_cmd}
                # default package selection for Debian/Ubuntu machines
                PACKAGES="ruby1.9.1 ruby1.9.1-dev"
                if [ "$(lsb_release -si)" = "Debian" ]; then
                  debvers=$(sed 's/\\..*//' /etc/debian_version)
                  if [ $debvers -ge 8 ]; then
                    # this is jessie or better, where ruby1.9.1 is
                    # no longer in the repositories
                    PACKAGES="ruby ruby-dev ruby2.1 ruby2.1-dev"
                  fi
                fi
                if [ "$(lsb_release -si)" = "Ubuntu" ]; then
                  ubuntuvers=$(lsb_release -sr | tr -d .)
                  if [ $ubuntuvers -ge 1410 ]; then
                    # Default ruby is 2.x in utopic and newer
                    PACKAGES="ruby ruby-dev"
                  fi
                fi
                #{sudo_env('apt-get')} -y install $PACKAGES > #{detect_debug}
                if [ $debvers -eq 6 ]; then
                    # in squeeze we need to update alternatives
                    # for enable ruby1.9.1
                    ALTERNATIVES_STRING="--install /usr/bin/ruby ruby /usr/bin/ruby1.9.1 10 --slave /usr/share/man/man1/ruby.1.gz ruby.1.gz /usr/share/man/man1/ruby1.9.1.1.gz --slave /usr/bin/erb erb /usr/bin/erb1.9.1 --slave /usr/bin/gem gem /usr/bin/gem1.9.1 --slave /usr/bin/irb irb /usr/bin/irb1.9.1 --slave /usr/bin/rake rake /usr/bin/rake1.9.1 --slave /usr/bin/rdoc rdoc /usr/bin/rdoc1.9.1 --slave /usr/bin/testrb testrb /usr/bin/testrb1.9.1 --slave /usr/share/man/man1/erb.1.gz erb.1.gz /usr/share/man/man1/erb1.9.1.1.gz --slave /usr/share/man/man1/gem.1.gz gem.1.gz /usr/share/man/man1/gem1.9.1.1.gz --slave /usr/share/man/man1/irb.1.gz irb.1.gz /usr/share/man/man1/irb1.9.1.1.gz --slave /usr/share/man/man1/rake.1.gz rake.1.gz /usr/share/man/man1/rake1.9.1.1.gz --slave /usr/share/man/man1/rdoc.1.gz rdoc.1.gz /usr/share/man/man1/rdoc1.9.1.1.gz --slave /usr/share/man/man1/testrb.1.gz testrb.1.gz /usr/share/man/man1/testrb1.9.1.1.gz"
                    #{sudo_env('update-alternatives')} $ALTERNATIVES_STRING
                    # need to update gem tool because gem 1.3.7 from ruby 1.9.1 is broken
                    #{sudo_env('gem')} install rubygems-update > #{detect_debug}
                    #{sudo_env('/var/lib/gems/1.9.1/bin/update_rubygems')}
                    # clear local gem cache
                    #{sudo_env('rm')} -r /home/vagrant/.gem
                fi
              fi
           fi
           INSTALL

        elsif require_chef_for_busser && chef_url
          install << <<-INSTALL
            # install chef omnibus so that busser works as this is needed to run tests :(
            if [ ! -d "/opt/chef" ]
            then
              echo "-----> Installing Chef Omnibus to install busser to run tests"
              #{export_http_proxy}
              do_download #{chef_url} /tmp/install.sh
              #{sudo_env('sh')} /tmp/install.sh > #{detect_debug}
            fi
            INSTALL
        end

        install
      end
install_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 69
      def install_command
        if config[:require_ansible_omnibus]
          cmd = install_omnibus_command
        elsif config[:require_ansible_source]
          info('Installing ansible from source')
          cmd = install_ansible_from_source_command
        elsif config[:require_pip]
          info('Installing ansible through pip')
          cmd = install_ansible_from_pip_command
        elsif config[:require_pip3]
          info('Installing ansible through pip3')
          cmd = install_ansible_from_pip3_command
        elsif config[:require_ansible_repo]
          if !@os.nil?
            info("Installing ansible on #{@os.name}")
            cmd =  @os.install_command
          else
            info('Installing ansible, will try to determine platform os')
            cmd = <<-INSTALL

            if [ ! $(which ansible) ]; then
              if [ -f /etc/fedora-release ]; then
                #{Kitchen::Provisioner::Ansible::Os::Fedora.new('fedora', config).install_command}
              elif [ -f /etc/system-release ] && `grep -q 'Amazon Linux' /etc/system-release`; then
                #{Kitchen::Provisioner::Ansible::Os::Amazon.new('amazon', config).install_command}
              elif [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
                #{Kitchen::Provisioner::Ansible::Os::Redhat.new('redhat', config).install_command}
              elif [ -f /etc/SuSE-release ] || [ -f /etc/SUSE-brand ]; then
                #{Kitchen::Provisioner::Ansible::Os::Suse.new('suse', config).install_command}
              elif [[ "$OSTYPE" == "darwin"* ]]; then
                #{Kitchen::Provisioner::Ansible::Os::Darwin.new('darwin', config).install_command}
              elif [ -f /etc/alpine-release ] || [ -d /etc/apk ]; then
                #{Kitchen::Provisioner::Ansible::Os::Alpine.new('alpine', config).install_command}
              elif [ $(uname -s) = "OpenBSD" ]; then
                #{Kitchen::Provisioner::Ansible::Os::Openbsd.new('openbsd', config).install_command}
              elif [ $(uname -s) = "FreeBSD" ]; then
                #{Kitchen::Provisioner::Ansible::Os::Freebsd.new('freebsd', config).install_command}
              else
                #{Kitchen::Provisioner::Ansible::Os::Debian.new('debian', config).install_command}
              fi
            fi
            INSTALL
          end
        else
          return
        end

        result = custom_pre_install_command + cmd + install_windows_support + install_busser_prereqs + custom_post_install_command
        debug("Going to install ansible with: #{result}")
        result
      end
install_windows_support() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 130
      def install_windows_support
        install = ''
        if require_windows_support
            info ("Installing Windows Support")
            info ("Installing pip")
            install << <<-INSTALL
              if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
                #{sudo_env('yum')} -y install python-devel krb5-devel krb5-libs krb5-workstation gcc > #{detect_debug}
              else
                if [ -f /etc/SuSE-release ]  || [ -f /etc/SUSE-brand ]; then
                  #{sudo_env('zypper')} ar #{python_sles_repo} > #{detect_debug}
                  #{sudo_env('zypper')} --non-interactive install python python-devel krb5-client pam_krb5 > #{detect_debug}
                else
                  #{sudo_env('apt-get')} -y install python-dev libkrb5-dev build-essential > #{detect_debug}
                fi
              fi
            #{export_http_proxy}
            #{sudo_env('easy_install')} pip > #{detect_debug}
            #{sudo_env('pip')} install pywinrm kerberos > #{detect_debug}
            INSTALL
        end
        install
      end
prepare_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 309
def prepare_command
  commands = []

  commands << [
    "if [ $(uname -s) = 'FreeBSD' ]; then ETC_ANSIBLE='/usr/local/etc/ansible'; else ETC_ANSIBLE='/etc/ansible'; fi"
  ]
  # Prevent failure when ansible package installation doesn't contain /etc/ansible
  commands << [
    sudo_env("#{config[:shell_command]} -c \"[ -d $ETC_ANSIBLE ] || mkdir $ETC_ANSIBLE\"")
  ]

  commands << [
    sudo_env('cp'), File.join(config[:root_path], 'ansible.cfg'), '$ETC_ANSIBLE/.'
  ].join(' ')

  commands << [
    sudo_env('cp -r'), File.join(config[:root_path], 'group_vars'), '$ETC_ANSIBLE/.'
  ].join(' ')

  commands << [
    sudo_env('cp -r'), File.join(config[:root_path], 'host_vars'), '$ETC_ANSIBLE/.'
  ].join(' ')

  if config[:ssh_known_hosts]
    config[:ssh_known_hosts].each do |host|
      info("Add #{host} to ~/.ssh/known_hosts")
      if host.include? ':'
        stripped_host, port = host.split(':')
        commands << "ssh-keyscan -p #{port} #{stripped_host} >> ~/.ssh/known_hosts 2> /dev/null"
      else
        commands << "ssh-keyscan #{host} >> ~/.ssh/known_hosts 2> /dev/null"
      end
    end
  end

  if config[:additional_ssh_private_keys]
    commands << [
      sudo_env('cp -r'), File.join(config[:root_path], 'ssh_private_keys'), '~/.ssh'
    ].join(' ')
  end

  if ansible_inventory
    if File.directory?(ansible_inventory)
      Dir.foreach(ansible_inventory) do |f|
        next if File.directory?("#{ansible_inventory}/#{f}")
        contents = File.open("#{ansible_inventory}/#{f}", 'rb') { |g| g.read }
        if contents.start_with?('#!')
          commands << [
            sudo_env('chmod +x'), File.join("#{config[:root_path]}/#{File.basename(ansible_inventory)}", File.basename(f))
          ].join(' ')
        end
      end
    else
      contents = File.open(ansible_inventory, 'rb') { |f| f.read }
      if contents.start_with?('#!')
        commands << [
          sudo_env('chmod +x'), File.join(config[:root_path], File.basename(ansible_inventory))
        ].join(' ')
      end
    end
  end

  if galaxy_requirements
    if config[:require_ansible_source]
      commands << setup_ansible_env_from_source
    end
    commands << ansible_galaxy_command
  end

  if galaxy_requirements_collections
    commands << ansible_galacy_collection_command
  end

  if kerberos_conf_file
    commands << [
      sudo_env('cp -f'), File.join(config[:root_path], 'krb5.conf'), '/etc'
    ].join(' ')
  end

  command = commands.join(' && ')
  debug("*** COMMAND TO RUN:")
  debug(command)
  command
end
run_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 394
      def run_command
        return config[:ansible_playbook_command] unless config[:ansible_playbook_command].nil?
        if config[:require_ansible_source] && !config[:ansible_binary_path]
          # this is an ugly hack to get around the fact that extra vars uses ' and "
          cmd = ansible_command("PATH=#{config[:root_path]}/ansible/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games PYTHONPATH=#{config[:root_path]}/ansible/lib MANPATH=#{config[:root_path]}/ansible/docs/man ansible-playbook")
        elsif config[:ansible_binary_path]
          cmd = ansible_command("#{config[:ansible_binary_path]}/ansible-playbook")
        else
          cmd = ansible_command('ansible-playbook')
        end

        cmd = "#{env_vars} #{cmd}" if !config[:env_vars].none?
        cmd = "HTTPS_PROXY=#{https_proxy} #{cmd}" if https_proxy
        cmd = "HTTP_PROXY=#{http_proxy} #{cmd}" if http_proxy
        cmd = "NO_PROXY=#{no_proxy} #{cmd}" if no_proxy
        cmd = "ANSIBLE_ROLES_PATH=#{ansible_roles_path} #{cmd}" if ansible_roles_path
        cmd = "ANSIBLE_HOST_KEY_CHECKING=false #{cmd}" if !ansible_host_key_checking

        cmd = "#{cd_ansible} #{cmd}" if !config[:ansible_sudo].nil? && !config[:ansible_sudo]
        cmd = "#{copy_private_key_cmd} #{cmd}" if config[:private_key]

        def _run(cmd, idempotence = false)
          [
            cmd,
            ansible_inventory_flag,
            ansible_limit_flag,
            ansible_connection_flag,
            "-M #{File.join(config[:root_path], 'modules')}",
            ansible_verbose_flag,
            ansible_check_flag,
            ansible_diff_flag,
            ansible_vault_flag,
            private_key,
            extra_vars,
            extra_vars_file,
            tags(idempotence),
            ansible_extra_flags,
            playbook_remote_path
          ].join(' ')
        end
        result = _run(cmd)
        if config[:idempotency_test]
          idempotency_result = _run(cmd, true)
          result = "#{result} && (echo 'Going to invoke ansible-playbook second time:'; #{idempotency_result} | tee /tmp/idempotency_test.txt; if grep -qE 'changed=[1-9].*failed=|changed=.*failed=[1-9]' /tmp/idempotency_test.txt; then echo 'Idempotence test: FAIL' && exit 1; else echo 'Idempotence test: PASS' && exit 0; fi)"
        end
        if config[:custom_post_play_command]
          custom_post_play_trap = <<-TRAP
            function custom_post_play_command {
              #{config[:custom_post_play_command]}
            }
            trap custom_post_play_command EXIT
          TRAP
        end
        result = <<-RUN
          #{config[:custom_pre_play_command]}
          #{custom_post_play_trap}
          #{result}
        RUN

        debug("Going to invoke ansible-playbook with: #{result}")
        result

      end
verbosity_level(level = 1) click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 55
def verbosity_level(level = 1)
  level = level.to_sym if level.is_a? String
  log_levels = { info: 1, warn: 2, debug: 3, trace: 4 }
  if level.is_a?(Symbol) && log_levels.include?(level)
    # puts "Log Level is: #{log_levels[level]}"
    log_levels[level]
  elsif level.is_a?(Integer) && level > 0
    # puts "Log Level is: #{level}"
    level
  else
    fail 'Invalid ansible_verbosity setting.  Valid values are: 1, 2, 3, 4 OR :info, :warn, :debug, :trace'
  end
end

Protected Instance Methods

additional_copy() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 734
def additional_copy
  config[:additional_copy_path]
end
additional_files() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1158
def additional_files
  additional_files = []
  if  additional_copy
    additional_files = additional_copy.is_a?(Array) ? additional_copy : [additional_copy]
  end
  additional_files.map(&:to_s)
end
ansible_cfg_path() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 738
def ansible_cfg_path
  config[:ansible_cfg_path]
end
ansible_check_flag() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 797
def ansible_check_flag
  config[:ansible_check] ? '--check' : nil
end
ansible_connection_flag() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 789
def ansible_connection_flag
  "-c #{config[:ansible_connection]}" if config[:ansible_connection] != 'none'
end
ansible_debian_version() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 781
def ansible_debian_version
  if @config[:ansible_version] == 'latest' || @config[:ansible_version] == nil
    ''
  else
    "=#{@config[:ansible_version]}"
  end
end
ansible_diff_flag() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 801
def ansible_diff_flag
  config[:ansible_diff] ? '--diff' : nil
end
ansible_extra_flags() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 827
def ansible_extra_flags
  config[:ansible_extra_flags] || ''
end
ansible_host_key_checking() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 835
def ansible_host_key_checking
  config[:ansible_host_key_checking]
end
ansible_inventory() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 774
def ansible_inventory
  return nil if config[:ansible_inventory] == 'none'
  config[:ansible_inventory] = config[:ansible_inventory_file] if config[:ansible_inventory].nil?
  info('ansible_inventory_file parameter deprecated use ansible_inventory') if config[:ansible_inventory_file]
  config[:ansible_inventory]
end
ansible_inventory_flag() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 818
def ansible_inventory_flag
  return nil if config[:ansible_inventory] == 'none'
  ansible_inventory ? "-i #{File.join(config[:root_path], File.basename(ansible_inventory))}" : "-i #{File.join(config[:root_path], 'hosts')}"
end
ansible_limit_flag() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 823
def ansible_limit_flag
  config[:ansible_limit] ? "-l #{config[:ansible_limit]}" : ""
end
ansible_platform() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 831
def ansible_platform
  config[:ansible_platform].to_s.downcase
end
ansible_roles_path() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 986
def ansible_roles_path
  roles_paths = []
  roles_paths << File.join(config[:root_path], 'roles') unless config[:roles_path].nil?
  if config[:additional_copy_role_path]
    if config[:additional_copy_role_path].is_a? String
      roles_paths << File.join(config[:root_path], 'roles', File.basename(config[:additional_copy_role_path]))
    else
      config[:additional_copy_role_path].each do |path|
        roles_paths << File.join(config[:root_path], 'roles', File.basename(File.expand_path(path)))
      end
    end
  end
  if roles_paths.empty?
    info('No roles have been set.')
    nil
  else
    debug("Setting roles_path inside VM to #{ roles_paths.join(':') }")
    roles_paths.join(':')
  end
end
ansible_vault_flag() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 805
def ansible_vault_flag
  debug(config[:ansible_vault_password_file])
  return nil if not ansible_vault_password_file

  files = []

  ansible_vault_password_file.each do |f|
    files << "--vault-password-file=#{File.join(config[:root_path], File.basename(f).reverse.chomp('.').reverse)}"
  end

  files.join(' ')
end
ansible_vault_password_file() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 766
def ansible_vault_password_file
  password_files = []
  if config[:ansible_vault_password_file]
    password_files = config[:ansible_vault_password_file].is_a?(Array) ? config[:ansible_vault_password_file] : [config[:ansible_vault_password_file]]
  end
  password_files.map(&:to_s)
end
ansible_verbose_flag() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 793
def ansible_verbose_flag
  config[:ansible_verbose] ? '-' << ('v' * verbosity_level(config[:ansible_verbosity])) : nil
end
ansiblefile() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 678
def ansiblefile
  config[:ansiblefile_path] || ''
end
callback_plugins() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 754
def callback_plugins
  config[:callback_plugins_path].to_s
end
chef_url() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 930
def chef_url
  config[:chef_bootstrap_url]
end
copy_private_key_cmd() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 845
def copy_private_key_cmd
  if !config[:private_key].start_with?('/') && !config[:private_key].start_with?('~')
    ssh_private_key = File.join('~/.ssh', File.basename(config[:private_key]))
    tmp_private_key = File.join(config[:root_path], config[:private_key])
    "rm -rf #{ssh_private_key}; cp #{tmp_private_key} #{ssh_private_key}; chmod 400 #{ssh_private_key};"
  end
end
env_vars() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 690
def env_vars
  return nil if config[:env_vars].none?
  config[:env_vars].map { |k, v| "#{k}=#{v}" }.join(' ')
end
export_http_proxy() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 977
def export_http_proxy
  cmd = ''
  cmd = " HTTP_PROXY=#{http_proxy}" if http_proxy
  cmd = "#{cmd} HTTPS_PROXY=#{https_proxy}" if https_proxy
  cmd = "#{cmd} NO_PROXY=#{no_proxy}" if no_proxy
  cmd = "export #{cmd}" if cmd != ''
  cmd
end
extra_vars() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 881
def extra_vars
  bash_vars = config[:extra_vars]
  if config.key?(:attributes) && config[:attributes].key?(:extra_vars) && config[:attributes][:extra_vars].is_a?(Hash)
    bash_vars = config[:attributes][:extra_vars]
  end

  return nil if bash_vars.none?
  bash_vars = JSON.dump(bash_vars)
  bash_vars = "-e '#{bash_vars}'"
  debug(bash_vars)
  bash_vars
end
extra_vars_file() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 894
def extra_vars_file
  return nil if config[:extra_vars_file].nil?
  bash_extra_vars = ''
  if config[:extra_vars_file].is_a?(String)
    bash_extra_vars = "-e '\@#{config[:extra_vars_file]}'"
  elsif config[:extra_vars_file].is_a?(Array)
    config[:extra_vars_file].each { |x|
      info("Adding -e '\@#{x}'")
      bash_extra_vars += " -e '\@#{x}'"
    }
  end

  debug(bash_extra_vars)
  bash_extra_vars
end
filter_plugins() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 758
def filter_plugins
  config[:filter_plugins_path].to_s
end
galaxy_cert_ignore() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1300
def galaxy_cert_ignore
  config[:galaxy_ignore_certs] ? '--ignore-certs' : nil
end
galaxy_requirements() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 682
def galaxy_requirements
  config[:requirements_path] || nil
end
galaxy_requirements_collections() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 686
def galaxy_requirements_collections
  config[:requirements_collection_path] || nil
end
group_vars() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 730
def group_vars
  config[:group_vars_path].to_s
end
host_vars() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 746
def host_vars
  config[:host_vars_path].to_s
end
hosts() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 704
def hosts
  config[:hosts]
end
http_proxy() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 954
def http_proxy
  config[:http_proxy]
end
https_proxy() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 958
def https_proxy
  config[:https_proxy]
end
install_ansible_from_pip3_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 572
      def install_ansible_from_pip3_command
              if config[:ansible_version]=='latest' or config[:ansible_version].nil?
                ansible_version = ''
              else
                ansible_version = "==#{config[:ansible_version]}"
              end
                <<-INSTALL
                  if [ ! $(which ansible) ]; then
                    if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
                      #{Kitchen::Provisioner::Ansible::Os::Redhat.new('redhat', config).install_epel_repo}
                      #{update_packages_redhat_cmd} > #{detect_debug}
                      #{sudo_env('yum')} -y install python3-libselinux python3-devel python3-pip git libffi-devel openssl-devel gcc > #{detect_debug}
                    else
                      if [ -f /etc/SUSE-brand ] || [ -f /etc/SuSE-release ]; then
                        #{sudo_env('zypper')} ar #{python_sles_repo} > #{detect_debug}
                        #{update_packages_suse_cmd} > #{detect_debug}
                        #{sudo_env('zypper')} --non-interactive install python3 python3-pip  python3-setuptools python-devel git python-six libyaml-devel libffi-devel libopenssl-devel > #{detect_debug}
                      else
                        #{update_packages_debian_cmd} > #{detect_debug}
                        #{sudo_env('apt-get')} -y install git python3 python3-pip python3-setuptools build-essential python3-dev libffi-dev libssl-dev > #{detect_debug}
                      fi
                    fi

                  #{export_http_proxy}
                  #{sudo_env('python3')} -m pip install --upgrade pip > #{detect_debug}
                  #{sudo_env('pip3')} install -U setuptools > #{detect_debug}
                  #{sudo_env('pip3')} install ansible#{ansible_version} > #{detect_debug}
                fi
                INSTALL
      end
install_ansible_from_pip_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 536
      def install_ansible_from_pip_command
        if config[:ansible_version]=='latest' or config[:ansible_version].nil?
          ansible_version = ''
        else
          ansible_version = "==#{config[:ansible_version]}"
        end
          <<-INSTALL
            if [ ! $(which ansible) ]; then
              if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
                EL_RELEASE=$(rpm -E %{rhel})
                if [ "${EL_RELEASE}" -ge 8 ]; then
                  echo "*** Redhat/Centos 8 does not support pip2 with kitchen-ansible ***"
                fi
                #{Kitchen::Provisioner::Ansible::Os::Redhat.new('redhat', config).install_epel_repo}
                #{update_packages_redhat_cmd} > #{detect_debug}
                #{sudo_env('yum')} -y install libselinux-python python2-devel git python-setuptools libffi-devel openssl-devel gcc > #{detect_debug}
              else
                if [ -f /etc/SUSE-brand ] || [ -f /etc/SuSE-release ]; then
                  #{sudo_env('zypper')} ar #{python_sles_repo} > #{detect_debug}
                  #{update_packages_suse_cmd} > #{detect_debug}
                  #{sudo_env('zypper')} --non-interactive install python python-devel git python-setuptools python-pip python-six libyaml-devel libffi-devel libopenssl-devel > #{detect_debug}
                else
                  #{update_packages_debian_cmd} > #{detect_debug}
                  #{sudo_env('apt-get')} -y install git python python-pip python-setuptools build-essential python-dev libffi-dev libssl-dev > #{detect_debug}
                fi
              fi

            #{export_http_proxy}
            #{sudo_env('curl')} 'https://bootstrap.pypa.io/pip/2.7/get-pip.py' -o 'get-pip.py' > #{detect_debug}
            #{sudo_env('python')} 'get-pip.py' > #{detect_debug}
            #{sudo_env('pip')} install -U setuptools > #{detect_debug}
            #{sudo_env('pip')} install ansible#{ansible_version} > #{detect_debug}
          fi
          INSTALL
      end
install_ansible_from_source_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 509
      def install_ansible_from_source_command
          <<-INSTALL
          if [ ! -d #{config[:root_path]}/ansible ]; then
            if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
              #{Kitchen::Provisioner::Ansible::Os::Redhat.new('redhat', config).install_epel_repo}
              #{update_packages_redhat_cmd} > #{detect_debug}
              #{sudo_env('yum')} -y install libselinux-python python2-devel git python-setuptools python-setuptools-dev libffi-devel libssl-devel > #{detect_debug}
            else
              if [ -f /etc/SUSE-brand ] || [ -f /etc/SuSE-release ]; then
                #{sudo_env('zypper')} ar #{python_sles_repo} > #{detect_debug}
                #{update_packages_suse_cmd} > #{detect_debug}
                #{sudo_env('zypper')} --non-interactive install python python-devel git python-setuptools python-pip python-six libyaml-devel libffi-devel libopenssl-devel > #{detect_debug}
              else
                #{update_packages_debian_cmd} > #{detect_debug}
                #{sudo_env('apt-get')} -y install git python python-setuptools build-essential python-dev libffi-dev libssl-dev > #{detect_debug}
              fi
            fi

            #{export_http_proxy}
            git clone #{config[:ansible_source_url]} --recursive #{config[:root_path]}/ansible #{install_source_rev}
            #{sudo_env('easy_install')} pip > #{detect_debug}
            #{sudo_env('pip')} install -U setuptools > #{detect_debug}
            #{sudo_env('pip')} install six paramiko PyYAML Jinja2 httplib2 > #{detect_debug}
          fi
          INSTALL
      end
install_omnibus_command() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 603
      def install_omnibus_command
        info('Installing ansible using ansible omnibus')

        version = ''
        version = "-v #{config[:ansible_version]}" unless config[:ansible_version].nil?

        <<-INSTALL
        #{Util.shell_helpers}

        if [ ! -d "#{config[:ansible_omnibus_remote_path]}" ]; then
          echo "-----> Installing Ansible Omnibus"
          #{export_http_proxy}
          do_download #{config[:ansible_omnibus_url]} /tmp/ansible_install.sh
          #{sudo_env(config[:shell_command])} /tmp/ansible_install.sh #{version} > #{detect_debug}
        fi
        INSTALL
      end
install_source_rev() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 950
def install_source_rev
  config[:ansible_source_rev] ? "--branch #{config[:ansible_source_rev]}" : nil
end
kerberos_conf_file() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 946
def kerberos_conf_file
  config[:kerberos_conf_file]
end
library_plugins() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 750
def library_plugins
  config[:library_plugins_path].to_s
end
load_needed_dependencies!() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 502
def load_needed_dependencies!
  return unless File.exist?(ansiblefile)

  debug("Ansiblefile found at #{ansiblefile}, loading Librarian-Ansible")
  Ansible::Librarian.load!(logger)
end
lookup_plugins() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 762
def lookup_plugins
  config[:lookup_plugins_path].to_s
end
modules() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 722
def modules
  config[:modules_path]
end
no_proxy() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 962
def no_proxy
  config[:no_proxy]
end
playbook() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 695
def playbook
  config[:playbook]
end
playbook_remote_path() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 699
def playbook_remote_path
  return File.join(config[:root_path], config[:playbook]).to_s if config[:keep_playbook_path]
  File.join(config[:root_path], File.basename(config[:playbook])).to_s
end
prepare_additional_copy_path() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1128
def prepare_additional_copy_path
  info('Preparing additional_copy_path')
  additional_files.each do |file|
     info("Copy additional path: #{file}")
     destination = File.join(sandbox_path, File.basename(File.expand_path(file)))
     if File.directory?(File.expand_path(file)) && File.basename(File.expand_path(file))!= ?.
       debug("Copy dir: #{File.expand_path(file)} #{destination}")
       FileUtils.cp_r(File.expand_path(file), destination)
     else
       debug("Copy file: #{file} #{destination}")
       FileUtils.cp(file, destination)
     end
  end
  recursive_additional_files.each do |file|
    info("Copy recursive additional path: #{file}")
    Find.find(file) do |files|
      destination = File.join(sandbox_path, files)
      Find.prune if config[:ignore_paths_from_root].include? File.basename(files)
      Find.prune if "?.".include? File.basename(files)
      Find.prune if config[:ignore_extensions_from_root].include? File.extname(files)
      debug File.basename(files)
      if File.directory?(files)
        FileUtils.mkdir_p(destination)
      else
        FileUtils.cp(files, destination)
      end
    end
  end
end
prepare_additional_ssh_private_keys() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1261
def prepare_additional_ssh_private_keys
  info('Preparing additional_ssh_private_keys')
  FileUtils.mkdir_p(tmp_additional_ssh_private_keys_dir)
  if config[:additional_ssh_private_keys]
    config[:additional_ssh_private_keys].each do |key|
      debug("Adding additional_ssh_private_key file #{key}")
      FileUtils.cp_r(File.expand_path(key), tmp_additional_ssh_private_keys_dir, remove_destination: true)
    end
  else
    info 'nothing to do for additional_ssh_private_keys'
  end
end
prepare_ansible_cfg() click to toggle source

copy ansible.cfg if found and ansible_cfg_overwrite is set to true

# File lib/kitchen/provisioner/ansible_playbook.rb, line 1055
def prepare_ansible_cfg
  info('Preparing ansible.cfg file')
  ansible_config_file = "#{File.join(sandbox_path, 'ansible.cfg')}"
  if !ansible_cfg_path.nil? && File.exist?(ansible_cfg_path) && !config[:ignore_ansible_cfg]
    info('Found existing ansible.cfg')
    FileUtils.cp_r(ansible_cfg_path, ansible_config_file)
  elsif config[:ansible_cfg_overwrite]
    info('Empty ansible.cfg generated')
    File.open(ansible_config_file, 'wb') do |file|
      file.write("#no config parameters\n")
    end
  end
end
prepare_ansible_vault_password_file() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1274
def prepare_ansible_vault_password_file
  return unless ansible_vault_password_file

  info('Preparing ansible vault password')
  ansible_vault_password_file.each do |f|
    debug("Copying ansible vault password file from #{f} to #{tmp_ansible_vault_password_file_path(f)}")

    FileUtils.cp(File.expand_path(f), tmp_ansible_vault_password_file_path(f))
  end
end
prepare_callback_plugins() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1225
def prepare_callback_plugins
  info('Preparing callback plugins')
  FileUtils.mkdir_p(tmp_callback_plugins_dir)

  if callback_plugins && File.directory?(callback_plugins)
    debug("Using callback plugins from #{callback_plugins}")
    FileUtils.cp_r(Dir.glob("#{callback_plugins}/{*,!*.pyc}"), tmp_callback_plugins_dir, remove_destination: true)
  else
    info 'nothing to do for callback plugins'
  end
end
prepare_filter_plugins() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1237
def prepare_filter_plugins
  info('Preparing filter_plugins')
  FileUtils.mkdir_p(tmp_filter_plugins_dir)

  if filter_plugins && File.directory?(filter_plugins)
    debug("Using filter_plugins from #{filter_plugins}")
    FileUtils.cp_r(Dir.glob("#{filter_plugins}/*.py"), tmp_filter_plugins_dir, remove_destination: true)
  else
    info 'nothing to do for filter_plugins'
  end
end
prepare_group_vars() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1114
def prepare_group_vars
  info('Preparing group_vars')
  tmp_group_vars_dir = File.join(sandbox_path, 'group_vars')
  FileUtils.mkdir_p(tmp_group_vars_dir)

  unless File.directory?(group_vars)
    info('nothing to do for group_vars')
    return
  end

  debug("Using group_vars from #{group_vars}")
  FileUtils.cp_r(Dir.glob("#{group_vars}/*"), tmp_group_vars_dir)
end
prepare_host_vars() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1174
def prepare_host_vars
  info('Preparing host_vars')
  FileUtils.mkdir_p(tmp_host_vars_dir)

  unless File.directory?(host_vars)
    info 'nothing to do for host_vars'
    return
  end

  debug("Using host_vars from #{host_vars}")
  FileUtils.cp_r(Dir.glob("#{host_vars}/*"), tmp_host_vars_dir)
end
prepare_hosts() click to toggle source

localhost ansible_connection=local

example_servers

localhost

# File lib/kitchen/provisioner/ansible_playbook.rb, line 1084
def prepare_hosts
  return if ansible_inventory
  info('Preparing hosts file')

  if config[:hosts].nil?
    fail 'No hosts have been set. Please specify one in .kitchen.yml'
  elsif config[:hosts].is_a?(Array)
    debug("Using an array of hosts from #{hosts}")
    File.open(File.join(sandbox_path, 'hosts'), 'wb') do |file|
      hoststring="localhost ansible_connection=local\n"
      config[:hosts].each do |h|
        hoststring+="[#{h}]\nlocalhost\n\n"
      end
      file.write(hoststring)
    end
  else
    debug("Using host from #{hosts}")
    File.open(File.join(sandbox_path, 'hosts'), 'wb') do |file|
      file.write("localhost ansible_connection=local\n[#{hosts}]\nlocalhost\n")
    end
  end
end
prepare_inventory() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1069
def prepare_inventory
  info('Preparing inventory')
  return unless ansible_inventory
  if File.directory?(ansible_inventory)
    debug("Copying inventory directory from #{ansible_inventory} to #{tmp_inventory_path}")
    FileUtils.cp_r(ansible_inventory, sandbox_path)
  else
    debug("Copying inventory file from #{ansible_inventory} to #{tmp_inventory_path}")
    FileUtils.cp_r(ansible_inventory, tmp_inventory_path)
  end
end
prepare_kerberos_conf_file() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1285
def prepare_kerberos_conf_file
  return unless kerberos_conf_file

  info('Preparing kerberos configuration file')
  debug("Copying kerberos configuration file from #{kerberos_conf_file} to #{tmp_kerberos_conf_file_path}")

  FileUtils.cp(File.expand_path(kerberos_conf_file), tmp_kerberos_conf_file_path)
end
prepare_library_plugins() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1213
def prepare_library_plugins
  info('Preparing library plugins')
  FileUtils.mkdir_p(tmp_library_plugins_dir)

  if library_plugins && File.directory?(library_plugins)
    debug("Using library plugins from #{library_plugins}")
    FileUtils.cp_r(Dir.glob("#{library_plugins}/{*,!*.pyc}"), tmp_library_plugins_dir, remove_destination: true)
  else
    info 'nothing to do for library plugins'
  end
end
prepare_lookup_plugins() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1249
def prepare_lookup_plugins
  info('Preparing lookup_plugins')
  FileUtils.mkdir_p(tmp_lookup_plugins_dir)

  if lookup_plugins && File.directory?(lookup_plugins)
    debug("Using lookup_plugins from #{lookup_plugins}")
    FileUtils.cp_r(Dir.glob("#{lookup_plugins}/*.py"), tmp_lookup_plugins_dir, remove_destination: true)
  else
    info 'nothing to do for lookup_plugins'
  end
end
prepare_modules() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1187
def prepare_modules
  info('Preparing modules')

  FileUtils.mkdir_p(tmp_modules_dir)

  if modules && File.directory?(modules)
    debug("Using modules from #{modules}")
    FileUtils.cp_r(Dir.glob("#{modules}/*"), tmp_modules_dir, remove_destination: true)
  else
    info 'nothing to do for modules'
  end
end
prepare_playbook() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1107
def prepare_playbook
  info('Preparing playbook')
  debug("Copying playbook from #{playbook} to #{tmp_playbook_path}")
  FileUtils.mkdir_p(File.dirname(tmp_playbook_path)) if config[:keep_playbook_path]
  FileUtils.cp_r(playbook, tmp_playbook_path)
end
prepare_roles() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1007
def prepare_roles
  info('Preparing roles')
  debug("Using roles from #{File.expand_path(roles)}")

  resolve_with_librarian if File.exist?(ansiblefile)

  if galaxy_requirements
    dest = File.join(sandbox_path, galaxy_requirements)
    FileUtils.mkdir_p(File.dirname(dest))
    FileUtils.cp(File.expand_path(galaxy_requirements), dest)
  end

  if config[:additional_copy_role_path]
    if config[:additional_copy_role_path].is_a? String
      debug("Using additional roles copy from #{File.expand_path(config[:additional_copy_role_path])}")
      dest = File.join(sandbox_path, 'roles', File.basename(File.expand_path(config[:additional_copy_role_path])))
      FileUtils.mkdir_p(File.dirname(dest))
      FileUtils.cp_r(File.expand_path(config[:additional_copy_role_path]), dest)
    else
      config[:additional_copy_role_path].each do |path|
        dest = File.join(sandbox_path, 'roles', File.basename(File.expand_path(path)))
        FileUtils.mkdir_p(File.dirname(dest))
        FileUtils.cp_r(File.expand_path(path), dest)
      end
    end
  end

  FileUtils.mkdir_p(File.join(tmp_roles_dir, role_name))
  Find.find(roles) do |source|
    # Detect whether we are running tests on a role
    # If so, make sure to copy into VM so dir structure is like: /tmp/kitchen/roles/role_name
    role_path = source.sub(/#{roles}|\/roles/, '')
    unless roles =~ /\/roles$/
      role_path = "#{role_name}/#{role_path}"
    end
    target = File.join(tmp_roles_dir, role_path)

    Find.prune if config[:ignore_paths_from_root].include? File.basename(source)
    Find.prune if config[:ignore_extensions_from_root].include? File.extname(source)
    if File.directory?(source)
      FileUtils.mkdir_p(target)
    else
      FileUtils.cp(source, target)
    end
  end
end
prepare_spec() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1200
def prepare_spec
  info('Preparing spec')

  FileUtils.mkdir_p(tmp_spec_dir)

  if spec && File.directory?(spec)
    debug("Using spec from #{spec}")
    FileUtils.cp_r(Dir.glob("#{spec}/*"), tmp_spec_dir, remove_destination: true)
  else
    info 'nothing to do for spec'
  end
end
private_key() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 839
def private_key
  if config[:private_key]
    "--private-key #{private_key_file}"
  end
end
private_key_file() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 853
def private_key_file
  if config[:private_key].start_with?('/') || config[:private_key].start_with?('~')
    "#{config[:private_key]}"
  elsif config[:private_key]
    "#{File.join('~/.ssh', File.basename(config[:private_key]))}"
  end
end
python_sles_repo() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 877
def python_sles_repo
  config[:python_sles_repo]
end
recursive_additional_copy() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 742
def recursive_additional_copy
  config[:recursive_additional_copy_path]
end
recursive_additional_files() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1166
def recursive_additional_files
  recursive_additional_files = []
  if  recursive_additional_copy
    recursive_additional_files = recursive_additional_copy.is_a?(Array) ? recursive_additional_copy : [recursive_additional_copy]
  end
  recursive_additional_files.map(&:to_s)
end
require_chef_for_busser() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 938
def require_chef_for_busser
  config[:require_chef_for_busser]
end
require_ruby_for_busser() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 934
def require_ruby_for_busser
  config[:require_ruby_for_busser]
end
require_windows_support() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 942
def require_windows_support
  config[:require_windows_support]
end
resolve_with_librarian() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 1294
def resolve_with_librarian
  Kitchen.mutex.synchronize do
    Ansible::Librarian.new(ansiblefile, tmp_roles_dir, logger).resolve
  end
end
role_name() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 712
def role_name
  if config[:role_name]
    config[:role_name]
  elsif File.basename(roles) == 'roles'
    ''
  else
    File.basename(roles)
  end
end
roles() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 708
def roles
  config[:roles_path]
end
setup_ansible_env_from_source() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 621
def setup_ansible_env_from_source
  "cd #{config[:root_path]}/ansible && source hacking/env-setup && cd ../"
end
spec() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 726
def spec
  'spec'
end
sudo_env(pm,home=false) click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 966
def sudo_env(pm,home=false)
  s = https_proxy ? "https_proxy=#{https_proxy}" : nil
  p = http_proxy ? "http_proxy=#{http_proxy}" : nil
  n = no_proxy ? "no_proxy=#{no_proxy}" : nil
  if home
    p || s || n ? "#{sudo_home('env')} #{p} #{s} #{n} #{pm}" : "#{sudo_home(pm)}"
  else
    p || s || n ? "#{sudo('env')} #{p} #{s} #{n} #{pm}" : "#{sudo(pm)}"
  end
end
tags(idempotence = false) click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 910
def tags(idempotence = false)
  bash_tags = config.key?(:attributes) && config[:attributes].key?(:tags) && config[:attributes][:tags].is_a?(Array) ? config[:attributes][:tags] : config[:tags]
  bash_skip_tags = []
  if idempotence and config[:idempotency_test]
    bash_tags += config[:idempotency_tags]
    bash_skip_tags += config[:idempotency_skip_tags]
  end
  return nil if (bash_tags.empty? and bash_skip_tags.empty?)

  result = ''
  if not bash_tags.empty?
    result += " --tags=#{bash_tags.join(',')}"
  end
  if not bash_skip_tags.empty?
    result += " --skip-tags=#{bash_skip_tags.join(',')}"
  end
  debug(result)
  result
end
tmp_additional_ssh_private_keys_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 662
def tmp_additional_ssh_private_keys_dir
  File.join(sandbox_path, 'ssh_private_keys')
end
tmp_ansible_vault_password_file_path(f) click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 666
def tmp_ansible_vault_password_file_path(f)
  File.join(sandbox_path, File.basename(f).reverse.chomp('.').reverse)
end
tmp_callback_plugins_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 650
def tmp_callback_plugins_dir
  File.join(sandbox_path, 'callback_plugins')
end
tmp_filter_plugins_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 654
def tmp_filter_plugins_dir
  File.join(sandbox_path, 'filter_plugins')
end
tmp_host_vars_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 634
def tmp_host_vars_dir
  File.join(sandbox_path, 'host_vars')
end
tmp_inventory_path() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 674
def tmp_inventory_path
  File.join(sandbox_path, File.basename(ansible_inventory))
end
tmp_kerberos_conf_file_path() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 670
def tmp_kerberos_conf_file_path
  File.join(sandbox_path, 'krb5.conf')
end
tmp_library_plugins_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 646
def tmp_library_plugins_dir
  File.join(sandbox_path, 'library')
end
tmp_lookup_plugins_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 658
def tmp_lookup_plugins_dir
  File.join(sandbox_path, 'lookup_plugins')
end
tmp_modules_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 625
def tmp_modules_dir
  File.join(sandbox_path, 'modules')
end
tmp_playbook_path() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 629
def tmp_playbook_path
  return File.join(sandbox_path, playbook).to_s if config[:keep_playbook_path]
  File.join(sandbox_path, File.basename(playbook)).to_s
end
tmp_roles_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 638
def tmp_roles_dir
  File.join(sandbox_path, 'roles')
end
tmp_spec_dir() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 642
def tmp_spec_dir
  File.join(sandbox_path, 'spec')
end
update_packages_alpine_cmd() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 873
def update_packages_alpine_cmd
  Kitchen::Provisioner::Ansible::Os::Alpine.new('alpine', config).update_packages_command
end
update_packages_debian_cmd() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 861
def update_packages_debian_cmd
  Kitchen::Provisioner::Ansible::Os::Debian.new('debian', config).update_packages_command
end
update_packages_redhat_cmd() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 869
def update_packages_redhat_cmd
  Kitchen::Provisioner::Ansible::Os::Redhat.new('redhat', config).update_packages_command
end
update_packages_suse_cmd() click to toggle source
# File lib/kitchen/provisioner/ansible_playbook.rb, line 865
def update_packages_suse_cmd
  Kitchen::Provisioner::Ansible::Os::Suse.new('suse', config).update_packages_command
end