根据另一个变量设置一个变量
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个问题,我会说:
- 你应该使用 Jinja 的 inline if expression 而不是
when
- 必须转义数字模式的反斜杠才能在 YAML 中生成有效内容:
\d
- 我想正则表达式与您认为的不匹配,要匹配一位和八位数字,量词必须与 逗号 (
,
) 分隔前一个模式的最小和最大重复,而不是破折号 (-
):\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?
我正在做一个 gitlab-ci 项目。
我有一个从表单中检索的变量 A
。
我必须在我的剧本中设置另一个变量 B
。
如果A
匹配某个正则表达式,B
应该是' -p A'
否则B
应该是一个空字符串''
.
这应该写在 Ansible 文件中。
我试过了
- set_fact:
B="{{ ' -p ' + A}}"
when: A is regex("^\d{1,8}$")
但是没用。
有人可以帮助我吗?
你确实有3个问题,我会说:
- 你应该使用 Jinja 的 inline if expression 而不是
when
- 必须转义数字模式的反斜杠才能在 YAML 中生成有效内容:
\d
- 我想正则表达式与您认为的不匹配,要匹配一位和八位数字,量词必须与 逗号 (
,
) 分隔前一个模式的最小和最大重复,而不是破折号 (-
):\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?