4

When provisioning with ansible in Vagrant, I am unable to get server/role specific playbooks to run. There is a common playbook run for all hosts, and that is working, but when trying to target a specific role, I'm missing something. Any ideas what piece is missing?

The ansible output is:

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

With the following directory structure:

- 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 }

The hosts file contains

[zookeeper_servers]
zookeeper1 zoo_id=1

[storm_servers]
storm1

[kafka_servers]
kafka1

And the Vagrant file contains

# -*- 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

2 Answers 2

2

Vagrant ignores your inventory file, it creates it's own (source).

You need to specify groups in Vagrantfile:

ansible.groups = {
 "group1" => ["machine1"],
 "group2" => ["machine2", "machine3"],
 "all_groups:children" => ["group1", "group2", "group3"]
}
1
  • Thanks for taking a look. I don't think it says that Vagrant ignores your inventory. It gives the groups config hash as 1 option, then goes on to "The second option is for situations where you'd like to have more control over the inventory management..." where it indicates it will use your inventory file.
    – RyanW
    Apr 1, 2014 at 21:49
2

The one issue I found was that the ansible.inventory_path was set to a directory and needed to be to the hosts file

  ansible.inventory_path = "./vagrant/hosts"

instead of the directory it was pointing to

  ansible.inventory_path = "./vagrant/roles"

Now, I am getting the role specific playbooks to run properly on my mac. The windows side is still unknown how to make it work.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .