{"id":3532,"date":"2023-07-17T07:00:00","date_gmt":"2023-07-17T05:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=3532"},"modified":"2023-07-17T20:49:13","modified_gmt":"2023-07-17T18:49:13","slug":"mit-ansible-ueber-yaml-lists-and-dictionaries-iterieren","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/mit-ansible-ueber-yaml-lists-and-dictionaries-iterieren\/","title":{"rendered":"Mit Ansible \u00fcber YAML Lists and Dictionaries iterieren"},"content":{"rendered":"\n<p>In diesem Artikel beschreibe ich die beiden Ansible-Variablen-Typen <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_variables.html#list-variables\">\u201eList variables\u201c<\/a> und <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_variables.html#dictionary-variables\">\u201eDictionary variables\u201c<\/a> sowie die Kombination beider Typen. Ich zeige mit einem einfachen Playbook, wie diese Variablen-Typen in einer Schleife (eng. loop) durchlaufen werden k\u00f6nnen.<\/p>\n\n\n\n<p>W\u00e4hrend der Text mir zur \u00dcbung und Erinnerung dient, hoffe ich, dass er f\u00fcr die Einsteiger unter euch eine hilfreiche Einf\u00fchrung bietet. F\u00fcr weiterf\u00fchrende Informationen verlinke ich im Text direkt auf die Ansible-Dokumentation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">List<\/h2>\n\n\n\n<p>Eine Liste ist eine Variable mit einem Namen und einem bis mehreren Werten. Folgender Code-Block zeigt die List-Variable namens <code>list<\/code> mit ihren zwei Werten:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>list:\n  - Alice Cooper\n  - Bob Marley<\/code><\/pre>\n\n\n\n<p>Die Einr\u00fcckung der Werte ist wichtig. Sie erh\u00f6ht nicht nur die Lesbarkeit, sondern vermeidet auch <a href=\"https:\/\/de.wikipedia.org\/wiki\/Lint_(Programmierwerkzeug)\">Lint-Fehler<\/a> bei der Anwendung von <code>ansible-lint<\/code>. Bedauerlicherweise l\u00e4uft euer Playbook auch, wenn ihr die Werte nicht einr\u00fcckt, doch bitte ich euch, euch diesen schlechten Stil nicht anzugew\u00f6hnen.<\/p>\n\n\n\n<p>Listen sind mit Arrays verwand. Sie besitzen einen Index, welcher bei 0 beginnt und f\u00fcr jedes Listen-Element (f\u00fcr jeden Wert) um 1 inkrementiert wird. Folgendes Beispiel zeigt, wie man das Listen-Element mit dem Wert \u201eAlice Cooper\u201c der <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_variables.html#simple-variables\">einfachen Variable<\/a> <code>favorit<\/code> zuweisen kann:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>favorit: \"{{ list&#91;0] }}\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Dictionary<\/h2>\n\n\n\n<p>Ein Dictionary speichert Daten in Schl\u00fcssel-Wert-Paaren (excuse my German). Dabei darf der Wert eines Dictionary wiederum ein Dictionary sein.<\/p>\n\n\n\n<p>Ein einfaches Dictionary sieht wie folgt aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Felder:\n  Feld1: 10ha\n  Feld2: 40ha<\/code><\/pre>\n\n\n\n<p>M\u00f6chte man z.B. auf den Wert des Schl\u00fcssels <code>Feld2<\/code> aus dem Dictionary <code>Felder<\/code> zugreifen, geht dies wie folgt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mein_feld: \"{{ Felder&#91;'Feld2'] }}\"\n# oder\nmein_feld: \"{{ Felder.Feld2 }}\"<\/code><\/pre>\n\n\n\n<p>Die beiden folgenden Code-Bl\u00f6cke zeigen zwei Beispiele f\u00fcr etwas komplexere Dictionaries, \u00fcber die ich sp\u00e4ter iterieren werde:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dict:\n  Alice:\n    last_name: Cooper\n    job: singer\n  Bob:\n    last_name: Marley\n    job: singer<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>virtual_machines_with_params:\n  vm1:\n    cpu_count: 2\n    memory_mb: 2048\n    guest_os: rhel8\n  vm2:\n    cpu_count: 2\n    memory_mb: 1024\n    guest_os: rhel9<\/code><\/pre>\n\n\n\n<p>Auch hier ist die Einr\u00fcckung sehr wichtig. Macht man dabei einen Fehler, f\u00e4ngt man sich einen Syntax-Fehler bei der Ausf\u00fchrung des Playbooks ein.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">List of Dictionaries<\/h2>\n\n\n\n<p>Beide zuvor beschriebenen Variablen-Typen k\u00f6nnen miteinander kombiniert werden. Folgendes Beispiel zeigt eine Liste von Dictionaries:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>list_of_dicts:\n  - first_name: Alice\n    last_name: Cooper\n    job: singer\n  - first_name: Bob\n    last_name: Marley\n    job: singer<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Syntaxfehler<\/h2>\n\n\n\n<p>In Ansible und YAML spielt die Einr\u00fcckung von Code eine sehr wichtige Rolle. Des Weiteren ist bei der Kombination von Variablen-Typen nicht alles erlaubt. Folgender Code-Block zeigt ein fehlerhaftes Beispiel und die Fehlermeldungen, die es generiert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ cat nonsense.yml \n---\nnonsense:\n - first_name: Alice\n     last_name: Cooper\n     job: singer\n - first_name: Bob\n     last_name: Marley\n     job: singer\n\n$ ansible-lint nonsense.yml\nWARNING  Listing 1 violation(s) that are fatal\nload-failure: Failed to load YAML file\nnonsense.yml:1 mapping values are not allowed in this context\n  in \"&lt;unicode string&gt;\", line 4, column 15\n\n\n             Rule Violation Summary              \n count tag          profile rule associated tags \n     1 load-failure min     core, unskippable    \n\nFailed after : 1 failure(s), 0 warning(s) on 1 files.<\/code><\/pre>\n\n\n\n<p><em>Tipp:<\/em> Um Fehler bei der Eingabe zu vermeiden, habe ich meinen Editor Vim mit folgenden Optionen konfiguriert: <code>set ts=2 sts=2 sw=2 et ai cursorcolumn<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"playbook\">Playbook<\/h2>\n\n\n\n<p>Das folgende Playbook nutzt das Modul<a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/ansible\/builtin\/debug_module.html\"> ansible.builtin.debug<\/a>, um Werte der genannten Variablen-Typen auszugeben. Es zeigt dabei, wie diese Variablen in einer Schleife durchlaufen werden k\u00f6nnen.<\/p>\n\n\n\n<p>Damit es \u00fcbersichtlich bleibt, nutze ich <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_tags.html\">Tags<\/a>, um die Tasks im Playbook einzeln ausf\u00fchren zu k\u00f6nnen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ cat output_dicts_and_lists.yml \n---\n- name: Output content of dicts_and_lists.yml\n  hosts: localhost\n  gather_facts: false\n  become: false\n  vars_files:\n    - dicts_and_lists.yml\n  tasks:\n    - name: Task 1 Ouput all vars in dicts_and_lists.yml\n      loop:\n        - \"{{ list }}\"\n        - \"{{ dict }}\"\n        - \"{{ list_of_dicts }}\"\n      ansible.builtin.debug:\n        var: item\n      tags:\n        - dicts_and_lists\n\n    - name: Task 2 Loop over some list\n      loop: \"{{ list }}\"\n      ansible.builtin.debug:\n        msg: \"Name: {{ item }}\"\n      tags:\n        - list\n\n    - name: Task 3 Loop over some dictionary\n      loop: \"{{ dict | dict2items }}\"\n      ansible.builtin.debug:\n        msg: \"Firstname: {{ item.key }} Lastname: {{ item.value.last_name }}\"\n      tags:\n        - dict\n\n    - name: Task 4 Loop over some list_of_dicts\n      loop: \"{{ list_of_dicts }}\"\n      ansible.builtin.debug:\n        msg: \"Firstname: {{ item.first_name }} Lastname: {{ item.last_name }}\"\n      tags:\n        - list_of_dicts<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Task 1: Ouput all vars in dicts_and_lists.yml<\/h3>\n\n\n\n<p>Dies ist der erste Task aus obigem Playbook. Er gibt die Werte der Variablen <code>list<\/code>, <code>dic<\/code>t und <code>list_of_dicts<\/code> aus. Diese habe ich als Liste an <code>loop<\/code> \u00fcbergeben (siehe <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_loops.html\">Loops<\/a> in der Dokumentation).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ansible-playbook output_dicts_and_lists.yml --tags dicts_and_lists\n\u2026\nPLAY &#91;Output content of dicts_and_lists.yml] ***********************************\n\nTASK &#91;Task 1 Ouput all vars in dicts_and_lists.yml] ****************************\nok: &#91;localhost] =&gt; (item=&#91;'Alice Cooper', 'Bob Marley']) =&gt; {\n    \"ansible_loop_var\": \"item\",\n    \"item\": &#91;\n        \"Alice Cooper\",\n        \"Bob Marley\"\n    ]\n}\nok: &#91;localhost] =&gt; (item={'Alice': {'last_name': 'Cooper', 'job': 'singer'}, 'Bob': {'last_name': 'Marley', 'job': 'singer'}}) =&gt; {\n    \"ansible_loop_var\": \"item\",\n    \"item\": {\n        \"Alice\": {\n            \"job\": \"singer\",\n            \"last_name\": \"Cooper\"\n        },\n        \"Bob\": {\n            \"job\": \"singer\",\n            \"last_name\": \"Marley\"\n        }\n    }\n}\nok: &#91;localhost] =&gt; (item=&#91;{'first_name': 'Alice', 'last_name': 'Cooper', 'job': 'singer'}, {'first_name': 'Bob', 'last_name': 'Marley', 'job': 'singer'}]) =&gt; {\n    \"ansible_loop_var\": \"item\",\n    \"item\": &#91;\n        {\n            \"first_name\": \"Alice\",\n            \"job\": \"singer\",\n            \"last_name\": \"Cooper\"\n        },\n        {\n            \"first_name\": \"Bob\",\n            \"job\": \"singer\",\n            \"last_name\": \"Marley\"\n        }\n    ]\n}\n\nPLAY RECAP *********************************************************************\nlocalhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0<\/code><\/pre>\n\n\n\n<p>In der Ausgabe ist zu erkennen, dass Listen mit <code>[ ]<\/code> und Dictonaries mit <code>{ }<\/code> umschlossen werden. Der folgende Code-Block zeigt zum Vergleich den Inhalt der Datei <code>dicts_and_lists.yml<\/code>. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\nlist:\n  - Alice Cooper\n  - Bob Marley\n\ndict:\n  Alice:\n    last_name: Cooper\n    job: singer\n  Bob:\n    last_name: Marley\n    job: singer\n\nlist_of_dicts:\n  - first_name: Alice\n    last_name: Cooper\n    job: singer\n  - first_name: Bob\n    last_name: Marley\n    job: singer<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Task 2: Loop over some list<\/h3>\n\n\n\n<p>Als N\u00e4chstes schauen wir uns die Ausgabe von Task 2 an, welcher lediglich die einzelnen Listenelemente nacheinander ausgibt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ansible-playbook output_dicts_and_lists.yml --tags list\nPLAY &#91;Output content of dicts_and_lists.yml] ***********************************\n\nTASK &#91;Task 2 Loop over some list] **********************************************\nok: &#91;localhost] =&gt; (item=Alice Cooper) =&gt; {\n    \"msg\": \"Name: Alice Cooper\"\n}\nok: &#91;localhost] =&gt; (item=Bob Marley) =&gt; {\n    \"msg\": \"Name: Bob Marley\"\n}\n\nPLAY RECAP *********************************************************************\nlocalhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0<\/code><\/pre>\n\n\n\n<p>Die Variable <code>item<\/code> referenziert das jeweils aktuelle Element der Liste, welche mit <code>loop<\/code> durchlaufen wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Task 3: Loop over some dictionary<\/h3>\n\n\n\n<p>Um Scrollen zu vermeiden, zeigten die beiden folgenden Code-Bl\u00f6cke noch einmal den entsprechenden Task aus <a href=\"#playbook\">obigem Playbook<\/a> und das Dictionary, welches f\u00fcr dieses Beispiel benutzt wird. Der dritte Code-Block zeigt dann die dazugeh\u00f6rige Ausgabe.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    - name: Task 3 Loop over some dictionary\n      loop: \"{{ dict | dict2items }}\"\n      ansible.builtin.debug:\n        msg: \"Firstname: {{ item.key }} Lastname: {{ item.value.last_name }}\"\n      tags:\n        - dict<\/code><\/pre>\n\n\n\n<p>Bevor ein Dictionary mit <code>loop<\/code> verarbeitet werden kann, muss es in eine Liste transformiert werden. Dies geschieht mit Hilfe des Filters <code><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_filters.html#dict-filter\">dict2items<\/a><\/code>.<\/p>\n\n\n\n<p>In einigen \u00e4lteren Playbooks sieht man statt <code>loop<\/code> ein Lookup-Plugin in der Form <code>with_dict: \"{{ dict }}\"<\/code>. Dies ist ebenfalls korrekt, heute jedoch nicht mehr gebr\u00e4uchlich.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dict:\n  Alice:\n    last_name: Cooper\n    job: singer\n  Bob:\n    last_name: Marley\n    job: singer<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ansible-playbook output_dicts_and_lists.yml --tags dict\n\nPLAY &#91;Output content of dicts_and_lists.yml] ***********************************\n\nTASK &#91;Task 3 Loop over some dictionary] *****************************************\nok: &#91;localhost] =&gt; (item={'key': 'Alice', 'value': {'last_name': 'Cooper', 'job': 'singer'}}) =&gt; {\n    \"msg\": \"Firstname: Alice Lastname: Cooper\"\n}\nok: &#91;localhost] =&gt; (item={'key': 'Bob', 'value': {'last_name': 'Marley', 'job': 'singer'}}) =&gt; {\n    \"msg\": \"Firstname: Bob Lastname: Marley\"\n}\n\nPLAY RECAP *********************************************************************\nlocalhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Task 4: Loop over some list_of_dicts<\/h3>\n\n\n\n<p>Auch hier sind Dictionaries involviert, doch wird kein Filter <code>dict2items<\/code> ben\u00f6tigt, da es sich bereits um eine Liste handelt, welche an <code>loop<\/code> \u00fcbergeben wird.<\/p>\n\n\n\n<p>Die drei folgenden Code-Bl\u00f6cke zeigen die verwendete Liste, den Task aus obigem Playbook und die Ausgabe.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>list_of_dicts:\n  - first_name: Alice\n    last_name: Cooper\n    job: singer\n  - first_name: Bob\n    last_name: Marley\n    job: singer<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>    - name: Task 4 Loop over some list_of_dicts\n      loop: \"{{ list_of_dicts }}\"\n      ansible.builtin.debug:\n        msg: \"Firstname: {{ item.first_name }} Lastname: {{ item.last_name }}\"\n      tags:\n        - list_of_dicts<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ansible-playbook output_dicts_and_lists.yml --tags list_of_dicts\n\nPLAY &#91;Output content of dicts_and_lists.yml] ***********************************\n\nTASK &#91;Loop over some list_of_dicts] ********************************************\nok: &#91;localhost] =&gt; (item={'first_name': 'Alice', 'last_name': 'Cooper', 'job': 'singer'}) =&gt; {\n    \"msg\": \"Firstname: Alice Lastname: Cooper\"\n}\nok: &#91;localhost] =&gt; (item={'first_name': 'Bob', 'last_name': 'Marley', 'job': 'singer'}) =&gt; {\n    \"msg\": \"Firstname: Bob Lastname: Marley\"\n}\n\nPLAY RECAP *********************************************************************\nlocalhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0<\/code><\/pre>\n\n\n\n<p>Auch hier ist wieder an den <code>{ }<\/code> zu erkennen, dass <code>item<\/code> jeweils eine Liste enth\u00e4lt. Der Zugriff auf die Werte geschieht durch die Referenzierung des jeweiligen Schl\u00fcssel-Namens. So ist z.B. Alice der Wert des Schl\u00fcssels <code>first_name<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bonusmaterial: Lists in Dicts<\/h2>\n\n\n\n<p>J\u00f6rn hat ein weiteres Beispiel beigesteuert. Da die Kommentarfunktion von WordPress  den Code nicht sauber darstellt, spendiere ich J\u00f6rn eine eigene \u00dcberrschrift und baue sein Beispiel hier ein.<\/p>\n\n\n\n<p>J\u00f6rns Datenstruktur sieht wie folgt aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dict_of_lists:\n  - name: foo \n    elems:\n      - foo one \n      - foo two \n      - foo three\n  - name: bar \n    elems:\n      - bar one \n      - bar two \n  - name: baz \n    elems:\n      - baz one \n      - baz two \n      - baz three<\/code><\/pre>\n\n\n\n<p>J\u00f6rn m\u00f6chte nun zuerst auf alle Elemente (<code>elems<\/code>) von <code>foo<\/code> zugreifen, dann auf jene von <code>bar<\/code> usw. Dazu nutzt J\u00f6rn das <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/ansible\/builtin\/subelements_lookup.html\">Lookup Plugin subelements<\/a>.<\/p>\n\n\n\n<p>Folgender Code-Block nutzt die Datenstruktur in einem Playbook, um die verschachtelten Elemente auszugeben. Aufruf und Ausgabe zeigt der darauf folgende Block.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\n- name: Lists in dicts\n  hosts: localhost\n  become: false\n  vars:\n    dict_of_lists:\n      - name: foo\n        elems:\n          - foo one\n          - foo two\n          - foo three\n      - name: bar\n        elems:\n          - bar one\n          - bar two\n      - name: baz\n        elems:\n          - baz one\n          - baz two\n          - baz three\n\n  tasks:\n    - name: Loop over lists in dicts\n      ansible.builtin.debug:\n        msg: \"Name: {{ item.0.name }}, element {{ item.1 }}\"\n      loop: \"{{ dict_of_lists | subelements('elems') }}<\/code><\/pre>\n\n\n\n<p>Und hier nun der Playbook-Aufruf mit Ausgabe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ansible-playbook dict_of_lists.yml\n\nPLAY &#91;Lists in dicts] ************************************************************************\n\nTASK &#91;Gathering Facts] ************************************************************************\nok: &#91;localhost]\n\nTASK &#91;Loop over lists in dicts] ************************************************************************\nok: &#91;localhost] => (item=&#91;{'name': 'foo', 'elems': &#91;'foo one', 'foo two', 'foo three']}, 'foo one']) => {\n    \"msg\": \"Name: foo, element foo one\"\n}\nok: &#91;localhost] => (item=&#91;{'name': 'foo', 'elems': &#91;'foo one', 'foo two', 'foo three']}, 'foo two']) => {\n    \"msg\": \"Name: foo, element foo two\"\n}\nok: &#91;localhost] => (item=&#91;{'name': 'foo', 'elems': &#91;'foo one', 'foo two', 'foo three']}, 'foo three']) => {\n    \"msg\": \"Name: foo, element foo three\"\n}\nok: &#91;localhost] => (item=&#91;{'name': 'bar', 'elems': &#91;'bar one', 'bar two']}, 'bar one']) => {\n    \"msg\": \"Name: bar, element bar one\"\n}\nok: &#91;localhost] => (item=&#91;{'name': 'bar', 'elems': &#91;'bar one', 'bar two']}, 'bar two']) => {\n    \"msg\": \"Name: bar, element bar two\"\n}\nok: &#91;localhost] => (item=&#91;{'name': 'baz', 'elems': &#91;'baz one', 'baz two', 'baz three']}, 'baz one']) => {\n    \"msg\": \"Name: baz, element baz one\"\n}\nok: &#91;localhost] => (item=&#91;{'name': 'baz', 'elems': &#91;'baz one', 'baz two', 'baz three']}, 'baz two']) => {\n    \"msg\": \"Name: baz, element baz two\"\n}\nok: &#91;localhost] => (item=&#91;{'name': 'baz', 'elems': &#91;'baz one', 'baz two', 'baz three']}, 'baz three']) => {\n    \"msg\": \"Name: baz, element baz three\"\n}\n\nPLAY RECAP ************************************************************************\nlocalhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Das waren nun eine Menge Code-Bl\u00f6cke. Mir hat es geholfen, dieses Thema noch einmal zu rekapitulieren. Listen k\u00f6nnen direkt an <code>loop<\/code> \u00fcbergeben werden. Dictionaries m\u00fcssen zuerst den Filter <code>dict2items<\/code> durchlaufen.<\/p>\n\n\n\n<p>In diesem Text wurden noch nicht alle F\u00e4lle besprochen. So wurden <em>nested lists<\/em> und tiefer verschachtelte Dictionaries ausgespart, um den Artikel nicht noch mehr in die L\u00e4nge zu ziehen.<\/p>\n\n\n\n<p>Ich hoffe, der Text war auch f\u00fcr die Anf\u00e4nger und Einsteiger unter euch hilfreich.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Artikel beschreibe ich die beiden Ansible-Variablen-Typen \u201eList variables\u201c und \u201eDictionary variables\u201c sowie die Kombination beider Typen. Ich zeige mit einem einfachen Playbook, wie diese Variablen-Typen in einer Schleife (eng. loop) durchlaufen werden k\u00f6nnen. W\u00e4hrend der Text mir zur \u00dcbung und Erinnerung dient, hoffe ich, dass er f\u00fcr die Einsteiger unter euch eine hilfreiche<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/mit-ansible-ueber-yaml-lists-and-dictionaries-iterieren\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[532],"tags":[789,787,788],"class_list":["post-3532","post","type-post","status-publish","format-standard","hentry","category-ansible","tag-datenstrukturen","tag-dicts","tag-lists"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=3532"}],"version-history":[{"count":8,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3532\/revisions"}],"predecessor-version":[{"id":3573,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3532\/revisions\/3573"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=3532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=3532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=3532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}