如何基于Vagrant提供程序运行ansible任务

时间:2018-12-18 22:37:44

标签: ruby ansible vagrant vagrantfile

我的工作很忙,无法创建新的VM。根据我传递给它的提供程序,它可以在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'

我还没有用完所有的红宝石,所以我觉得在那里做错了什么。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

对于这种特定情况,我认为有一种更轻松的方法来实现您想要的。 Ansible会为它遇到的每个主机创建一系列事实,包括收集来宾的虚拟化信息。尝试在您的一本剧本中添加以下任务,以了解我的意思:

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

这意味着您不需要从Vagrant中传入变量。如果要查看所有事实,请在包含Vagrantfile的目录中运行(可以添加“ -l host”以限制为其中一个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