You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ansible从AWS SSM获取参数生成.env文件时遇错误求助

Ansible从AWS SSM获取参数生成.env文件的错误修复

问题描述

尝试通过Ansible从AWS SSM指定路径递归获取参数,在本地执行任务后生成.env文件,原任务代码及模板如下:

原错误任务代码

- name: Get enviroment vars
  local_action:  set_fact "{{ lookup('aws_ssm', '/myi-homemade-apps-config/{{ service_environment }}/{{ stack_name }}', region='eu-west-1', shortnames=true, bypath=true, recursive=true, on_missing='skip' ) }}"

- name: Create .env file
  ansible.builtin.template:
    src: env.file.j2
    dest: /opt/docker-swarm-stack/{{ stack_name }}/.env
    mode: "0600"
  become: true

模板文件env.file.j2内容

{% for key, value in env_content.items() %}
{{key}}={{value}}
{% endfor %}

执行报错信息

第一次执行出现模板解析错误:

fatal: [remote_host -> localhost]: FAILED! => {"msg": "template error while templating string: unexpected end of template, expected ','.. String: \"{{ lookup('aws_ssm', '/myi-homemade-apps-config/{{ service_environment }}/{{ stack_name }}', region"} 

调整任务去掉lookup前后的{{}}后,又出现变量名非法错误:

TASK [docker-swarm-stack : Get enviroment vars] **************************************************************************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: NoneType: None
fatal: [remote_host -> localhost]: FAILED! => {"changed": false, "msg": "The variable name '\" lookup('aws_ssm', '/myi-homemade-apps-config/development/service', region' is not valid. Variables must start with a letter or underscore character, and contain only letters, numbers and underscores."}

错误原因

  1. 模板嵌套解析失败:第一次写法中,将lookup表达式用{{}}包裹后作为set_fact的参数,导致Ansible解析时,路径里的{{ service_environment }}和{{ stack_name }}被提前解析,破坏了lookup函数的参数结构,引发语法错误。
  2. 未指定合法变量名:第二次去掉外层{{}}后,没有给set_fact明确指定要赋值的变量名,Ansible误将整个lookup表达式当作变量名,而变量名只能包含字母、数字和下划线,且必须以字母或下划线开头,因此触发变量名非法的错误。

正确解法

需要明确给set_fact指定变量名(对应模板中使用的env_content),并正确编写lookup表达式的路径:

修正后的任务代码

- name: Get environment vars from AWS SSM
  local_action:
    module: set_fact
    env_content: "{{ lookup('aws_ssm', '/myi-homemade-apps-config/' ~ service_environment ~ '/' ~ stack_name, region='eu-west-1', shortnames=true, bypath=true, recursive=true, on_missing='skip') }}"

- name: Create .env file
  ansible.builtin.template:
    src: env.file.j2
    dest: /opt/docker-swarm-stack/{{ stack_name }}/.env
    mode: "0600"
  become: true

写法说明

  • 使用~运算符拼接字符串,避免路径中嵌套{{}}引发的解析问题;
  • 明确指定env_content作为存储SSM参数的变量名,与模板中的循环变量对应;
  • 也可简化为更紧凑的写法:
    - name: Get environment vars from AWS SSM
      local_action: set_fact env_content="{{ lookup('aws_ssm', '/myi-homemade-apps-config/' ~ service_environment ~ '/' ~ stack_name, region='eu-west-1', shortnames=true, bypath=true, recursive=true, on_missing='skip') }}"
    

模板文件无需修改,只要env_content被正确赋值为SSM返回的键值对字典,即可正常生成格式正确的.env文件。

内容的提问来源于stack exchange,提问作者Enol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:32:03