如何 运行 基于 Vagrant 提供者的 ansible 任务

How to run ansible task based on the Vagrant provider

我有一份创建新虚拟机的临时工作。根据我传递给它的提供商,这可以在 Virtualbox 上本地创建,或者在带有 vagrant-vsphere 插件的 Vsphere 集群上创建。

因此,有时我想 运行 在 Virtualbox 上执行某些任务,在 Vsphere 上执行某些任务。我认为最简单的方法是根据提供者将变量从 Vagrant 传递到 ansible。粗略地说,这就是到目前为止我在 Vagrantfile 中的内容。

$ansible_provider = ''
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define vmconf[:name] do |vagrantconf|


      vagrantconf.vm.provider :virtualbox do |vb|
        $ansible_provider = "virtualbox"
      end

      vagrantconf.vm.provider :vsphere do |vb|
        $ansible_provider = "vsphere"
      end
  end  
  config.vm.provision :ansible do |ansible|    
    ansible.playbook = "provision.yml"
    ansible.extra_vars = { ansible_ssh_user: 'test',
                             ansible_provider:  $ansible_provider }
  end
end

我添加了一个打印语句,显示 extra_vars 和 ansible_ssh_user 两个工作正常,但 ansible_provider 只是空白。当我删除第一行并将其更改为局部变量时,出现以下错误: Message: undefined local variable or method 'ansible_provider'

我没怎么用过 ruby,所以我觉得我做错了什么。如有任何帮助,我们将不胜感激。

对于这个具体案例,我认为有一种更简单的方法可以实现您想要的。 Ansible 为它 运行 所针对的每个主机创建了一系列事实,其中包括为 guests.Try 收集虚拟化信息 在您的一个剧本中添加以下任务以了解我的意思:

- name: Display Virtualisation Type fact
  debug:
    var: ansible_virtualization_type

这应该意味着您不需要从 Vagrant 传递变量。如果您想查看所有事实,在包含您的 Vagrantfile 的目录中,只需 运行(您可以添加“-l 主机”以限制您的 VM 之一):

ansible -m setup all

为了回答您的具体问题,我认为这对您有用:

# In this case I don't believe you need the '$' prefix for your variables
ansible_provider = ''
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define vmconf[:name] do |vagrantconf|

      vagrantconf.vm.provider :virtualbox do |vb|
        ansible_provider = "virtualbox"
      end

      vagrantconf.vm.provider :vsphere do |vb|
        ansible_provider = "vsphere"
      end
  end  
  config.vm.provision :ansible do |ansible|    
    ansible.playbook = "provision.yml"
    ansible.extra_vars = { ansible_ssh_user: "test",
                           ansible_provider:  "#{ansible_provider}" }
  end
end