我在 github 和ansible 文档,例如:
---
# this might be in a file like handlers/handlers.yml
- name: restart apache
service: name=apache state=restarted
下面的示例包含注释和name
。
# Make sure Jenkins starts, then configure Jenkins.
- name: Ensure Jenkins is started and runs on startup.
service: name=jenkins state=started enabled=yes
讨论
Aname
就足够了还是应该使用评论?
应该是:
- 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
什么时候YAML Lint按照建议进行咨询Ansible YAML 语法文档这两个代码片段似乎都是有效的 YAML。尽管这两个代码片段似乎都是有效的 YAML,但视觉结构却不同。
问题
- 应该使用名称(
name
)还是注释(#
)? - 应该是
file: state=link src=/usr/lib/rabbitmq/bin dest=/usr/lib/rabbitmq/sbin
还是应该由元素分裂,例如state:
答案1
请理解,我认为我的回答非常主观。我的团队内部大致同意我对此的看法。但我们没有为剧本起草任何“格式政策”。
- 应该使用名称(
name
)还是注释(#
)?
我们仅会在有助于解释特定任务的“为什么”时添加评论name
。总是存在。 的值name
将在剧本运行期间显示。在使用角色作为依赖项的情况下,我经常参数化name
。几个例子。
参数化name
示例,来自roles/some_container/meta/main.yml
...
dependencies:
- { role: remove_container, container_name: some_container }
...
角色/remove_container/任务/main.yml
...
- name: Remove containers - {{ container_name }}
docker_container:
name: "{{ container_name }}"
state: absent
force_kill: true
...
name
对.roles/remove_image/tasks/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 }
...
答案2
这取决于你自己的喜好。
像这样的评论# Make sure Jenkins starts, then configure Jenkins.
没有多大意义,因为它们没有添加更多信息。
Inline
语法支持YAML
与 兼容JSON
。Outline
但是应该优先使用 语法,因为代码可读性更好,而且可以用 diff 更好地检查代码更改。