MrDuk
MrDuk

Reputation: 18242

How do you specify environment specific inventory files?

I have a folder structure like so:

.
├── ansible.cfg
├── etc
│   ├── dev
│   │   ├── common
│   │   │   ├── graphite.yml
│   │   │   ├── mongo.yml
│   │   │   ├── mysql.yml
│   │   │   └── rs4.yml
│   │   ├── inventory
│   │   └── products
│   │       ├── a.yml
│   │       ├── b.yml
│   │       └── c.yml
│   └── prod
│       ├── common
│       │   ├── graphite.yml
│       │   ├── mongo.yml
│       │   ├── redis.yml
│       │   └── rs4.yml
│       ├── inventory
│       └── products
│           ├── a.yml
│           ├── b.yml
│           └── c.yml
├── globals.yml
├── startup.yml
├── roles
|   └── [...]
└── requirements.txt

And in my ansible.cfg, I would like to do something like: hostfile=./etc/{{ env }}/inventory, but this doesn't work. Is there a way I can go about specifying environment specific inventory files in Ansible?

Upvotes: 0

Views: 1580

Answers (2)

udondan
udondan

Reputation: 59989

I assume common and products are variable files.

As @Deepali Mittal already mentioned your inventory should look like inventory/{{ env }}.

In inventory/prod you would define a group prod and in inventory/dev you would define a group dev:

[prod]
host1
host2
hostN

This enables you to define group vars for prod and dev. For this simply create a folder group_vars/prod and place your vars files inside.

Re-ordered your structure would look like this:

.
├── ansible.cfg
├── inventory
│   ├── dev
│   └── prod
├── group_vars
│   ├── dev
│   │   ├── common
│   │   │   ├── graphite.yml
│   │   │   ├── mongo.yml
│   │   │   ├── mysql.yml
│   │   │   └── rs4.yml
│   │   └── products
│   │       ├── a.yml
│   │       ├── b.yml
│   │       └── c.yml
│   └── prod
│       ├── common
│       │   ├── graphite.yml
│       │   ├── mongo.yml
│       │   ├── mysql.yml
│       │   └── rs4.yml
│       └── products
│           ├── a.yml
│           ├── b.yml
│           └── c.yml
├── globals.yml
├── startup.yml
├── roles
|   └── [...]
└── requirements.txt

I'm not sure what globals.yml is. If it is a playbook, it is in the correct location. If it is a variable file with global definitions it should be saved as group_vars/all.yml and automatically would be loaded for all hosts.

Now you call ansible-playbook with the correct inventory file:

ansible-playbook -i inventory/prod startup.yml

I don't think it's possible to evaluate the environment inside the ansible.cfg like you asked.

Upvotes: 1

Deepali Mittal
Deepali Mittal

Reputation: 1032

I think instead of {{ env }}/inventory, /inventory/{{ env }} should work. Also if you can please share how you use it right now and the error you get when you change the configuration to envs one

Upvotes: 0

Related Questions