如何 运行 基于 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
我有一份创建新虚拟机的临时工作。根据我传递给它的提供商,这可以在 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