Как динамически заполнять параметры для роли ansible из файла json? - PullRequest
1 голос
/ 06 августа 2020

Я работаю над динамической передачей параметров / переменных роли ansible, читая их из файла JSON.

Рассмотрим следующий вызов роли (с дополнительными параметрами, такими как телефон, адрес, электронная почта , город)

- name: Ansible role | Create
  include_role:
    name: ansible-role-create-user
  vars:
    persons:
    - name: "john"
      phone:
      - name: "home"
        number: 9999
      - name: "mobile"
        number: "9898"
- name: Ansible role | Create
  include_role:
    name: ansible-role-create-user
  vars:
    persons:
    - name: "Doe"
      email: "johndoe@home.com"
      city: "Skyland"

Указанный выше код - это два варианта вызова роли. С его необязательными параметрами я пытаюсь прочитать эти данные из JSON и передать их роли

JSON, например: для вызова 1:

{
  "name": "John",
  "phone": 
  {
    {"name": "home",   number: "9999"},
    {"name": "mobile",   number: "9898"}
  }  
}

для вызова 2:

{
  "name": "Doe",
  "email": "johndoe@home.com",
  "city": "skyland"
}

Как было сказано ранее, я хотел бы прочитать примеры JSON файлов и динамически передавать их в качестве параметров роли. Пробовали читать файл в регистр и отправлять переменную в роль, но я столкнулся с ошибкой

{"msg" "" объект unicode "не имеет атрибута" name '"}

пример того, как я его отправляю

- name: cat json to file
  shell: cat jsonfile.json
  register: register_with_json
- name: Ansible role | Create
  include_role:
    name: ansible-role-create-user
  vars: "{{ register_with_json.stdout | from_json }}"

1 Ответ

0 голосов
/ 06 августа 2020

Есть еще варианты. Например, используйте include_vars. Роль и файлы

shell> cat roles/ar_create_user/tasks/main.yml
- debug:
    var: persons
shell> cat call1.yml 
persons:
  - name: "john"
    phone:
      - name: "home"
        number: 9999
      - name: "mobile"
        number: "9898"

shell> cat call2.yml 
persons:
  - name: "Doe"
    email: "johndoe@home.com"
    city: "Skyland"

с playbook

shell> cat playbook.yml
- hosts: localhost
  tasks:

    - include_vars: call1.yml
    - name: Ansible role | Create
      include_role:
        name: ar_create_user

    - include_vars: call2.yml
    - name: Ansible role | Create
      include_role:
        name: ar_create_user

дают (в сокращении)

shell> ansible-playbook playbook.yml

ok: [localhost] => 
  persons:
  - name: john
    phone:
    - name: home
      number: 9999
    - name: mobile
      number: '9898'

ok: [localhost] => 
  persons:
  - city: Skyland
    email: johndoe@home.com
    name: Doe

Q: «Мне нужно получить var (person) из JSON.»

A: Файлы ниже в JSON дают те же результаты

shell> cat call1.yml
{"persons": [
   {"name": "john",
    "phone": [
      {"name": "home",
       "number": 9999},
      {"name": "mobile",
       "number": "9898"}]
       }]
    }

shell> cat call2.yml
{"persons": [
   {"name": "Doe",
    "email": "johndoe@home.com",
    "city": "Skyland"}]
    }
...