why does this loop/when fail

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.

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.