【问题标题】:How to write a json file using ansible如何使用 ansible 编写 json 文件
【发布时间】:2020-08-14 16:33:31
【问题描述】:

我需要使用ansible写一个json文件

所以我使用了ansible shell 模块。

但它给出了这个错误:

任务 [生成证书] ****************************************** ****************** 致命:[xxx.xxx.xx.xxx]:失败! => {“更改”:true,“cmd”:“cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager- csr.json | cfssljson -bare kube-controller-manager \n", "delta": "0:00:00.015363", "end": "2020-08-14 16:26:35.643003", "msg": "非零返回码”,“rc”:1,“start”:“2020-08-14 16:26:35.627640”,“stderr”:“加载配置文件失败:{“code”:5200,“message ":"无法读取配置文件"}解析输入失败:JSON 输入意外结束", "stderr_lines": ["加载配置文件失败:{"code":5200,"message":"无法读取配置文件“}无法解析输入:JSON输入意外结束”],“stdout”:“”,“stdout_lines”:[]} 播放回顾 ****************************************************** ************************ 35.246.9.221 : ok=2 changed=1 unreachable=0 failed=1 skipped=0 已获救=0ignore=0

这是playbook

---
- hosts: kube_master
  tasks:
    - name: Create kube-controller-manager.pem &kube-controller-manager-key.pem
      # become: true      
      shell: |
        cat > kube-controller-manager-csr.json << EOF
        {
          "CN": "system:kube-controller-manager",
          "key": {
            "algo": "rsa",
            "size": 2048
          },
          "names": [
            {
              "C": "US",
              "L": "Portland",
              "O": "system:kube-controller-manager",
              "OU": "Kubernetes The Hard Way",
              "ST": "Oregon"
            }
          ]
        }
        EOF        
                 

    - name: Generate certs
      shell: |
        cfssl gencert \
        -ca=ca.pem \
        -ca-key=ca-key.pem \
        -config=ca-config.json \
        -profile=kubernetes \
        kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager                               

谁能告诉我这个错误是什么以及为什么会发生?

【问题讨论】:

  • (a) 你有ca-config.json 并且你确保 是理智的吗? (b) 你在滥用shell: 命令,而你真正想要的是copy: with content: - copy: dest: kube-controller-manager-csr.json content: "put your JSON here" (很抱歉 cmets 不支持换行符)
  • 就像@mdaniel 说的那样,或者如果你真的想在剧本中使用你的json,请将其设为a dictionary in YAML,然后在使用copycontent: "{{ my_var | to_json }}" 时应用to_json filter to it
  • @β.εηοιτ.βε 你能给我一个小例子吗?我是ansible的新手@
  • @β.εηοιτ.βε my_var 是什么意思?我应该把它放在哪里?

标签: json ansible


【解决方案1】:

因此,如果您真的想将数据保留在剧本本身中,您可以做的是将您的 JSON 数据转换为 dictionary in YAML

实际 JSON 的等效表示是:

certificate: 
  CN: system:kube-controller-manager
  key: 
    algo: rsa
    size: 2048
  names:
    - C: US
      L: Portland
      O: system:kube-controller-manager
      OU: Kubernetes The Hard Way
      ST: Oregon

然后,基于此,您可以简单地在其上应用 to_json filter,然后使用带有 content 参数的 copy 模块。

所以鉴于这个剧本:

- hosts: all
  gather_facts: no
  vars: 
    certificate: 
      CN: system:kube-controller-manager
      key: 
        algo: rsa
        size: 2048
      names:
        - C: US
          L: Portland
          O: system:kube-controller-manager
          OU: Kubernetes The Hard Way
          ST: Oregon
      
  tasks:
    - copy:
        dest: kube-controller-manager-csr.json
        content: "{{ certificate | to_json }}" 

我们结束了这个回顾:

PLAY [all] **********************************************************************************************************

TASK [copy] *********************************************************************************************************
changed: [localhost]

PLAY RECAP **********************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

还有这个 kube-controller-manager-csr.json 文件

{"CN": "system:kube-controller-manager", "key": {"algo": "rsa", "size": 2048}, "names": [{"C": "US", "L": "Portland", "O": "system:kube-controller-manager", "OU": "Kubernetes The Hard Way", "ST": "Oregon"}]}

一些额外说明:

  • 在这里,JSON 并不是真正的人类可读的(全部都在一行中)。如果这导致您出现问题,您可以从使用 to_json 过滤器切换到使用 to_nice_json filter
  • YAML is a natural superset of JSON,这意味着您实际上可以使用 JSON 结构作为有效的 YAML 变量。
    不过,我不会这样做,因为我觉得在 YAML 文件中混合两种语言很奇怪,但如果你个人认为没有反对意见,这个甚至没有使用 to_json 过滤器的剧本也是一个工作一:
    - hosts: all
      gather_facts: no
      vars: 
        certificate: {
          "CN": "system:kube-controller-manager",
          "key": {
            "algo": "rsa",
            "size": 2048
          },
          "names": [
            {
              "C": "US",
              "L": "Portland",
              "O": "system:kube-controller-manager",
              "OU": "Kubernetes The Hard Way",
              "ST": "Oregon"
            }
          ]
        }
    
      tasks:
        - copy:
            dest: kube-controller-manager-csr.json
            content: "{{ certificate }}" 
    

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2013-12-27
    • 2016-05-31
    • 2017-07-29
    • 2020-12-15
    • 2018-12-15
    相关资源
    最近更新 更多