在Ansible Playbook中使用regex_replace清理字符获取可用堆栈列表
解决Ansible处理Shell模块输出为CloudFormation堆栈列表的问题
我来帮你搞定这个问题!你的核心痛点是StackNames.stdout_lines输出的是分行的类JSON数组格式,直接用简单的replace和trim没法过滤掉括号、逗号,也没法正确提取出干净的堆栈名称。下面给你两种可行的解决方案,优先推荐第一种(更可靠):
方案一:利用JSON解析(推荐)
这种方法把分行的输出拼接成完整的JSON字符串,再解析成Ansible列表,是最稳妥的方式,因为它依赖标准的JSON格式处理,不容易出错:
- name: 拼接stdout_lines为完整JSON字符串 set_fact: stack_json_str: "{{ StackNames.stdout_lines | join('') }}" - name: 解析JSON为干净的堆栈名称列表 set_fact: stack_list: "{{ stack_json_str | from_json | map('trim') | list }}"
步骤解释:
join(''):把stdout_lines里的每一行拼接成一个完整的JSON数组字符串,比如你的输入拼接后会变成:[ "SHSD-CZWV-ami-automation-WIN2012R2-NONPROD-ramirja-119", "SHSD-CZWV-ami-automation-WIN2012R2-NONPROD-ramirja-118", "SHSD-CZWV-ami-automation-WIN2012R2-NONPROD-ramirja-117" ]from_json:把拼接好的JSON字符串转换成Ansible原生列表,此时每个元素可能带有前后空格;map('trim'):去掉每个堆栈名称前后的多余空格,最后用list转换成标准列表格式。
方案二:正则表达式手动提取(备选)
如果JSON解析因为输出格式不标准出问题,可以用正则直接提取每个行里的堆栈名称:
- name: 提取干净的堆栈名称列表 set_fact: stack_list: > {{ StackNames.stdout_lines | reject('search', '^\s*[\[\]]\s*$') # 过滤掉只包含[]的行 | map('regex_replace', '^\s*["\'](.*?)["\'],?\s*$', '\1') # 提取引号内的内容,去掉逗号和空格 | list }}
步骤解释:
reject('search', ...):过滤掉第一行的[和最后一行的];regex_replace:匹配每行的格式(比如"SHSD-...",或"SHSD-..."),提取出引号之间的核心堆栈名称,自动去掉前后空格、引号和末尾的逗号;list:把处理后的结果转换成标准列表。
使用示例
处理完成后,你就可以直接循环stack_list来删除CloudFormation堆栈了:
- name: 删除目标CloudFormation堆栈 cloudformation: stack_name: "{{ item }}" state: absent loop: "{{ stack_list }}"
内容的提问来源于stack exchange,提问作者Jaime76
相关产品推荐
相关产品推荐

