json - 带有 to_nice_json : Unexpected templating type error occurred. ..not JSON 可序列化的 Ansible Vault 内联变量

标签 json templates ansible jinja2 ansible-vault

我通常通过在 vars/main.yml 中设置配置变量来配置我的项目。并通过 to_nice_json 将其中的一部分呈现为 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 时会出错。但是,如果我将内联 Vault 变量用双引号括起来,则不会发生解密,并且生成的 JSON 包含整个 Vault Blob。

我错过了什么吗? to_nice_json 是否存在此问题?过滤还是以错误的方式内联它?

最佳答案

作为此类问题的解决方法,将存储的值提取到单独的变量中(而不是字典中键的值):

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"

关于json - 带有 to_nice_json : Unexpected templating type error occurred. ..not JSON 可序列化的 Ansible Vault 内联变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50770524/

相关文章:

ansible从json文件中读取变量

Ansible 中的 Json 解析

javascript - 从 json 中提取值

c++ - (目标-)C++ 模板特化上的重复符号

ios - 如何从 JSON DarkSky swift 获取一天

c++ - 常量数组

c++ - 为什么派生类不能代替基类作为模板参数?

amazon-web-services - Ansible - 包含来自远程主机的 vars 文件

json - Bigtable/HBase : Rich column family vs a single JSON Object

php - 在 json 模式数据中包含 php 变量 - WordPress 站点 - 无效的 json 错误