您如何指定特定于环境的清单文件?

How do you specify environment specific inventory files?

我的文件夹结构如下:

.
├── 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

在我的 ansible.cfg 中,我想做类似的事情:hostfile=./etc/{{ env }}/inventory,但这不起作用。有没有一种方法可以在 Ansible 中指定环境特定的清单文件?

我认为 {{ env }}/inventory 应该可以,而不是 /inventory/{{ env }}。另外,如果你可以请分享你现在是如何使用它的,以及当你将配置更改为 envs one 时出现的错误

我假设common和products是可变文件。

正如@Deepali Mittal 已经提到的,您的库存应该看起来像 inventory/{{ env }}

inventory/prod 中,您将定义一个组 prod,在 inventory/dev 中,您将定义一个组 dev:

[prod]
host1
host2
hostN

这使您能够为 proddev 定义组变量。为此,只需创建一个文件夹 group_vars/prod 并将您的 vars 文件放入其中。

重新排序后的结构如下所示:

.
├── 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

我不确定 globals.yml 是什么。如果它是剧本,则它位于正确的位置。如果它是具有全局定义的变量文件,则应将其另存为 group_vars/all.yml 并自动为所有主机加载。

现在使用正确的清单文件调用 ansible-playbook:

ansible-playbook -i inventory/prod startup.yml

我认为不可能像你问的那样评估 ansible.cfg 内部的环境。