请注意:总有其他选择,但这更像是一个兴趣/挑战-请关注问题本身,特别是如何在Ansible中使用有效的正则表达式解析.env文件。我很接近。
我有一个
.env
文件,我想将其解析为可解释剧本中的可解释变量。我目前使用的是
key=value
对,并且还忽略注释和新行。
这是一个有效的正则表达式替换:
map('regex_replace', '([^=]*)=(.*)', '\\1: \\2')
和
.env
它解析的文件。
KEY2=SOME_TEXT
KEY3="SOME_MORE_TEXT"
KEY4='EVEN_MORE_TEXT'
问题
但是,当我在这个文件中有一个多行变量时,例如:
KEY1='{
"string" = {
"key" = "value",
"key" = "value"
},
"string" = {
"key" = "value",
"key" = "value"
}
}'
…然后regex仍然会解析它,但它也会更改所有
=
进入
:
在该字符串中。我想
忽视
我不知道该怎么做。
以下是我迄今为止使用regex的完整操作手册:
---
- name: Read .env file
hosts: "localhost"
connection: "local"
tasks:
- name: Get env file content
slurp:
src: ../.env
register: env_file_content
- name: Store env vars in playbook values
set_fact:
env_vars: "{{ (env_file_content.content | b64decode).split('\n') | map('regex_replace', '^#.*', '') | select | map('regex_replace', '([^=]*)=(.*)', '\\1: \\2') | join('\n') | from_yaml }}"
- name: Debug output
debug:
var: env_vars
以及
.env
文件:
# IN TOTAL, THE REGEX SHOULD MATCH 4 KEY-VALUE PAIRS FROM THIS FILE.
KEY1='{
"string" = {
"key" = "value",
"key" = "value"
},
"string" = {
"key" = "value",
"key" = "value"
}
}'
# DO NOT MATCH ON COMMENTS, EVEN THOSE WITH X=Y in them.
# ALSO IGNORE THIS COMMENT, AND NEW LINES AROUND.
KEY2=SOME_TEXT
KEY3="SOME_MORE_TEXT"
KEY4='EVEN_MORE_TEXT'
我需要什么
-
正则表达式需要生成四个可以在Ansible中访问的变量,例如
env_vars.KEY1
。
-
正则表达式需要
不是
匹配任何内容
在内部
KEY1-需要保持原样。
-
它还需要在每个键前面加上
PREFIX_
,可以在
regex_replace
具有
'PREFIX_\\1: \\2'
,但您会注意到,它在
KEY1
因为当我想忽略它时,它与该变量的内容相匹配。
如何更新到目前为止的内容来解析多行
.env
在ansible中使用Regex文件(并在每个var前面加一个字符串),这样我就可以访问四个单独的变量了?