从Ansible 2.0开始,格式策略如何?

我在github上看到了多个Ansible的例子,

--- # this might be in a file like handlers/handlers.yml - name: restart apache service: name=apache state=restarted 

Github的例子

以下示例包含作为name的注释。

 # Make sure Jenkins starts, then configure Jenkins. - name: Ensure Jenkins is started and runs on startup. service: name=jenkins state=started enabled=yes 

讨论

一个name就足够了,还是应该使用评论?

应该是:

 - name: Symlink RabbitMQ bin to sbin file: state=link src=/usr/lib/rabbitmq/bin dest=/usr/lib/rabbitmq/sbin 

要么:

 #Symlink RabbitMQ bin to sbin file: state: link src: /usr/lib/rabbitmq/binhttp://docs.ansible.com/ansible/YAMLSyntax.html dest: /usr/lib/rabbitmq/sbin 

当按照Ansible YAML语法doc的build议查阅YAML Lint时,这两个片段似乎都是有效的YAML。 虽然这两个片段似乎是有效的YAML的视觉结构是不同的。

问题

  1. 应该使用名称( name )还是注释( # )?
  2. 应该是file: state=link src=/usr/lib/rabbitmq/bin dest=/usr/lib/rabbitmq/sbin或者应该通过拆分来join,例如state:

请理解我相信我的答案是非常主观的。 在内部,我的团队松散地同意我对此的看法。 但是我们还没有为剧本起草任何“格式化政策”。

  1. 应该使用名称( name )还是注释( # )?

如果解释“为什么”是有用的,我们只包括评论。 的特定任务。 name 总是存在的。 name的值将在剧本运行过程中显示。 在一个angular色被用作依赖的情况下,我经常参数化name 。 几个例子。

参数化name示例,来自roles / some_container / meta / main.yml

 ... dependencies: - { role: remove_container, container_name: some_container } ... 

angular色/ remove_container /任务/ main.yml

 ... - name: Remove containers - {{ container_name }} docker_container: name: "{{ container_name }}" state: absent force_kill: true ... 

评论作为免费的name 。 angular色/ remove_image /任务/ main.yml

 # The 'docker_image' module, as of EPEL build 2.1.0.0, does not correctly handle 'tag: *' for removing all image tags. # Below is not pretty but works on systems where you know all the image names. - name: Remove images - {{ image_name }} shell: docker rmi -f $(docker images | grep {{ image_name }} | awk '{print $3}') register: result changed_when: "'requires a minimum of 1 argument' not in result.stderr" failed_when: - "'requires a minimum of 1 argument' not in result.stderr" - "result.rc != 0" 
  1. 应该是[k = v]还是[k:v]?

我总是使用'​​k:v'语法。 另外,我用一个新行分解了不同的值。 当读一个人在一条线上塞满了许多'k = v'的戏时,我的大脑就会扭曲起来。 我觉得很难把所有的关键/价值杂耍在我感兴趣的东西上。

哪个更容易阅读? 我想第二个例子。

 # 1. Launch container k=v - name: Start A container docker_container: name=containerA image=imageA published_ports='443:8443' exposed_ports=8443 volumes='/some/path:/some/path' links='b:b' env='/some/local.fact' pull=false restart_policy=always state=started # 2. Launch container k: v - name: Start api container docker_container: name: containerA image: imageB published_ports: - "443:8443" exposed_ports: - 8443 volumes: - /some/path:/some/path links: - db:db env: /some/local.fact pull: false restart_policy: always state: started 

我也有时候明智地使用空白空间。

 ... # Containers a, b, c comprise 'app d' and can be updated independently. roles: - { role: bootstrap_common, tags: bootstrap } - { role: bootstrap_a, tags: bootstrap } - { role: bootstrap_b, tags: bootstrap } - { role: deploy_container_a, tags: a } - { role: deploy_container_b, tags: b } - { role: deploy_container_c, tags: c } ... 

这取决于你自己的偏好。

# Make sure Jenkins starts, then configure Jenkins. 没有多less意义,因为他们不会增加更多的信息。

Inline语法由YAML支持与JSON兼容。 但是, Outline语法应该是首选,因为代码更好的可读性和代码更改可以用diff比较好。