Ansible如何找到inventory、group_vars、all.yaml、user_vars的位置

use*_*955 3 ansible

我的 ansible.cfg 没有设置库存,因此我不使用 /etc/ansible/hosts 来决定库存。

https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#understanding-variable-precedence

Ansible 根据优先级确定变量。但要做到这一点,Ansible 需要首先找到变量文件,然后了解文件的类型,然后才能确定优先级,对吧?所以我的问题是:

1/如果主ansible playbook文件夹下有多个子文件夹,Ansible如何知道在哪里可以找到变量文件?或者它可能只是收集主文件夹下的所有文件?

2/ Ansible 如何知道变量文件的类型,即它们是否是 inventory group_vars/all、playbook group_vars/all、inventory host_vars/* 等?注意 Ansible 需要知道文件的类型才能确定变量优先级。

我有这些问题是因为我正在研究 Ansible 剧本,它当前的布局是:

main_playbook.yaml
inventories/dev/rds/group_vars/all.yaml

inventories/dev/rds/group_vars/rds_something.yaml
Run Code Online (Sandbox Code Playgroud)

尽管 Ansible playbook 没有提及路径,但 Ansible 神奇地知道所有变量文件中定义的变量。

如果 Ansible 可以神奇地收集所有这些文件,那么我该如何设计项目,使其知道在不同环境下何时收集哪些文件?目前它只有开发环境,但我计划也有测试环境。但我不知道测试环境的变量文件放在哪里。

Cas*_*sey 11

这是一个很好的问题,ansible 并没有让它的魔力足够清晰。

\n
\n

1/ 如果主 ansible playbook\n文件夹下有多个子文件夹,Ansible 如何知道在哪里可以找到变量文件?或者\n也许它只是收集主文件夹下的所有文件?

\n
\n

在 ansible 中,没有真正的主文件夹概念。也就是说,出于可变分辨率的目的,您可以将“主”文件夹视为您的清单/主机文件所在的位置。

\n

Ansible 始终查找host_vars/group_vars/关联您的清单文件。“相对于您的清单文件”是指“与您的清单文件位于同一文件夹中”

\n

因此,库存(主机)文件的位置很重要。

\n

因此,如果您想让多个环境保持 100% 独立,您的项目布局应该如下所示:

\n
project\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 inventories/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dev/\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rds/\n\xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 group_vars/\n\xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 all.yaml\n\xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rds_something.yaml\n\xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 inventory.yml\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test/\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rds/\n\xe2\x94\x82           \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 group_vars/\n\xe2\x94\x82           \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 all.yaml\n\xe2\x94\x82           \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rds_something.yaml\n\xe2\x94\x82           \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 inventory.yml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main_playbook.yml\n
Run Code Online (Sandbox Code Playgroud)\n
\n

2/ Ansible 如何知道变量文件的类型,即它们是否是 inventory group_vars/all、playbook group_vars/all、inventory\nhost_vars/* 等?

\n
\n

Ansible 根据它所在的文件夹知道。

\n

all.yml如果文件夹中有一个指定的文件group_vars,那么 ansible 知道它包含适用于所有组的变量。

\n

rds_something.yml如果文件夹中有一个指定的文件group_vars,那么 ansible 知道它包含组中所有主机的变量rds_something

\n

db01.yml如果文件夹中有一个指定的文件host_vars,那么 ansible 知道它包含仅适用于db01主机的变量。如果db01不在你的清单文件中,那么 ansible 会忽略它。

\n