从 Ansible 中的变量中去除引号

The*_*tor 5 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
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)

Vla*_*tka 5

如果引号是字符串的一部分,简短的回答是“省略第一个和最后一个字符”

      - 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 的其他示例