Ansible如何加载本地INI格式变量文件并在任务/角色中调用变量
Ansible加载无Section INI/键值对配置文件为全局变量方案
方案1:无需修改原sourcefile.txt(推荐)
适合不想改动原有配置文件格式的场景,解析后的变量可直接在后续所有任务、角色中调用。
实现步骤
- 读取配置文件内容(文件存放在目标节点用
slurp,存放在控制节点直接用lookup即可)
# 配置文件在目标节点时用这个任务 - name: 读取目标节点上的sourcefile.txt ansible.builtin.slurp: src: /path/to/sourcefile.txt # 替换为文件实际绝对路径 register: sourcefile_raw
- 解析键值对为可直接引用的变量
- name: 解析配置为全局变量 ansible.builtin.set_fact: "{{ item.split('=', 1)[0] }}": "{{ item.split('=', 1)[1] }}" # 配置文件在控制节点时,把下面sourcefile_raw.content | b64decode替换为 lookup('file', '/控制节点文件路径/sourcefile.txt') loop: "{{ sourcefile_raw.content | b64decode | split('\n') | select('search', '^[^#=]+=') | list }}"
上述过滤器会自动过滤空行、#开头的注释行,仅保留有效key=value配置,且只拆分第一个等号,避免value内含等号时解析错误。
3. 验证效果
- name: 打印docker pull命令验证变量可用性 ansible.builtin.debug: msg: "docker pull {{ REGISTRY_URL }}/{{ APP2_IMAGE }}"
执行后会输出拼接后的命令,变量可直接在任意场景使用。
方案2:添加Section用原生INI加载(更稳定)
如果可以修改原sourcefile.txt格式,在文件最顶部添加一个自定义Section头(比如[docker_config]),修改后文件内容如下:
[docker_config]
APP1_IMAGE=register:5000/app1:2.1-b4
APP2_IMAGE=register:4000/app2:3.8-b10
REGISTRY_URL=register.local
USER=%user%
之后直接用include_vars模块一次性加载所有变量:
- name: 加载INI格式配置 ansible.builtin.include_vars: file: /path/to/sourcefile.txt # 可选参数name: docker_config,加了之后需要通过docker_config.APP2_IMAGE调用,不加则直接用变量名
常用场景示例
1. 直接调用变量拉取镜像
- name: 拉取APP2镜像 community.docker.docker_image: name: "{{ REGISTRY_URL }}/{{ APP2_IMAGE }}" source: pull
2. 循环拉取所有APP前缀的镜像
- name: 批量拉取所有业务镜像 community.docker.docker_image: name: "{{ REGISTRY_URL }}/{{ item.value }}" source: pull loop: "{{ vars | dict2items | selectattr('key', 'match', '^APP.*_IMAGE$') | list }}"
3. 条件判断执行任务
- name: 仅当USER为admin时输出配置 ansible.builtin.debug: msg: "当前镜像仓库地址为 {{ REGISTRY_URL }}" when: USER == 'admin'
内容的提问来源于stack exchange,提问作者tapestreamer
相关产品推荐
相关产品推荐

