自 Ansible 2.0 以来,格式化策略是什么样的?

自 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

讨论

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,但视觉结构却不同。

问题

  1. 应该使用名称(name)还是注释(#)?
  2. 应该是file: state=link src=/usr/lib/rabbitmq/bin dest=/usr/lib/rabbitmq/sbin还是应该由元素分裂,例如state:

答案1

请理解,我认为我的回答非常主观。我的团队内部大致同意我对此的看法。但我们没有为剧本起草任何“格式政策”。

  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"
  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          }
...

答案2

这取决于你自己的喜好。

像这样的评论# Make sure Jenkins starts, then configure Jenkins.没有多大意义,因为它们没有添加更多信息。

Inline语法支持YAML与 兼容JSONOutline但是应该优先使用 语法,因为代码可读性更好,而且可以用 diff 更好地检查代码更改。

相关内容