如何使用 Ansible 编写 JSON 文件

Jan*_*uka 6 json ansible

我需要使用 Ansible 使用该shell模块编写一个 JSON 文件。

但它给出了这个错误:

任务 [生成证书] ************************************************* ************* 致命:[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 : 确定=2 更改=1 无法访问=0 失败=1 已跳过=0 已获救=0 已忽略=0

这是这个的剧本:

---
- 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                               
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我更多有关此错误及其发生原因的信息吗?

β.ε*_*.βε 11

因此,如果您确实想将数据保留在 playbook 本身中,您可以做的是将 JSON 数据转换为YAML 字典中的JSON 数据。

实际 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
Run Code Online (Sandbox Code Playgroud)

然后,基于此,您可以简单地在其之上应用一个to_json过滤器copy,然后再使用带有content参数的模块。

所以给出这个任务:

- copy:
    dest: kube-controller-manager-csr.json
    content: "{{ certificate | to_json }}" 
  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    
Run Code Online (Sandbox Code Playgroud)

我们最终得到这个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"}]}
Run Code Online (Sandbox Code Playgroud)

一些额外的注意事项:

  • 在这里,JSON 并不是真正人类可读的(全部都在一行中)。如果这给您带来了问题,您可以从使用to_json过滤器切换为使用to_nice_json过滤器
  • YAML 是 JSON 的自然超集,这意味着您实际上可以使用 JSON 结构作为有效的 YAML 变量。
    不过,我不会这样做,因为我发现在 YAML 文件中混合两种语言很奇怪,但如果你个人认为没有反对意见,那么这个甚至不使用过滤器的剧本to_json也是一个有效的剧本:
    - copy:
        dest: kube-controller-manager-csr.json
        content: "{{ certificate }}" 
      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"
            }
          ]
        }
    
    Run Code Online (Sandbox Code Playgroud)