Как я могу динамически создавать список ansible с выводом sql-запроса

#postgresql #ansible

#postgresql #ansible

Вопрос:

У меня есть сборник задач, в котором я хочу создавать резервные копии, удалять и импортировать некоторые таблицы (как средство их обновления), не спрашивайте меня, почему я не буду просто использовать обновления и вставки, это сложная архитектура.

Я хочу запросить базу данных postgres, чтобы определить, какие таблицы из конкретной базы данных для выполнения действия для этих таблиц.

Нравится:

 - name: Create a list of STATIC TABLES to import later
  command: psql -t -A -d {{ dbname }} -U {{ dbuser }} -c "SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE'"
  register: dbtables_data
  

И

 - name: Backup all tables.
  shell: "pg_dump -U {{ dbuser }} {{ item.name }} -f {{ dbbackup_dir }}/{{ item.name }}.sql"
  with_items: "{{ dbtables_data.results }}"
  

Это дает мне:

 fatal: [*.*.*.*] => with_items expects a list or a set
  

И я хочу зарегистрировать этот вывод в переменной списка, чтобы я мог выполнять итерации и выполнять операции резервного копирования, удаления и импорта.

Пожалуйста, помогите

Ответ №1:

Зарегистрированная переменная содержит поле с именем stdout_lines , которое вы можете использовать :

Я предлагаю вам временно добавить задачу отладки для отображения таких выходных данных :

 - name: Create a list of STATIC TABLES to import later
  command: psql -t -A -d {{ dbname }} -U {{ dbuser }} -c "SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE'"
  register: dbtables_data

- name: Backup all tables.
  shell: "pg_dump -U {{ dbuser }} {{ item }} -f {{ dbbackup_dir }}/{{ item }}.sql"
  with_items: "{{ dbtables_data.stdout_lines }}"
  

Для отладки stdout_lines содержимого вы можете вставить следующую задачу между обеими существующими задачами :

 - debug:
    var: dbtables_data
  

Или

 - debug:
    msg="{{item}}"
  with_items: "{{ dbtables_data.stdout_lines | default([]) }}"
  

Другой элегантный способ — выполнить итерацию непосредственно по результатам в одной задаче, вызвав плагин поиска ‘lines’ с параметром ‘with_lines’

 - name: Backup all tables.
  shell: "pg_dump -U {{ dbuser }} {{ item }} -f {{ dbbackup_dir }}/{{ item }}.sql"
  with_lines: psql -t -A -d {{ dbname }} -U {{ dbuser }} -c "SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE'"
  

Комментарии:

1. when вычисляется для каждого элемента. Чтобы достичь того, чего вы ожидаете, просто используйте with_items: "{{ dbtables_data.stdout_lines | default([]) }}" . Также обратите внимание, что пустые переменные устарели в when инструкции, поэтому вы должны создать его шаблон.

2. Спасибо, я исправил with_items и when в последней debug задаче

3. В этом случае нет необходимости в when statement, потому что оно всегда будет true.

4. Спасибо! Это работает как шарм, я выбрал блок asynchrone, поскольку мне нужен список в нескольких задачах, если только командная или командная задача не может выполнять несколько команд / команд.