我的工作很忙,无法创建新的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'
我还没有用完所有的红宝石,所以我觉得在那里做错了什么。任何帮助,将不胜感激。
答案 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