Here is an illustration of the difference for those interested.


- name: test loop constructs

  hosts: localhost

  gather_facts: false

  become: false

  vars:

    my_list: [ one, two, three ]

  tasks:

    - name: construct 1

      debug: var=item

      loop:

        - '{{ my_list }}'


    - name: construct 2

      debug: var=item

      loop: '{{ my_list }}'





% ansible-playbook -i localhost, loop.yml


PLAY [test loop constructs] 
********************************************************************************************


TASK [construct 1] 
*****************************************************************************************************

ok: [localhost] => (item=['one', 'two', 'three']) => {

    "ansible_loop_var": "item",

    "item": [

        "one",

        "two",

        "three"

    ]

}


TASK [construct 2] 
*****************************************************************************************************

ok: [localhost] => (item=one) => {

    "ansible_loop_var": "item",

    "item": "one"

}

ok: [localhost] => (item=two) => {

    "ansible_loop_var": "item",

    "item": "two"

}

ok: [localhost] => (item=three) => {

    "ansible_loop_var": "item",

    "item": "three"

}


PLAY RECAP 
*************************************************************************************************************

localhost                  : ok=2    changed=0    unreachable=0    failed=0    
skipped=0    rescued=0    ignored=0



Walter
--
Walter Rowe, Division Chief
Infrastructure Services Division
Mobile: 202.355.4123

On May 24, 2024, at 7:41 AM, Rowe, Walter P. (Fed) <[email protected]> wrote:

Very subtle but very different. Great catch Todd.

In the first instance you create a list that contains a single item – another 
list called known.stdout_lines.

loop:
  - '{{ known.stdout_lines }}'

In the second instance you provide a list called known.stdout_lines as the list 
for the loop:

loop: '{{ known.stdout_lines }}'

The second instance is the desired behavior. The difference is subtle at first 
glance but makes a world of difference in execution.

Walter
--
Walter Rowe, Division Chief
Infrastructure Services Division
Mobile: 202.355.4123

On May 23, 2024, at 11:30 AM, Todd Lewis <[email protected]> wrote:

Gah! Of course. known.stdout_lines is a list, so

loop:
  - '{{ known.stdout_lines }}'


passes the whole list as a single item. So you need to not put the list in a 
list:

loop: '{{ known.stdout_lines }}'


should do the trick.
—
Todd

On 5/23/24 11:17 AM, Dimitri Yioulos wrote:
Todd, I made the change, but, the last play failed:

TASK [Append to all known_host files] 
*****************************************************************************************************
Thursday 23 May 2024  11:06:33 -0400 (0:00:01.629)       0:00:06.012 **********
Thursday 23 May 2024  11:06:33 -0400 (0:00:01.629)       0:00:06.011 **********
failed: [myhost] (item=['/root/.ssh/known_hosts', 
'/home/user1/.ssh/known_hosts', '/home/user2/.ssh/known_hosts', 
'/home/user3/.ssh/known_hosts', '/home/user4/.ssh/known_hosts']) => changed=true
  ansible_loop_var: item
  cmd: cat /tmp/append >> ['/root/.ssh/known_hosts', 
'/home/user1/.ssh/known_hosts', '/home/user2/.ssh/known_hosts', 
'/home/user3/.ssh/known_hosts', '/home/user4/.ssh/known_hosts']
  delta: '0:00:00.012330'
  end: '2024-05-23 11:06:33.947617'
  item:
  - /root/.ssh/known_hosts
  - /home/user1/.ssh/known_hosts
  - /home/user2/.ssh/known_hosts
  - /home/user3/.ssh/known_hosts
  - /home/user4/.ssh/known_hosts
  msg: non-zero return code
  rc: 1
  start: '2024-05-23 11:06:33.935287'
  stderr: '/bin/sh: line 1: [/root/.ssh/known_hosts,: No such file or directory'
  stderr_lines: <omitted>
  stdout: ''
  stdout_lines: <omitted>

I wonder if [ in  [/root/.ssh/known_hosts is getting in the way, since  
/root/.ssh/known_host does exist.

On Thursday, May 23, 2024 at 10:50:28 AM UTC-4 Todd Lewis wrote:
You want stdout_lines rather than stdout. The former is a list with new-lines 
removed. The latter is a possibly very long string with the complete output 
stream intact.

    - name: Append to all known_host files
      shell: cat /tmp/append >> {{ item }}
      loop:
        - '{{ known.stdout_lines }}'


On 5/23/24 9:07 AM, Dimitri Yioulos wrote:
Good day, all. I hope I'm not wearing out my welcome with too many questions.

In the following playbook, I first find any know_host file for any user on a 
particular system. I then copy a file with the list of additions to add to the 
known_hosts files. What I want to do is use the output of my register values to 
make changes to those know_host files, which my last play does. My iteration is 
wrong, though.

The playbook:

---

- hosts: all
  gather_facts: false
  become: yes

  vars:
    script_path: <script>

  tasks:

    - name: Find known hosts
      shell: find /root /home -type f -name known_hosts
      register: known

    - name: Debug known_hosts paths
      debug:
        msg: "{{ known.stdout }}"

    - name: Set fact with known_hosts paths
      set_fact:
        known_hosts_paths: "{{ known.stdout_lines }}"

    - name: Upload entries for new known_hosts svn
      copy:
        src: append
        dest: /tmp/append
        owner: root
        group: root
        mode: u=rwx,g=rw,o=rw

    - name: Append to all known_host files
      shell: cat /tmp/append >> {{ item }}
      loop:
        - '{{ known.stdout }}'

The output of the first play:

ok: [myhost] =>
  msg: |-
    /root/.ssh/known_hosts
    /home/user1/.ssh/known_hosts
    /home/ user2/.ssh/known_hosts
    /home/ user3/.ssh/known_hosts
    /home/ user4/.ssh/known_hosts

How do I make that last play work? --
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/84e78306-66cf-4d86-8b45-d1c4816c598en%40googlegroups.com<https://groups.google.com/d/msgid/ansible-project/84e78306-66cf-4d86-8b45-d1c4816c598en%40googlegroups.com?utm_medium=email&utm_source=footer>.


--
Todd

--
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to 
[email protected]<mailto:[email protected]>.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/48b522d1-3503-4606-958b-29ab38398f5en%40googlegroups.com<https://groups.google.com/d/msgid/ansible-project/48b522d1-3503-4606-958b-29ab38398f5en%40googlegroups.com?utm_medium=email&utm_source=footer>.


--
Todd

--
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to 
[email protected]<mailto:[email protected]>.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/b661295c-91dd-449f-ad73-d1eb4a60f7a1%40gmail.com<https://groups.google.com/d/msgid/ansible-project/b661295c-91dd-449f-ad73-d1eb4a60f7a1%40gmail.com?utm_medium=email&utm_source=footer>.


-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/862191EA-3B1C-4BDB-9306-CF55DE087945%40nist.gov.

Reply via email to