Как собрать список папок в ansible без ошибок? - PullRequest
0 голосов
/ 10 июля 2019

У вас есть список папок, которые вы хотите скопировать с удаленного компьютера на локальный, и не все из них могут существовать .

Текущий подход генерирует ложные ошибки в журналах, когда некоторые папки не найдены:

- set_fact:
    folders:
      - /foo
      - /bar

- synchronize:
    dest: "{{ log_path }}"
    mode: pull
    src: "{{ item }}"
    verify_host: true
  ignore_errors: true
  with_items: "{{ folders }}"

То, чего я хочу добиться, - это поведение, при котором rsync запускается без каких-либо ошибок, когда отсутствуют некоторые папки.

Текущее поведение пользователя создает некоторый шум, такой как:

rsync: change_dir "foo" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1650) [Receiver=3.1.2]
rsync: [Receiver] write error: Broken pipe (32)

Я, очевидно, рассматривал возможность использования модуля stat для проверки существования папок, но проблема в том, что я не могу использовать циклы с блоками.

Кто-нибудь знает другой чистый способ сделать это?

1 Ответ

0 голосов
/ 10 июля 2019

Я действительно не вижу, в чем проблема с использованием stat. Вот тестовая тетрадь, которую я запустил на своей машине, которая отражает то, что, как я понял, вы пытаетесь сделать.

---
- name: Test selective log synchro
  hosts: localhost
  gather_facts: false
  become: true

  vars:
    remote_log_path: /var/log
    local_copy_path: /tmp
    folder_names:
      - containers
      - cups
      - IDoNotExist

  tasks:
    - name: Check which folders exist on remote
      stat:
        path: "{{ remote_log_path }}/{{ item }}"
      register: log_folders_check
      loop: "{{ folder_names }}"

    - name: Debug registered var to see structure on -v
      debug:
        var: log_folders_check
        verbosity: 1

    - name: Create a list of existing folders only
      set_fact:
        existing_log_folders: "{{ log_folders_check.results | json_query('[?(stat.exists)][item][]') }}"

    - name: Debug calculated list on -v
      debug:
        var: existing_log_folders
        verbosity: 1

    - name: Make sure local needed folders exist
      file:
        path: "{{ local_copy_path }}/{{ item }}"
        state: directory
        owner: root
        group: root
      loop: "{{ existing_log_folders }}"

    - name: Sync existing folders locally
      synchronize:
        dest: "{{ local_copy_path }}/{{ item }}/"
        src: "{{ remote_log_path }}/{{ item }}/"
        mode: pull
      with_items: "{{ existing_log_folders }}"

Что дает (запустите с -v, если вы хотите увидеть зарегистрированные / установленные переменные)

PLAY [Test selective log synchro] *****************************************************************************************************************************************************************************************

TASK [Check which folders exist on remote] ********************************************************************************************************************************************************************************
ok: [localhost] => (item=containers)
ok: [localhost] => (item=cups)
ok: [localhost] => (item=IDoNotExist)

TASK [Debug registered var to see structure on -v] ************************************************************************************************************************************************************************
skipping: [localhost]

TASK [Create a list of existing folders only] *****************************************************************************************************************************************************************************
ok: [localhost]

TASK [Debug calculated list on -v] ****************************************************************************************************************************************************************************************
skipping: [localhost]

TASK [Make sure local needed folders exist] *******************************************************************************************************************************************************************************
ok: [localhost] => (item=containers)
ok: [localhost] => (item=cups)

TASK [Sync existing folders locally] **************************************************************************************************************************************************************************************
ok: [localhost] => (item=containers)
ok: [localhost] => (item=cups)

PLAY RECAP ****************************************************************************************************************************************************************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...