Ansible - используя json, импортированный из Consul - PullRequest
1 голос
/ 28 мая 2019

У меня есть контент json на Консуле, который я импортирую в свою книгу игр. JSON содержит имена учетных записей и пароли:

{
    "account_1": "password_1",
    "account_2": "password_2",
    "account_3": "password_3"
}

После регистрации в переменной я хочу использовать каждое имя пользователя и пароль. Поскольку эти jsons могут содержать разное количество записей, я надеялся, что смогу использовать with_items для этого. Кто-нибудь может мне помочь?

Отладка всего json работает без проблем:

TASK [debug] **************************************************************************
ok: [localhost] => {
    "accountsDataFromConsul.data.Value": {
        "account_1": "password_1",
        "account_2": "password_2",
        "account_3": "password_3"
    }
}

Я пытаюсь добраться до отдельных записей (имена пользователей и пароли). Я попробовал приведенный ниже код, но он вернул только имена пользователей:

- debug:
    var: item
  with_items: "{{accountsDataFromConsul.data.Value}}"
TASK [debug] ******************************************************************************
ok: [localhost] => (item=account_1) => {
    "item": "account_1"
}
ok: [localhost] => (item=account_2) => {
    "item": "account_2"
}
ok: [localhost] => (item=account_3) => {
    "item": "account_3"
}

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Данные карты не могут быть повторены с помощью ансиблируемых циклов.

Посмотрите на фильтр dict2items .

#!/usr/bin/env ansible-playbook
- name: Lets munge some data
  hosts: localhost
  gather_facts: false
  become: false
  vars:
    my_dict:
      key_one: value_one
      key_two: value_two
    my_json: '{"key_one": "value_one", "key_two": "value_two"}'
  tasks:
  - name: Iterate over a dict
    debug:
      msg: "{{ item.key }} {{ item.value }}"
    loop: "{{ my_dict | dict2items }}"

  - name: Iterate over json
    debug:
      msg: "{{ item.key }} {{ item.value }}"
    loop: "{{ my_json | from_json | dict2items }}"


PLAY [Lets munge some data] *****************************************************************************************************************************************************************************************************

TASK [Iterate over a dict] ******************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'key_one', 'value': 'value_one'}) => {
    "msg": "key_one value_one"
}
ok: [localhost] => (item={'key': 'key_two', 'value': 'value_two'}) => {
    "msg": "key_two value_two"
}

TASK [Iterate over json] ********************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'key_one', 'value': 'value_one'}) => {
    "msg": "key_one value_one"
}
ok: [localhost] => (item={'key': 'key_two', 'value': 'value_two'}) => {
    "msg": "key_two value_two"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
0 голосов
/ 29 мая 2019

Спасибо, Владимир и Ник. Это работает отлично. Единственное, что мне нужно было сделать, это использовать from_json для моего вывода Консула.

- set_fact:
    jsonvar: "{{accountsDataFromConsul.data.Value | from_json}}"

- debug:
    msg: "{{ item.key }} {{ item.value }}"
  loop: "{{jsonvar | dict2items}}"
0 голосов
/ 28 мая 2019

для использования каждого имени пользователя и пароля

Игра ниже

vars:
  accountsDataFromConsul:
    data:
      Value:
        account_1: password_1
        account_2: password_2
        account_3: password_3
tasks:
  - debug:
      msg: "key: {{ item.key }} value: {{ item.value }}"
    loop: "{{ accountsDataFromConsul.data.Value|dict2items }}"

дает (сокращенно):

"msg": "key: account_1 value: password_1"
"msg": "key: account_3 value: password_3"
"msg": "key: account_2 value: password_2"
...