Ansible: Zeichenfolge in Wörterbuch konvertieren

Ansible: Zeichenfolge in Wörterbuch konvertieren

Ich starte Ansible von Tower aus und fülle dann die neuen Benutzer als Text aus:

{ name: user1, uid: 5000 }
{ name: user2, uid: 5001 }

Ich möchte diese Benutzer als Wörterbuch iterieren, etwa so:

- name: Print vars
  debug:
    var: "{{ item.name }}"
  with_items: "{{ users.split('\n') }}"

Aber es funktioniert nicht:

TASK [Print vars] *********************************************************************************************************************
ok: [lx-test] => (item={ name: user1, uid: 5000 }) => {
    "ansible_loop_var": "item",
    "item": "{ name: user1, uid: 5000 }",
    "{ name: user1, uid: 5000 }": "VARIABLE IS NOT DEFINED!"
}
ok: [lx-test] => (item={ name: user2, uid: 5001 }) => {
    "ansible_loop_var": "item",
    "item": "{ name: user2, uid: 5001 }",
    "{ name: user2, uid: 5001 }": "VARIABLE IS NOT DEFINED!"
}

Irgendeine Idee, wie man diese Zeichenfolge in ein echtes Wörterbuch umwandelt? Vielen Dank im Voraus!

Antwort1

Aktualisieren

Der folgende Ausdruck

users_list: "{{ users_str.splitlines()|map('from_yaml')|list }}"

gibt

users_list:
  - name: user1
    uid: 5000
  - name: user2
    uid: 5001

Deklarieren Sie die Variable alsgeeignet.


Beispiel eines vollständigen Playbooks zum Testen

- hosts: localhost

  vars:

    users_str: |
      {name: user1, uid: 5000}
      {name: user2, uid: 5001}

    users_list: "{{ users_str.splitlines()|map('from_yaml')|list }}"

  tasks:

    - debug:
        var: users_list

Optional können Sie die Daten in eine CSV-Datei einfügen

shell> cat /tmp/users.csv 
name,uid
user1,5000
user2,5001

und VerwendungGemeinschaft.allgemein.csv lesenum es zu lesen

- hosts: localhost

  tasks:

    - community.general.read_csv:
        path: /tmp/users.csv
      register: users
    - debug:
        var: users.list

gibt (gekürzt)

  users.list:
  - name: user1
    uid: '5000'
  - name: user2
    uid: '5001'

Ursprüngliche Antwort

Der Text ist weder gültiges JSON noch YAML. Sie müssen die Zeilen aufteilen und die Wörterbücher Zeile für Zeile lesen. Beispiel: Angesichts des Textes

users_str: |
  {name: user1, uid: 5000}
  {name: user2, uid: 5001}

die Aufgabe unten

    - set_fact:
        users_list: "{{ users_list|d([]) + [item|from_yaml] }}"
      loop: "{{ users_str.splitlines() }}"

erstellt die Liste der Wörterbücher

users_list:
  - name: user1
    uid: 5000
  - name: user2
    uid: 5001

Die Iteration ist jetzt trivial

    - debug:
        var: item.name
      loop: "{{ users_list }}"

gibt

  item.name: user1
  item.name: user2

verwandte Informationen