Ansible not executing host specific playbook in Vagrant multi-machine provisioning

8,942

Solution 1

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.

Solution 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"]
}
Share:
8,942

Related videos on Youtube

RyanW
Author by

RyanW

Updated on September 18, 2022

Comments

  • RyanW
    RyanW over 1 year

    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