Ansible如何为各托管主机配置差异化专属环境变量
实现Ansible托管主机差异化独有环境变量配置方案
方案1:使用host_vars目录管理(推荐,适合多变量场景)
步骤1:创建主机变量目录结构
在inventory文件同级目录下创建host_vars文件夹,为每个托管主机创建独立的变量配置文件,文件名和inventory中定义的主机名完全一致:
# 目录结构示例 . ├── inventory ├── main.yaml ├── host_vars/ │ ├── dsad1.jkas.com.yaml │ ├── dsad2.jkas.com.yaml │ ├── dsad3.jkas.com.yaml │ └── dsad4.jkas.com.yaml └── roles/
步骤2:写入对应主机的独有变量
以dsad1.jkas.com.yaml为例,内容如下:
sys: abc1 cap: rty2 jam: yup4 pak: hyd4 jum: 563
其余主机按照同样格式写入对应变量值即可。
步骤3:修改任务配置,注入环境变量
修改roles/dep-main/tasks/main.yaml,通过environment参数将主机变量注入到脚本的运行环境中:
- name: run playbook script: path/scripts/dep-main.sh environment: sys: "{{ sys }}" cap: "{{ cap }}" jam: "{{ jam }}" pak: "{{ pak }}" jum: "{{ jum }}"
如果后续需要新增独有变量,可以优化为字典格式,减少后续修改任务的成本:
首先调整host_vars内的变量结构:
# host_vars/dsad1.jkas.com.yaml host_custom_env: sys: abc1 cap: rty2 jam: yup4 pak: hyd4 jum: 563
然后任务直接引用整个字典:
- name: run playbook script: path/scripts/dep-main.sh environment: "{{ host_custom_env }}"
方案2:直接在inventory内定义主机变量(适合变量少、轻量场景)
如果不想新增目录,也可以直接修改inventory文件,在主机名后直接绑定变量:
[abc] dsad1.jkas.com sys=abc1 cap=rty2 jam=yup4 pak=hyd4 jum=563 dsad2.jkas.com sys=abc45 cap=hju jam=upy pak=upsc jum=y78 [def] dsad3.jkas.com sys=xxx cap=xxx jam=xxx pak=xxx jum=xxx dsad4.jkas.com sys=xxx cap=xxx jam=xxx pak=xxx jum=xxx [main:children] abc def [main:vars] ansible_user="{{lookup('env', 'uid')}}" ansible_password="{{lookup('env', 'pwd')}}" ansible_connection=paramiko
后续注入环境变量的操作和方案1一致即可。
注意事项
- 现有配置存在两处笔误需要修正,避免执行报错:
- inventory中
ansible_connection=paramkio应为ansible_connection=paramiko - main.yaml中
hosts: "{{my-hosts}}"的变量名和执行命令传入的my_hosts不一致,需要统一为下划线或横杠格式
- inventory中
- 原有执行命令无需修改,Ansible会自动匹配当前执行主机的对应变量注入到脚本运行环境,shell脚本内可直接通过
$sys、$cap等名称调用变量,无需修改已写入脚本的10组通用变量。
内容的提问来源于stack exchange,提问作者krishna chaitanya jinka
相关产品推荐
相关产品推荐

