从Ansible中的变量中删除引号

时间:2019-07-18 21:08:23

标签: regex ansible

我正在尝试将文件中的变量值转换为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"
}

1 个答案:

答案 0 :(得分:2)

内部解释都是一样的。引号控制变量的扩展。参见7.3.1. Double-Quoted Style7.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