Встроенная переменная Ansible Vault с to_nice_json: произошла непредвиденная ошибка типа шаблона ... не JSON-сериализуемый - PullRequest
0 голосов
/ 09 июня 2018

Обычно я настраиваю свои проекты с помощью переменных конфигурации в vars/main.yml и отрисовываю их подмножество в JSON через to_nice_json.

Рассмотрим пример vars/main.yaml, подобный приведенному ниже:

  # Application Configuration Settings.
  config:

    dev:
      # General Settings.
      logger_level: DEBUG

      # PostgreSQL Server Configuration Settings.
      sql_host: "localhost"
      sql_port: 5432
      sql_username: "someuser"
      sql_password: "somepassword"
      sql_db: "somedb"

, который я отрисовываю через шаблон Jinja2 и модуль template со следующим содержимым:

{{ config.dev | to_nice_json }}

Недавно я пытался использовать Ansible Vault для шифрования чувствительных битов,например, от sql_password до encrypt_string команды следующим образом:

ansible-vault encrypt_string --vault-id .ansible-vault-password "somepassword" --name 'sql_password'

и встроенная зашифрованная версия непосредственно в файл YAML, например:

# Application Configuration Settings.
config:

    dev:
      # General Settings.
      logger_level: DEBUG

      # PostgreSQL Server Configuration Settings.
      sql_host: "localhost"
      sql_port: 5432
      sql_username: "someuser"
      sql_password: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      35383832623937353934636538306539623336633336643430396662323161333838333463653764
      3839653635326166303636643664333466376236626137310a323839373862626237643162303535
      35333966383834356239376566356263656635323865323466306362323864356663383661333262
      3165643733633262650a663363653832373936383033306137633234626264353538356630336131
      3063
      sql_db: "somedb"

Однако, когда применяется фильтр to_nice_json, я получаю следующую ошибку:

fatal: [myrole]: FAILED! => {"changed": false, "msg": "AnsibleError: Unexpected templating type error occurred on ({{ config.dev | to_nice_json }}\n): somepassword' is not JSON serializable"}

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

Я что-то упустил?Эта проблема связана с фильтром to_nice_json или неправильно указана?

1 Ответ

0 голосов
/ 09 июня 2018

В качестве обходного пути для таких проблем извлеките хранилище в отдельную переменную (в отличие от значения ключа в словаре):

vars:
  my_sql_password: !vault | 
    $ANSIBLE_VAULT;1.1;AES256
    5383832623937353934636538306539623336633336643430396662323161333838333463653764
    3839653635326166303636643664333466376236626137310a323839373862626237643162303535
    35333966383834356239376566356263656635323865323466306362323864356663383661333262
    3165643733633262650a663363653832373936383033306137633234626264353538356630336131
    3063
  # Application Configuration Settings.
  config:
    dev:
      # General Settings.
      logger_level: DEBUG

      # PostgreSQL Server Configuration Settings.
      sql_host: "localhost"
      sql_port: 5432
      sql_username: "someuser"
      sql_password: "{{ my_sql_password }}"
      sql_db: "somedb"
...