Правильный способ построения сложных строк в ANSIBLE - PullRequest
1 голос
/ 21 мая 2019

Как правильно построить сложные строки в ansible?

Учитывая этот пример az cli в командном модуле:

---
- name: >
    LISTDELETED {{ DATABASE_LISTDELETED_DATABASE }} databases
    FROM {{ DATABASE_LISTDELETED_SQLSERVER }} sqlserver
  command: >
    az sql db list-deleted
    --resource-group "{{ DATABASE_LISTDELETED_RESOURCEGROUP }}"
    --server "{{ DATABASE_LISTDELETED_SQLSERVER }}"
    --query "{{ DATABASE_LISTDELETED_QUERY | default('[*]') }}"
    --output json
  register: DATABASE_LISTDELETED_RESULT
  • Требуется обработать отсутствующий параметр, например, если отсутствует запрос, пропустите параметр --query.
  • Я хотел бы построить строку заранее, чтобы я мог легко отладить полученный результат.
  • Предпочтительное решение находится в той же задаче и также легко читаемо.

РЕДАКТИРОВАТЬ : На основе @Zeitounator gist Я закончил с этим.

---
- name: >
    LISTDELETED {{ DATABASE_LISTDELETED_DATABASE }} databases
    FROM {{ DATABASE_LISTDELETED_SQLSERVER }} sqlserver
  vars:
    listdelted_command: >
      az sql db list-deleted
      --resource-group "{{ DATABASE_LISTDELETED_RESOURCEGROUP }}"
      --server "{{ DATABASE_LISTDELETED_SQLSERVER }}"
      {% if DATABASE_LISTDELETED_QUERY is defined %}
      --query "{{ DATABASE_LISTDELETED_QUERY }}"
      {% endif %}
  command: "{{ listdelted_command }}"
  register: DATABASE_LISTDELETED_RESULT

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Требования 2 и 3 являются взаимоисключающими: вы можете заранее создать переменную (например, до выполнения ответного модуля) в задаче, но она будет доступна только для этой задачи (см. Иллюстрацию в моей задаче спасения).пример ниже).

default фильтр, как вы использовали его, позволит вам обрабатывать значение по умолчанию для конкретной неустановленной переменной.Если вы хотите опустить более сложную строку, вам нужно будет окружить ее выражением if jinja2, используя соответствующий тест.

Это то, что я бы попробовал в вашем случае (не полностью протестирован, потому что я не проверяюaz не установлено и, следовательно, нет базы данных / запросов для запуска)

- name: Store my command in a var
  set_fact:
    my_command: >-
      az sql db list-deleted
      --resource-group "{{ DATABASE_LISTDELETED_RESOURCEGROUP }}"
      --server "{{ DATABASE_LISTDELETED_SQLSERVER }}"
      {% if DATABASE_LISTDELETED_QUERY is defined %}
      --query "{{ DATABASE_LISTDELETED_QUERY }}"
      {% if %}
      --output json

- block:
    - name: >
        LISTDELETED {{ DATABASE_LISTDELETED_DATABASE }} databases
        FROM {{ DATABASE_LISTDELETED_SQLSERVER }} sqlserver
      command: "{{ my_command }}"
      register: DATABASE_LISTDELETED_RESULT
  rescue:
    - name: debug failed az command
      var:
        msg: |
          There as been an error running the following command:
          {{ my_command }}
          The reported error was:
          {{ DATABASE_LISTDELETED_RESULT.stderr }}
      debug:
        msg: "{{ msg.split('\n') }}"

Примечания:

  • set_fact будет хранить упомянутоепеременная как факт для текущего хоста.Затем вы можете повторно использовать эту переменную для того же хоста в других задачах.
  • Я использовал block с rescue, чтобы проиллюстрировать условную отладку.Измените по своему усмотрению.
  • Знак - на сложенном блоке yaml - это индикатор разброса полосы , чтобы убедиться, что новые строки в коде, введенном для удобства чтения, не мешают построенномукоманда.
  • msg.split('\n') в задаче отладки просто превращает строку многострочного сообщения в список для удобства чтения с экрана.
  • Если переменная DATABASE_LISTDELETED_QUERY может быть установлена ​​с помощьюпустая строка, и вы также хотите обработать этот случай, чтобы пропустить параметр --query, вы можете изменить тест на DATABASE_LISTDELETED_QUERY | default() | length > 0
0 голосов
/ 21 мая 2019

Для этого вы можете написать шаблон Jinja2, где вы можете использовать if-else для включения некоторых частей команды, например, --query

---
- name: >
    LISTDELETED {{ DATABASE_LISTDELETED_DATABASE }} databases
    FROM {{ DATABASE_LISTDELETED_SQLSERVER }} sqlserver
  command: >
    az sql db list-deleted
    --resource-group "{{ DATABASE_LISTDELETED_RESOURCEGROUP }}"
    --server "{{ DATABASE_LISTDELETED_SQLSERVER }}"
{% if DATABASE_LISTDELETED_QUERY %}
    --query "{{ DATABASE_LISTDELETED_QUERY | default('[*]') }}"
{% endif %}
    --output json
  register: DATABASE_LISTDELETED_RESULT

Затем проанализируйте его с помощью модуля шаблона ANSIBLE

- name: Template a file to my-command.yml
  template:
    src: /mytemplates/foo.j2
    dest: /commands/my-command.yml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...