#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, поскольку мне нужен список в нескольких задачах, если только командная или командная задача не может выполнять несколько команд / команд.