Ansible: 문자열을 사전으로 변환

Ansible: 문자열을 사전으로 변환

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

관련 정보