Как запустить доступную задачу на основе провайдера Vagrant

У меня бродячая работа по созданию новых виртуальных машин. В зависимости от провайдера, которого я передаю, это может быть создано локально в Virtualbox или в кластере Vsphere с помощью плагина vagrant-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'

Я не так часто использовал рубин, поэтому решил, что что-то делаю не так. Любая помощь с этим будет принята с благодарностью.


person RoboCD    schedule 18.12.2018    source источник


Ответы (1)


Для этого конкретного случая, я думаю, есть более простой способ добиться того, чего вы хотите. Ansible создает серию фактов для каждого хоста, с которым он работает, включая сбор информации о виртуализации для гостей. Попробуйте добавить следующую задачу в один из своих сценариев, чтобы понять, что я имею в виду:

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

Это должно означать, что вам не нужно передавать переменную из Vagrant. Если вы хотите увидеть все факты, в каталоге, содержащем ваш Vagrantfile, просто запустите (вы можете добавить '-l host', чтобы ограничить одну из ваших виртуальных машин):

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
person clockworknet    schedule 18.12.2018
comment
Большое спасибо, первое решение работает и именно то, что мне нужно! По какой-то причине я все еще не мог передать переменную в ansible, но в любом случае использование ansible_virtualization_type - гораздо более чистое решение моей проблемы. - person RoboCD; 19.12.2018