根据另一个变量设置一个变量

Set a variable according to another variable

我正在做一个 gitlab-ci 项目。
我有一个从表单中检索的变量 A
我必须在我的剧本中设置另一个变量 B

如果A匹配某个正则表达式,B应该是' -p A'否则B应该是一个空字符串''.
这应该写在 Ansible 文件中。

我试过了

- set_fact: 
  B="{{ ' -p ' + A}}"
  when: A is regex("^\d{1,8}$")

但是没用。
有人可以帮助我吗?

你确实有3个问题,我会说:

  1. 你应该使用 Jinja 的 inline if expression 而不是 when
  2. 必须转义数字模式的反斜杠才能在 YAML 中生成有效内容:\d
  3. 我想正则表达式与您认为的不匹配,要匹配一位和八位数字,量词必须与 逗号 (,) 分隔前一个模式的最小和最大重复,而不是破折号 (-):\d{1,8}

一起

 - set_fact: 
     B: "{{ ' -p ' ~ migration_time if A is regex('^\d{1,8}$') else '' }}"

鉴于剧本:

- hosts: localhost
  gather_facts: no

  tasks:
    - set_fact: 
        B: "{{ ' -p ' ~ migration_time if A is regex('^\d{1,8}$') else '' }}"
      vars:
        A: 20220127
        migration_time: 2022-01-27
    
    - debug:
        var: B

这将产生:

TASK [set_fact] *************************************************************
ok: [localhost]

TASK [debug] ****************************************************************
ok: [localhost] => 
  B: ' -p 2022-01-27'

现在,如果我对您的正则表达式与您的意思不符的假设是不正确的,那么这里有一个与该场景完全匹配的有效剧本。

鉴于剧本:

- hosts: localhost
  gather_facts: no

  tasks:
    - set_fact: 
        B: "{{ ' -p ' ~ migration_time if A is regex('^\d{1-8}$') else '' }}"
      vars:
        ## This is the value that will make `A` match,
        ## but, I do suspect this is not what you meant
        ## and I guess you meant `^\d{1,8}$`, rather in your regex.
        A: '1{1-8}' 
        migration_time: 2022-01-27
    
    - debug:
        var: B

这产生:

TASK [set_fact] *************************************************************
ok: [localhost]

TASK [debug] ****************************************************************
ok: [localhost] => 
  B: ' -p 2022-01-27'

问:"如果 A 匹配某个正则表达式,B 应该是 '-p A' 否则 B 应该是一个空字符串 ''。"。 =42=]

A:使用过滤器三元,例如

  B: "{{ (A is regex('^\d{1,8}$'))|ternary(' -p ' ~ A, '') }}"

测试一下

    - debug:
        msg: 'A: {{ A }} -> B: "{{ B }}"'
      loop:
        - 1234567
        - 12345678
        - 123456789
        - xyz12345
      loop_control:
        loop_var: A

给出(删节)

  msg: 'A: 1234567 -> B: " -p 1234567"'
  msg: 'A: 12345678 -> B: " -p 12345678"'
  msg: 'A: 123456789 -> B: ""'
  msg: 'A: xyz12345 -> B: ""'

问:"这应该写在Ansible文件中。"

答:你可以把它放到一个文件里,例如

shell> cat set_B.yml 
B: "{{ (A is regex('^\d{1,8}$'))|ternary(' -p ' ~ A, '') }}"

然后您可以通过多种方式使用它,例如使用 include_vars

    - include_vars: set_B.yml

或者放入group_vars,host_vars,...见Variable precedence: Where should I put a variable?