我正在尝试将文件中变量的值转换为 Ansible 变量,以便我可以使用它。
这是我所拥有的:
- name: extract Unique Key
shell: "grep UNIQUE_KEY ../config.py | cut -d' ' -f 3"
register: command_output
- set_fact:
unique_key: x{{ command_output.stdout | regex_replace("^'", '') | regex_replace('^"', '') | regex_replace("'$", '') | regex_replace('"$', '') }}
- set_fact:
unique_key: "{{ unique_key | regex_replace('^x', '') }}"
- debug: var=unique_key
Run Code Online (Sandbox Code Playgroud)
这有效,但感觉笨拙而且看起来很丑。
我已经尝试将 sed 添加到我原来的 shell 模块中,但我不知道如何正确转义引号。我也无法弄清楚如何转义 regex_replace 以使其在单个变量赋值中工作。
有没有更简单的方法可以解决这个问题:
"TEST"
Run Code Online (Sandbox Code Playgroud)
或者
'TEST'
Run Code Online (Sandbox Code Playgroud)
对此:
TEST
Run Code Online (Sandbox Code Playgroud)
在 Ansible 中?(我也是 Ansible 的新手,所以这也无济于事)
编辑:在我最初接受的@Vladimir-Botka 的回答之后,我发现了这个问题:
如果我不去掉引号并将变量嵌入另一个变量中,它会保留引号:
我需要使用这个值来构建一个路径:
vars:
service_location: "/opt/{{ unique_key }}-scheduler-service"
Run Code Online (Sandbox Code Playgroud)
如果我不使用上面的方法删除引号,则变量将包含调试语句输出中的引号:
ok: [fedorasvr1] => {
"service_location": "/opt/'TEST'-scheduler-service"
}
Run Code Online (Sandbox Code Playgroud)
如果引号是字符串的一部分,简短的回答是“省略第一个和最后一个字符”
- set_fact:
unique_key: command_output.stdout[1:-1]
Run Code Online (Sandbox Code Playgroud)
内部解释都是一样的。引号控制变量的扩展。见7.3.1。双引号样式和7.3.2。单引号样式。
举个例子。下面的剧
- hosts: localhost
vars:
var1: TEST
var2: 'TEST'
var3: "TEST"
tasks:
- template:
src: test.j2
dest: test
Run Code Online (Sandbox Code Playgroud)
和模板
shell> cat test.j2
{{ var1 }}
{{ var2 }}
{{ var3 }}
Run Code Online (Sandbox Code Playgroud)
给
shell> cat test
TEST
TEST
TEST
Run Code Online (Sandbox Code Playgroud)
引号(如果是字符串的一部分)可以删除。作为一个例子下面的播放
shell> cat test
TEST
TEST
TEST
Run Code Online (Sandbox Code Playgroud)
给
- hosts: localhost
vars:
regex: "[`'\"]"
replace: ""
service_location: "/opt/{{ item|regex_replace(regex, replace)
}}-scheduler-service"
tasks:
- debug:
var: service_location
loop:
- '`TEST`'
- '"TEST"'
- '''TEST'''
- "'TEST'"
Run Code Online (Sandbox Code Playgroud)
也可以使用自定义filter_plugins/string_filters.py,这可能比复杂的转义结构更方便。
举个例子。下面的剧
ok: [localhost] => (item=`TEST`) =>
item: '`TEST`'
service_location: /opt/TEST-scheduler-service
ok: [localhost] => (item="TEST") =>
item: '"TEST"'
service_location: /opt/TEST-scheduler-service
ok: [localhost] => (item='TEST') =>
item: '''TEST'''
service_location: /opt/TEST-scheduler-service
ok: [localhost] => (item='TEST') =>
item: '''TEST'''
service_location: /opt/TEST-scheduler-service
Run Code Online (Sandbox Code Playgroud)
给
- hosts: localhost
vars:
replace: ""
service_location: "/opt/{{ item.0|string_replace(item.1, replace)
}}-scheduler-service"
tasks:
- debug:
var: service_location
with_together:
- - '`TEST`'
- '"TEST"'
- "'TEST'"
- - '`'
- '"'
- "'"
Run Code Online (Sandbox Code Playgroud)
FWIW,请参阅filter_plugins 的其他示例。