如何在Ansible中从变量中去除引号?

7

我想要将文件中的变量值获取到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"
}
2个回答

6
如果引号是字符串的一部分,则简单来说,“省略第一个和最后一个字符”。
      - set_fact:
          unique_key: command_output.stdout[1:-1]

内部解释是相同的。引号控制变量的扩展。请参阅 7.3.1.双引号样式7.3.2.单引号样式

例如,下面是一个戏剧

    - 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

值得一提的是,查看其他filter_plugins示例


1
谢谢!显然,我正在同时学习Ansible和YAML。 - TheDavidFactor
谢谢。我将继续研究字符串过滤选项。 - TheDavidFactor
1
只是想回来再次道谢!我能够编写一个过滤器插件来做我想做的事情,但这也将帮助我解决未来使用Ansible时遇到的问题。 - TheDavidFactor
当我直接在J2模板中添加{{registred_var.stdout[1:-1]}}时,它对我起作用了。谢谢。 - Dushan Wijesinghe

0
略有不同,但可能相关:当使用查找来初始化变量并在“blockinfile”任务中使用时,我会得到不需要的引号。但事实证明,这些引号是由“blockinfile”而不是查找引起的,即:
- name: set some variables
      set_fact: 
        my_var: "{{ lookup('ini', 'my_var section=variables  file=~/myconf.ini') }}" 



- name: update myconf.cfg
      blockinfile: 
        dest: myconf.cfg                                   
        state: present
        create: true
        owner: "{{user}}"
        group: "{{user}}"
        block: |
               [Credentials]
               access_key_id = blabla
               secret_access_key = "{{my_var}}"
      become: true

从这行中去掉引号可以解决问题:
secret_access_key = "{{my_var}}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接