如何不使用all组为特定Ansible清单内所有主机设置become密码?
解决Ansible多清单下all组变量覆盖的问题
核心原因是Ansible会把所有指定清单里的all组合并成一个全局all组,变量会按清单加载顺序覆盖,最后加载的清单变量优先级最高。给你几个不用修改现有清单组结构的简便方案:
方案1:清单专属的group_vars目录(推荐)
不用在清单文件里加额外组,只需要按清单名称创建对应的group_vars子目录:
- 假设你的清单文件是
prod.ini和staging.ini,目录结构改成这样:inventories/ ├── prod.ini ├── staging.ini └── group_vars/ ├── prod/ │ └── all.yml └── staging/ └── all.yml - 在
group_vars/prod/all.yml里写prod环境的become密码:become_pass: your_prod_become_password - 在
group_vars/staging/all.yml里写staging环境的密码:become_pass: your_staging_become_password - 运行剧本时指定多个清单:
ansible-playbook -i inventories/prod.ini -i inventories/staging.ini your_playbook.yml
这种方式下,每个清单里的主机只会加载对应目录下的all组变量,完全隔离,不会互相覆盖。
方案2:利用inventory_dir或自定义清单变量动态赋值
如果不想加太多目录,可以用Ansible内置的inventory_dir变量(每个主机所属清单的目录路径)来区分:
- 在全局的
group_vars/all.yml里写条件判断:become_pass: > {% if inventory_dir == '/path/to/your/prod/inventory' %} your_prod_become_password {% elif inventory_dir == '/path/to/your/staging/inventory' %} your_staging_become_password {% endif %}
或者更灵活,给每个清单加个专属标识:
- 在
prod.ini开头加:[all:vars] inventory_env=prod - 在
staging.ini开头加:[all:vars] inventory_env=staging - 然后在
group_vars/all.yml里用这个标识匹配:become_pass: "{{ lookup('vars', inventory_env ~ '_become_pass') }}" prod_become_pass: your_prod_become_password staging_become_pass: your_staging_become_password
方案3:临时命令行传参(适合单次操作)
如果只是偶尔需要多清单一起跑,可以用--extra-vars结合主机模式,但这种方式更适合临时场景:
ansible-playbook -i prod.ini -e "become_pass=prod_pass" -i staging.ini -e "become_pass=staging_pass" your_playbook.yml --limit "prod_group:staging_group"
不过这种方式需要你能区分不同清单的主机组,不如前两种灵活。
内容的提问来源于stack exchange,提问作者Mike Assel
相关产品推荐
相关产品推荐

