Как запустить ответную задачу на основе провайдера Vagrant - PullRequest
0 голосов
/ 19 декабря 2018

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

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

1 Ответ

0 голосов
/ 19 декабря 2018

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