
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
그리고 사용Community.general.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이 아닙니다. 줄을 나누어 사전을 한 줄씩 읽어야 합니다. 예를 들어, 텍스트가 주어지면
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