
Tower から Ansible を起動し、新しいユーザーをテキストとして入力します。
{ name: user1, uid: 5000 }
{ name: user2, uid: 5001 }
次のような辞書として、これらのユーザーを反復処理したいと思います。
- name: Print vars
debug:
var: "{{ item.name }}"
with_items: "{{ users.split('\n') }}"
しかし、それは機能しません:
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!"
}
その文字列を実際の辞書に変換する方法をご存知ですか? よろしくお願いします!
答え1
アップデート
以下の表現
users_list: "{{ users_str.splitlines()|map('from_yaml')|list }}"
与える
users_list:
- name: user1
uid: 5000
- name: user2
uid: 5001
変数を次のように宣言します適切な。
テスト用の完全なプレイブックの例
- 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
オプションで、データをCSVファイルに保存します
shell> cat /tmp/users.csv
name,uid
user1,5000
user2,5001
使用してコミュニティ.一般.read_csvそれを読む
- hosts: localhost
tasks:
- community.general.read_csv:
path: /tmp/users.csv
register: users
- debug:
var: users.list
与える(要約)
users.list:
- name: user1
uid: '5000'
- name: user2
uid: '5001'
元の回答
テキストは有効なJSONでもYAMLでもありません。行を分割して辞書を1行ずつ読み取る必要があります。たとえば、次のテキストがあるとします。
users_str: |
{name: user1, uid: 5000}
{name: user2, uid: 5001}
以下のタスク
- set_fact:
users_list: "{{ users_list|d([]) + [item|from_yaml] }}"
loop: "{{ users_str.splitlines() }}"
辞書のリストを作成する
users_list:
- name: user1
uid: 5000
- name: user2
uid: 5001
反復は今では簡単だ
- debug:
var: item.name
loop: "{{ users_list }}"
与える
item.name: user1
item.name: user2