Назад | Перейти на главную страницу

Как выглядит политика форматирования со времен Ansible 2.0?

Я видел несколько примеров Ansible на github и в доступные документы, например:

---
# 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

когда YAML Lint консультируется в соответствии с рекомендациями Документ синтаксиса Ansible YAML оба фрагмента кажутся действительными YAML. Хотя оба фрагмента кажутся действительными YAML, визуальная структура отличается.

Вопросы

  1. Следует называть (name) или комментарий (#)?
  2. Должно быть file: state=link src=/usr/lib/rabbitmq/bin dest=/usr/lib/rabbitmq/sbin или следует разделить element by, например state:

Пожалуйста, поймите, я считаю свой ответ очень субъективным. Внутренне моя команда частично согласна с моим мнением по этому поводу. Но мы не разработали никакой «политики форматирования» для playbooks.

  1. Следует называть (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"
  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. не имеют особого смысла, поскольку не добавляют дополнительной информации.

Inline синтаксис поддерживается YAML быть совместимым с JSON. Outline однако следует отдавать предпочтение синтаксису, потому что код лучше читается, а изменения кода лучше проверять с помощью команды diff.