Hey all - I think I’m losing my mind. Can anyone explain why every iteration of task 3 is being skipped (compare w/ task 2, especially)?
(ansible2_12_8) rowagn@mlb656 client % cat d.yml
hosts: all
gather_facts: no
vars:
s: ‘1 2 3’
t: p1_xyz
t_list:
p1_xyz
p2_xyz
tasks:
name: task 1
debug:
msg: ‘{{ ( t | regex_replace(“^p(\d+).*$”, “\1”) ) in s }}’
name: task 2
debug:
msg: ‘{{ ( item | regex_replace(“^p(\d+).*$”, “\1”) ) in s }}’
loop: “{{ t_list }}”
name: task 3
debug:
msg: “{{ item }} is in s”
loop: “{{ t_list }}”
when: ( item | regex_replace(“^p(\d+).*$”, “\1”) ) in s
(ansible2_12_8) rowagn@mlb656 client % ansible-playbook d.yml -i ~/localhost
PLAY [all] **********************************************************************************************************
TASK [task 1] *******************************************************************************************************
ok: [localhost] => {
“msg”: true
}
TASK [task 2] *******************************************************************************************************
ok: [localhost] => (item=p1_xyz) => {
“msg”: true
}
ok: [localhost] => (item=p2_xyz) => {
“msg”: true
}
TASK [task 3] *******************************************************************************************************
skipping: [localhost] => (item=p1_xyz)
skipping: [localhost] => (item=p2_xyz)
skipping: [localhost]
PLAY RECAP **********************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
I’ve started at this for hours.
Rob
Rob
Trying to follow along, So on Task 3 you want to iterate over the list t_list and match if the digit is in variable s? First thought is that you are testing if an int is a string.
ok, here it is… should be \1 vs \1 in your replacement and test(is) on string contents(in)
name: task 3
debug:
msg: “{{ item }} is in the s”
loop: “{{ t_list }}”
when: ( item | regex_replace(“^p(\d+).*$”, “\1”) ) is in s
name: task 3.orig
debug:
msg: “{{ item }} is in s”
loop: “{{ t_list }}”
when: ( item | regex_replace(“^p(\d+).*$”, “\1”) ) in s
TASK [task 3] ****************************************************************************************************
ok: [localhost] => (item=p1_xyz) => {
“msg”: “p1_xyz is in the s”
}
ok: [localhost] => (item=p2_xyz) => {
“msg”: “p2_xyz is in the s”
}
TASK [task 3.orig] ***********************************************************************************************
skipping: [localhost] => (item=p1_xyz)
skipping: [localhost] => (item=p2_xyz)
skipping: [localhost]
PLAY RECAP *******************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
I did this in a hurry, so there may be mistakes or more awesome ways of doing this. YMMV
Wow. Never would have thought to try that. Escaping in YAML/Jinja is such an unintuitive mess. Thanks so much, Andrew.
racke
(Stefan Hornburg)
November 21, 2022, 2:51pm
5
Wow. Never would have thought to try that. Escaping in YAML/Jinja is such an unintuitive mess. Thanks so much, Andrew.
It is easier though when you use single quotes for the arguments of the regex_replace filter.
Regards
Racke
Thanks Racke, but I just tried:
name: task 3
debug:
msg: “{{ item }} is in s”
loop: “{{ t_list }}”
when: ( item | regex_replace(‘^p(\d+).*$’, ‘\1’) ) in s
It fails. Only works with \1.