Iterate with variable and items lists in With_Items

Hello, I hope you can understand what I need, my english is not good, i still learning.

I have a variable

easyrsa_clients:

  • name: ‘{{ client }}’

and this tasks:

  • name: "Copy files
    copy:
    src: ‘{{ item.src }}’
    dest: ‘{{ item.dest }}’
    with_items:
  • { src: ‘{{ easyrsa_dest }}/easyrsa/pki/private/{{ item.name }}.key’, dest: ‘{{ easyrsa_dest }}/keys’ }
  • { src: ‘{{ easyrsa_dest }}/easyrsa/issued/{{ item.name }}.crt’, dest: ‘{{ easyrsa_dest }}/keys’ }

I need to be able to interact with the value of the variable easyrsa_clients within the parameter with_item.

I think I should use easyrsa_clients.item.name but I don’t know.

Any ideas??

Regards

You can’t use “item” inside “with_items:” because “item” is being defined by “with_items:”.

Why don’t you just use “client”:

- name: "Copy files
     copy:
       src: '{{ item.src }}'
       dest: '{{ item.dest }}'
     with_items:
     - { src: '{{ easyrsa_dest }}/easyrsa/pki/private/{{ client }}.key', dest: '{{ easyrsa_dest }}/keys' }
     - { src: '{{ easyrsa_dest }}/easyrsa/issued/{{ client }}.crt', dest: '{{ easyrsa_dest }}/keys' }

or “easyrsa_clients.name”?

Or is there more to the problem that you’ve shown us?

Hello Todd, i try with easyrsa_clients.name but i see this error:

TASK [Probando salida] *****************************************************************************************************************************
fatal: [localhost]: FAILED! => {“msg”: “The task includes an option with an undefined variable. The error was: ‘list object’ has no attribute ‘name’\n\nThe error appears to be in ‘/etc/ansible/openvpn/create_access_prod/playbook/list-test.yaml’: line 6, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: "Probando salida"\n ^ here\n”}

PLAY RECAP *****************************************************************************************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0

How can I use the name key in a with_items?

Oh, right, because “easyrsa_clients” is a list, not a dict.
So try it with either

     - { src: '{{ easyrsa_dest }}/easyrsa/pki/private/{{ **client** }}.key', dest: '{{ easyrsa_dest }}/keys' }
     - { src: '{{ easyrsa_dest }}/easyrsa/issued/{{ **client** }}.crt', dest: '{{ easyrsa_dest }}/keys' }

or

     - { src: '{{ easyrsa_dest }}/easyrsa/pki/private/{{ **easyrsa_clients[0]["name"]** }}.key', dest: '{{ easyrsa_dest }}/keys' }
     - { src: '{{ easyrsa_dest }}/easyrsa/issued/{{ **easyrsa_clients[0]["name"]** }}.crt', dest: '{{ easyrsa_dest }}/keys' }

or
     - { src: '{{ easyrsa_dest }}/easyrsa/pki/private/{{ **easyrsa_clients[0].name** }}.key', dest: '{{ easyrsa_dest }}/keys' }
     - { src: '{{ easyrsa_dest }}/easyrsa/issued/{{ **easyrsa_clients[0].name** }}.crt', dest: '{{ easyrsa_dest }}/keys' }

But I suspect you have bigger plans. Why is easyrsa_clients a list? Do you intend to add other clients later? In which case, the above isn’t going to work. you need something that will handle a fully articulated set of the data. That’s what I alluded to when I (mis)typed “Or is there more to the problem than you’ve shown us?”

Do let us know how you get on.

Make easyrsa_clients a dict if you really need a dict (remove the dash).

easyrsa_clients:
name: ‘{{ client }}’

     - { src: '{{ easyrsa_dest }}/easyrsa/pki/private/{{ **easyrsa_clients["name"]** }}.key', dest: '{{ easyrsa_dest }}/keys' }
     - { src: '{{ easyrsa_dest }}/easyrsa/issued/{{ **easyrsa_clients["name"]** }}.crt', dest: '{{ easyrsa_dest }}/keys' }

I agree with Todd … just use “client” if you have no other need to use easyrsa_client.

Walter

Hello!! thanks for the help.

You’re right, it’s a list, not a dictionary.

The idea was to generate a variable in the form of a list for cases that I need to create accesses to the VPN to more than one user, with your explanation I could understand my error.
Thank you very much.