Возможные проблемы подстановки переменных в файле JSON - PullRequest
0 голосов
/ 09 июля 2019

У меня есть файл JSON с информацией о пользователе, с помощью которого я хочу создать пользователя. Все работает нормально, если все в формате JSON - простой текст. Однако я хочу сохранить пароль в хранилище Ansible и прочитать его оттуда в моем JSON. Однако, когда я загружаю файл, переменная не заменяется паролем. Я могу напечатать переменную пароля, которая напечатала пароль в виде простого текста.

Мне нужно предоставить данные пользователя в виде объекта JSON одному из API, который создает пользователя с этой информацией. Мой пароль в хранилище. У меня есть переменная с хэш-ответом для этого пароля. Мой файл JSON выглядит следующим образом.

{"Users":
        [
            {  
              "databaseName" : "admin",
              "roles" : [ {    
                "databaseName" : "admin",
                "roleName" : "readAnyDatabase"
              } ],
              "username" : "AnsibleReadUser",
              "password" : "{{ apikey }}"
            },
            {  
              "databaseName" : "admin",
              "roles" : [ {    
                "databaseName" : "admin",
                "roleName" : "readWriteAnyDatabase"
              } ],
              "username" : "AnsibleReadWriteUser",
              "password" : "{{ apikey }}"
            }
        ]
}

Вот мое задание по загрузке файла JSON.

- name: Load Input files
  set_fact:
    userinfo_json: "{{ lookup('file', 'UserDetails.json') | from_json }}"

Когда я печатаю содержимое 'userinfo_json', переменная не подставляется.

 "msg": "UserDetails JSON: {'Users': [{'databaseName': 'admin', 'roles': [{'databaseName': 'admin', 'roleName': 'readAnyDatabase'}], 'username': 'AnsibleReadUser', 'password': '{{ apikey }}'}, {'databaseName': 'admin', 'roles': [{'databaseName': 'admin', 'roleName': 'readWriteAnyDatabase'}], 'username': 'AnsibleReadWriteUser', 'password': '{{ apikey }}'}]}"
}

Я хочу заменить {{apikey}} 'на значение переменной.

{"Users":
        [
            {  
              "databaseName" : "admin",
              "roles" : [ {    
                "databaseName" : "admin",
                "roleName" : "readAnyDatabase"
              } ],
              "username" : "AnsibleReadUser",
              "password" : "Password"
            },
            {  
              "databaseName" : "admin",
              "roles" : [ {    
                "databaseName" : "admin",
                "roleName" : "readWriteAnyDatabase"
              } ],
              "username" : "AnsibleReadWriteUser",
              "password" : "Password"
            }
        ]
}

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Ни lookup('file', ..., ни фильтр (from_yaml у меня не работает, from_jason не удалось) не расширяют переменные

  vars:
    apikey: my-secret-apikey
  tasks:
    - set_fact:
        userinfo_json: "{{ lookup('file', 'UserDetails.json') | from_yaml }}"
    - debug:
        msg: "{{ userinfo_json.Users|json_query('[*].password') }}"

Приведенные выше задачи дают

"msg": [
    "{{ apikey }}", 
    "{{ apikey }}"
]

Используйте include_vars вместо

  vars:
    apikey: my-secret-apikey  # replace with vault encrypted variable
  tasks:
    - name: Load Input files
      include_vars:
        file: UserDetails.json
        name: userinfo_json
    - debug:
        var: userinfo_json

Это дает

"userinfo_json": {
    "Users": [
        {
            "databaseName": "admin", 
            "password": "my-secret-apikey", 
            "roles": [
                {
                    "databaseName": "admin", 
                    "roleName": "readAnyDatabase"
                }
            ], 
            "username": "AnsibleReadUser"
        }, 
        {
            "databaseName": "admin", 
            "password": "my-secret-apikey", 
            "roles": [
                {
                    "databaseName": "admin", 
                    "roleName": "readWriteAnyDatabase"
                }
            ], 
            "username": "AnsibleReadWriteUser"
        }
    ]
}

Примечание. name: userinfo_json не обязательно. Если этот параметр не указан, список пользователей будет сохранен в переменной Users.

Тот же результат может быть достигнут с помощью vars_files

  vars:
    apikey: my-secret-apikey
  vars_files:
    - UserDetails.json
  tasks:
    - debug:
        var: Users

Q: "I was trying to load two files as below. But only anotherfileinfo_json has the json content and userinfo_json is empty."

- include_vars:
    file: UserDetails.json
    name: userinfo_json
    file: AnotherFile.json
    name: anotherfileinfo_json

A: Глядя на Примеры , задача ниже должна работать

  - include_vars: "{{ lookup('file', my_files) }}"
    vars:
      my_files:
        - UserDetails.json
        - AnotherFile.json
0 голосов
/ 09 июля 2019

Я хочу заменить {{apikey}} 'на значение переменной.

Тогда вам нужно будет использовать поиск template,не file;file просто читает в буквальном тексте

Вы также захотите быть предельно осторожными при выполнении подстановки строк в файл JSON, особенно строк пароля, поскольку jinja2 не знает, что ваш документэто JSON.Таким образом, пароль abc"def будет отображаться в вашем документе как "password": "abc"def", что является недействительным.Есть несколько методов, чтобы обойти эту проблему, и, возможно, они не относятся к вам, так как это «apikey» (в соответствии с именами ваших переменных), но просто имейте в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...