Назад | Перейти на главную страницу

Ansible не выполняет сборник воспроизведения для конкретного хоста в Vagrant multi-machine provisioning

При настройке с помощью ansible в Vagrant я не могу запустить сценарии для конкретного сервера / роли. Для всех хостов существует общий сценарий, и он работает, но при попытке настроить таргетинг на конкретную роль я что-то упускаю. Есть идеи, какой кусок отсутствует?

Доступный вывод:

Running Ansible playbook...

PLAY [all] ********************************************************************


GATHERING FACTS ***************************************************************

ok: [127.0.0.1]

TASK: [common | ensure apt-get is up to date] *********************************

ok: [127.0.0.1]

TASK: [common | ensure build-essential installed] *****************************

changed: [127.0.0.1]

TASK: [common | ensure git is installed] **************************************

changed: [127.0.0.1]

TASK: [common | ensure curl is installed] *************************************

changed: [127.0.0.1]

PLAY [zookeeper_servers] ******************************************************

skipping: no hosts matched

PLAY [kafka_servers] **********************************************************

skipping: no hosts matched

PLAY [storm_servers] **********************************************************

skipping: no hosts matched

PLAY RECAP ********************************************************************

127.0.0.1                  : ok=5    changed=3    unreachable=0    failed=0

Со следующей структурой каталогов:

- Vagrantfile
  - vagrant
    - playbook.yml
    - hosts
    - roles
      - common
        - tasks
          - main.yml
      - kafka_servers
        - tasks
          - main.yml
      - storm_servers
        - tasks
          - main.yml
      - zookeeper_servers
        - tasks
          - main.yml

# The main playbook

- hosts: all
  roles:
   - common

- hosts: zookeeper_servers
  roles:
  - { role: zookeeper_servers }

- hosts: kafka_servers
  roles:
  - { role: kafka_servers }

- hosts: storm_servers
  roles:
  - { role: storm_servers }

Файл hosts содержит

[zookeeper_servers]
zookeeper1 zoo_id=1

[storm_servers]
storm1

[kafka_servers]
kafka1

И файл Vagrant содержит

# -*- mode: ruby -*-
# vi: set ft=ruby :

CUSTOM_CONFIG = {
                  "BOX_NAME"  =>  "precise64",
                  "BOX_URL"   =>  "http://files.vagrantup.com/precise64.box",
                  "HEADLESS"  =>  false
                }

Vagrant.configure("2") do |config|
  config.vm.define "kafka" do |kafka|
    kafka.vm.box = CUSTOM_CONFIG['BOX_NAME']
  end

  config.vm.define "zookeeper" do |zookeeper|
    zookeeper.vm.box = CUSTOM_CONFIG['BOX_NAME']
  end

  config.vm.define "storm" do |storm|
    storm.vm.box = CUSTOM_CONFIG['BOX_NAME']
  end

  if (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM)
    # provisioning with ansible on windows
    config.vm.provision "shell", path: "./vagrant/ansible-windows.sh"
  else
    # provisioning with ansible
    config.vm.provision :ansible do |ansible|
      ansible.playbook = "./vagrant/playbook.yml"
      ansible.inventory_path = "./vagrant/roles"
    end
  end
end

Единственная проблема, которую я обнаружил, заключалась в том, что ansible.inventory_path был установлен в каталог и должен быть в файле hosts.

  ansible.inventory_path = "./vagrant/hosts"

вместо каталога, на который он указывал

  ansible.inventory_path = "./vagrant/roles"

Теперь я получаю инструкции для конкретных ролей, которые корректно работают на моем Mac. Со стороны окон пока неизвестно, как заставить работать.

Vagrant игнорирует ваш файл инвентаря, он создает его собственный (источник).

Вам необходимо указать группы в Vagrantfile:

ansible.groups = {
 "group1" => ["machine1"],
 "group2" => ["machine2", "machine3"],
 "all_groups:children" => ["group1", "group2", "group3"]
}