regex 如何在Ansible中去掉变量的引号?

nwlls2ji  于 2023-01-31  发布在  其他
关注(0)|答案(2)|浏览(199)

我正在尝试将文件中的变量值放入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"
}
rsl1atfo

rsl1atfo1#

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

- 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

FWIW,参见其他examples of filter_plugins

ioekq8ef

ioekq8ef2#

略有不同,但可能相关:我在使用查找来初始化一个变量时得到了不需要的引号,该变量随后被用于“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}}"

相关问题