Как выглядит политика форматирования со времен Ansible 2.0?
Я видел несколько примеров Ansible на 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
обсуждение
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
При обращении к YAML Lint в соответствии с рекомендациями синтаксического документа Ansible YAML оба фрагмента кажутся действительными YAML. Хотя оба фрагмента являются допустимыми YAML, визуальная структура отличается.
Вопросы
- Следует назвать (
name
) быть использованы или комментарий (#
)? - Должно ли это быть
file: state=link src=/usr/lib/rabbitmq/bin dest=/usr/lib/rabbitmq/sbin
или следует разделить, например,state:
2 ответа
Пожалуйста, поймите, я считаю, что мой ответ очень субъективен. Внутренне моя команда слабо согласна с моим мнением по этому поводу. Но мы не разработали никакой "политики форматирования" для playbooks.
- Следует назвать (
name
) быть использованы или комментарий (#
)?
Мы включаем комментарии, только если полезно объяснить "почему?" конкретной задачи. name
всегда присутствует. Значение name
будет отображаться во время запуска playbook. В тех случаях, когда роль используется как зависимость, я часто параметризировал name
, Пара примеров.
параметризованных name
пример из ролей /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
, Роли /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.
не имеет особого смысла, так как они не добавляют больше информации.
Inline
синтаксис поддерживается YAML
быть совместимым с JSON
, Outline
однако синтаксис должен быть предпочтительным, потому что код лучше читается, а изменения кода можно лучше просматривать с помощью diff.