我正在尝试将文件中的变量值转换为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
这有效,但感觉很笨拙,看上去很丑。
我已经尝试将sed添加到我的原始shell模块中,但是我不知道如何正确地排除引号。我也想不通如何转义regex_replace使其在单个变量分配中工作。
有没有更简单的方法可以解决这个问题?
"TEST"
或
'TEST'
对此:
TEST
在Ansible中? (我也是Ansible的新手,所以也无济于事)
编辑:我最初接受@ Vladimir-Botka的回答后,发现了这个问题:
如果我不删除引号并将变量嵌入另一个变量中,则会保留引号:
我需要使用此值来构造路径:
vars:
service_location: "/opt/{{ unique_key }}-scheduler-service"
如果我不使用上述方法删除引号,则该变量将包含调试语句的以下输出中的引号:
ok: [fedorasvr1] => {
"service_location": "/opt/'TEST'-scheduler-service"
}
答案 0 :(得分:2)
内部解释都是一样的。引号控制变量的扩展。参见7.3.1. Double-Quoted Style和7.3.2. Single-Quoted Style。
作为一个例子。下面的游戏
- hosts: localhost
vars:
var1: TEST
var2: 'TEST'
var3: "TEST"
tasks:
- template:
src: test.j2
dest: test
使用模板
$ cat test.j2
{{ var1 }}
{{ var2 }}
{{ var3 }}
给予
$ cat test
TEST
TEST
TEST
- 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'"
给予
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
还可以使用自定义filter_plugins/string_filters.py,它可能比复杂的转义结构更方便。
作为一个例子。下面的游戏
- 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'"
- - '`'
- '"'
- "'"
给予
ok: [localhost] => (item=[u'`TEST`', u'`']) =>
item:
- '`TEST`'
- '`'
service_location: /opt/TEST-scheduler-service
ok: [localhost] => (item=[u'"TEST"', u'"']) =>
item:
- '"TEST"'
- '"'
service_location: /opt/TEST-scheduler-service
ok: [localhost] => (item=[u"'TEST'", u"'"]) =>
item:
- '''TEST'''
- ''''
service_location: /opt/TEST-scheduler-service
FWIW,请参见其他examples of filter_plugins。