如何使用clojure生成一个yaml文件,而不是创建一个esxi vmmachine?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用clojure生成一个yaml文件,而不是创建一个esxi vmmachine?相关的知识,希望对你有一定的参考价值。

当我使用ansible时,我发现ping.yml都可以正常工作:

- hosts: 172.16.10.104 
- tasks: 
  - name:   
    ping: ''

- hosts: 172.16.10.104 
  tasks: 
  - name:   
    ping: ''

这意味着如果任务是一个yaml列表,它都可以正常工作

但如果我写一个yaml文件来创建这样的vm:

- hosts: localhost
  tasks:
    name: ''
      vmware_guest:
      hostname: 
      cluster: 
      name: testvm_6
      validate_certs: 'no'
      template: ubuntu16
      password: 
      disk:
      - size_gb: '200'
        type: thin
        datastore: JH5020VMSAS01
      datacenter: thevmware
      folder: /
      username: 
   delegate_to: localhost
   register: deploy

我已经尝试了很多次,似乎只有任务不是列表,这意味着它不是“ - 任务”,yaml文件可以工作,如果它是“ - 任务”,我收到一个错误:字段'主机'是必需的,但未设定

我使用clojure和clojure项目https://github.com/owainlewis/yaml来生成yaml文件,那么两个如何修复问题呢?

是否有一种可以修复主机问题的安全方式?

或者是否有一种clojure方式,可以生成yaml文件,主机之后的任务不能是一个列表?我试过但失败了:

  (def data [{:hosts "172.16.10.104",
         {:tasks [{:name "ping",:ping ""}]}}])

得到错误:地图文字必须包含偶数

如果我写这个:

(def data [
         {:hosts "localhost"}
          {:tasks
           [{:name "",
             :vmware_guest
                   {:hostname "172.16.10.15",
                    :username "",
                    :password "",
                    :datacenter "thevmware",
                    :cluster "JMoeDataCenterA1",
                    :validate_certs "no",
                    :folder "/",
                    :name "testvm_6",
                    :template "ubuntu16",
                    :disk,
                    [{:size_gb "200",
                      :type "thin",
                      :datastore "JH5020VMSAS01"
                      }]}
             :delegate_to "localhost",
             :register "deploy"
             }]}])

任务是“ - 任务”,创建虚拟失败

那么如何使用clojure生成可以创建vm表单模板的yaml文件呢?谢谢!

答案

Ansible YAML Syntax docs是一个很好的起点。

来自YAML POV的剧本的结构是:

  • 一个YAML的戏剧列表
  • 每个播放都是一个YAML字典,其中包含许多键:
  • 一个hosts键,用于定义运行任务的主机/主机组
  • tasks密钥,它是任务定义的YAML列表,每个定义为YAML字典。每个任务字典包含许多键,特别是:
  • 一个可选的qazxsw poi键,其值包含任务的名称
  • 一个键,其名称是ansible模块的名称。此键的值将是驱动模块的参数数据的YAML字典

鉴于此,您的输出格式不正确,而您需要的是:

name

特别是在你的情况下:

  • 你的- hosts: <some_hosts> tasks: - name: Task 1 some_ansible_module: ansible_module_param1: value 1 ansible_module_param2: value 2 ansible_module_param3: value 3 delegate_to: <some_host> register: task_1_var - name: Task 2 some_ansible_module: ansible_module_param1: value 1 ansible_module_param2: value 2 ansible_module_param3: value 3 参数需要' - '插在它前面
  • name需要缩进到与vmware_guest相同的位置
  • 传递给name的所有参数都需要相对于vmware_guest缩进
  • vmware_guest的情况下,传递给它的列表需要缩进
  • diskdelegate_to需要和registername一样。它们是任务的参数,而不是模块

免责声明:我不熟悉vmware_guest模块,所以我不能说你传递的是否有效。

以上是关于如何使用clojure生成一个yaml文件,而不是创建一个esxi vmmachine?的主要内容,如果未能解决你的问题,请参考以下文章

在 Clojure 中使用 repl 而不是 println

Clojure 的 Emacs/Swank/Paredit 教程

AppEngine文档建议使用命令行标志而不是app.yaml文件元素

如何使用clojure.spec生成相互关联的args?

AppEngine 文档推荐命令行标志而不是 app.yaml 文件元素

使用 yaml.v2 检索结构的映射而不是结构的切片