我在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的视觉结构是不同的。
问题
name )还是注释( # )? file: state=link src=/usr/lib/rabbitmq/bin dest=/usr/lib/rabbitmq/sbin或者应该通过拆分来join,例如state: 请理解我相信我的答案是非常主观的。 在内部,我的团队松散地同意我对此的看法。 但是我们还没有为剧本起草任何“格式化政策”。
- 应该使用名称(
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"
- 应该是[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比较好。