Using an inventory for Ansible

Using an inventory for Ansible

About this lab

The purpose of this lab is to show the use of an inventory for Ansible to build a multi-host playbook.

vTeam Specialization Program

Pure Storage nominated me recently to join the Pure Storage vTeam Specialization program for New Stack. The idea behind the program is, to create an active community within Pure Storage. Allowing Puritans to learn and develop their skills and grow into a subject matter experts.

The program consists of training and lab exercises that are focussed on developing experience in the New Stack space (Kubernetes, Ansible, Open Stack and more).

Since I think there are more people out there how want to learn more about New Stack, I will blog my progress in a series of lab exercises.

Lab instructions

Name:Multi-Host Provisioning
Description:Create a playbook to provision across multiple hosts
Objective:Be able to provision storage for multiple hosts using a single playbook
Task #1:Ensure Ansible remote communication to all hosts is configured
Task #2:Create an inventory file
Task #3:Create a playbook that uses the inventory
Task #4:Install the purestorage python SDK on all hosts
Task #5:
Success Criteria:The python SDK is installed on all targeted hosts
Lab goals and tasks

For this lab I’ll be using a control host and some Ubuntu Linux host I’ve created in an earlier lab. Read about that lab here.

Create our Ansible inventory

To be able to run an Ansible playbook against multiple target hosts, we need to start by creating an inventory file. The inventory will allow us to target the hosts in the inventory and execute Ansible modules against them. Here you can read more on how to create an inventory. For now I’ll just keep it sweet and short, showing what I’ve created below:

all:
  hosts:
    node1:
      ansible_host: 192.168.10.121
      ansible_user: dnix
    node2:
      ansible_host: 192.168.10.122
      ansible_user: dnix
    node3:
      ansible_host: 192.168.10.123
      ansible_user: dnix
  children:
    flasharray:
      hosts:
        node1:
        node2:
    flashblade:
      hosts:
        node2:
        node3:

Lines 2 – 11 we specify a list of all the hosts we use. For each host we specify the IP address and the user to connect with. This way I do not depend on DNS for the resolution of the hostname.

I’ve also specified the ansible_user. This is only necessary if the user that runs the playbook is different from the user that need to be used for the target hosts.

Next, I specified two groups on lines 13 – 20, in the children section called flasharray and flashblade. Each group only contains two out of the three hosts. As a result, we can now use these groups in our Playbooks to target only a subset of our hosts for specific tasks.

Ansible playbook using inventory

To use our Inventory in Ansible, we will use the following, quite simple, playbook. It contains to plays, as shown below, the first of which installed the purestorage SDK on hosts that are in the flasharray group and the second installs the purity-fb SDK on hosts in the flashblade group.

- name: Install FlashArray SDK
  hosts: flasharray
  gather_facts: true
  tasks:
    - name: Install purestorage SDK
      pip:
        name: purestorage
- name: Install FlashBlade SDK
  hosts: flashblade
  gather_facts: true
  tasks:
    - name: Install purity-fb SDK
      pip:
        name: purity-fb

With the hosts: parameter we specify which hosts to target. In our earlier playbooks we used localhost, since the Pure Storage module are (generally) ran from the same host that the playbook is executed on. Now that we are using an inventory, we can also specify all to target all hosts in the inventory or flasharray and flashblade to target only the hosts in those groups.

The task that we execute is using the module pip to install the package purestorage and purity-fb. That is it, not much to it.

We can kick the playbook of using:

ansible-playbook -i inventory.yaml install_sdk.yaml

Where the -i parameter points to out inventory file and the install_sdk.yaml is the name I gave my playbook.

And that is it, the first play (lines 1-7) will only target hosts node1 and node2, the second play (lines 8-14) will taget hosts node2 and node3.

Conclusion

As you have seen, this lab was a quick one. We used Ansible to target multiple hosts to install some software. By using an inventory file we can quickly target a large group of hosts to execute tasks on all of these hosts. As a result we were able to target smaller set of hosts for specific plays, by using groups. This provides the flexibility to target the correct set of hosts for the correct plays.

Leave a Reply

Your email address will not be published.