如何使用Ansible编写JSON文件

5
我需要使用Ansible的 shell 模块编写一个JSON文件,但却出现了以下错误:

TASK [Generate certs] ********************************************************** fatal: [xxx.xxx.xx.xxx]: FAILED! => {"changed": 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": "non-zero return code", "rc": 1, "start": "2020-08-14 16:26:35.627640", "stderr": "Failed to load config file: {"code":5200,"message":"could not read configuration file"}Failed to parse input: unexpected end of JSON input", "stderr_lines": ["Failed to load config file: {"code":5200,"message":"could not read configuration file"}Failed to parse input: unexpected end of JSON input"], "stdout": "", "stdout_lines": []} PLAY RECAP ********************************************************************* 35.246.9.221 : ok=2 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=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                               

有人能告诉我更多关于这个错误以及为什么会发生吗?


1
(a) 你有 ca-config.json 文件并确保 是健康的吗? (b) 当你实际上需要 copy: with content: 时,你正在滥用 shell: 命令 - 复制:dest:kube-controller-manager-csr.json content:"在此处输入你的JSON" (对于评论不支持换行表示歉意) - mdaniel
1
就像@mdaniel所说的那样,或者如果你真的想在playbook中使用json,可以将其制作成YAML字典,然后在使用copy时应用to_json过滤器,并设置content: "{{ my_var | to_json }}" - β.εηοιτ.βε
@β.εηοιτ.βε,你能给我一个小例子吗?我对ansible还不熟悉。 - Jananath Banuka
@β.εηοιτ.βε 在这里,“my_var”是什么意思?我应该把它放在哪里? - Jananath Banuka
1个回答

10

如果您真的想将数据保留在playbook中,您可以将JSON数据转换为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过滤器,然后使用带有content参数的copy模块。

因此,考虑到这个任务:

- 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    

我们最终得到了这个 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 过滤器
  • YAML 是 JSON 的自然超集, 这意味着您实际上可以将 JSON 结构用作有效的 YAML 变量。
    虽然我不会这样做,因为我觉得在 YAML 文件中混合两种语言很奇怪,但如果您个人认为没有异议,那么这个 Playbook,甚至不使用 to_json 过滤器,也是一个可行的 Playbook:
    - 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"
            }
          ]
        }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接