【问题标题】:strip quotes from a variable in Ansible从 Ansible 中的变量中去除引号
【发布时间】:2019-07-18 21:08:23
【问题描述】:

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

【问题讨论】:

    标签: regex ansible


    【解决方案1】:

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

          - set_fact:
              unique_key: command_output.stdout[1:-1]
    

    内部解释都是一样的。引号控制变量的扩展。请参阅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
    

    和模板

        shell> cat test.j2
        {{ var1 }}
        {{ var2 }}
        {{ var3 }}
    

    给

        shell> 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。

    【讨论】:

    • 谢谢!!很明显,我正在同时学习 Ansible 和 YAML。
    • 谢谢。我会继续研究字符串过滤选项
    • 只是想再回来说声谢谢!我能够编写一个过滤器插件来做我想做的事,但这也将帮助我解决未来的 Ansible 问题
    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 2021-04-12
    • 1970-01-01
    • 2022-07-03
    • 2010-12-29
    • 1970-01-01
    • 2011-01-15
    • 2021-05-15
    相关资源
    最近更新 更多