LINUX.ORG.RU

Запрет копирования файлов в Ansible, если не существует директории назначения

 ,


0

1

Мне нужно скопировать файл в несколько директорий по списку, но только в те директории, которые реально существуют на диске.

Я пытаюсь сделать через when:

  - name: Копирование индексной страницы во все каталоги документации
    copy:
      src:  "{{ gitReposPath }}/doxygen_documentation/idk2/html/rootindex.html"
      dest: "{{ gitReposPath }}/doxygen_documentation/{{ item[gitTable_DirectoryName] }}/html/rootindex.html"
      remote_src: yes
    when: "{{ gitReposPath }}/doxygen_documentation/{{ item[gitTable_DirectoryName] }}/html/" | is_dir
    with_items:
    - "{{ gitRepos }}"

Но когда добавляю строку с when, то появляется ошибка:
ERROR! Syntax Error while loading YAML.
  did not find expected comment or line break

The error appears to be in '/home/xi/work/develop/cpp/surfProjects/iksProjects/iks_ansible_script/level0002-iksCdBuild/step0180-generateDoc.plb.yml': line 51, column 97, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      remote_src: yes
    when: "{{ gitReposPath }}/doxygen_documentation/{{ item[gitTable_DirectoryName] }}/html/" | is_dir
                                                                                                ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

Как еще можно сделать копирование? Да, я знаю что можно отключить ошибку failed_when: false, но так делать не хотелось бы.

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Сначала проверь путь и положи результат проверки в переменную, затем добавь условие на копирование. Если не разберёшься, то завтра скину пример.

FireFighter ★★★
()
Ответ на: комментарий от FireFighter
- name: dnf | Find exists dnf repos
  find:
    paths: "{{ hostvars[inventory_hostname]['dnf_repos_dest'] }}"
    recurse: "no"
    file_type: "file"
    patterns: "(.*)"
    use_regex: "true"
  register: "dnf_find_result"
  when:
  - "hostvars[inventory_hostname]['ansible_pkg_mgr'] == 'dnf'"
  - "hostvars[inventory_hostname]['dnf_drop_exists_repos'] is defined"
  - "hostvars[inventory_hostname]['dnf_drop_exists_repos'] == 'true'"
- name: dnf | Delete exists dnf repos
  file:
    path: "{{ item.path }}"
    state: "absent"
  loop: "{{ vars['dnf_find_result']['files'] | flatten(levels=1) }}"
  loop_control:
    label: "{{ item.path }}"
  when:
  - "vars['dnf_find_result']['files'] is defined"
FireFighter ★★★
()

Оберни в одинарные кавычки, у тебя yaml невалидный получился.

AnDoR ★★★★★
()

Ты вероятно хочешь что-то подобное:

- name: stat for target directories
  stat:
    path: "{{ gitReposPath }}/doxygen_documentation/{{ item[gitTable_DirectoryName] }}"
    get_attributes: no
    get_checksum: no
    get_mime: no
  loop: "{{ gitRepos }}"
  register: _dirs_stat

- name: copy only if directory exists
  copy:
    src: "{{ gitReposPath }}/doxygen_documentation/idk2/html/rootindex.html"
    dest: "{{ gitReposPath }}/doxygen_documentation/{{ item[gitTable_DirectoryName] }}/html/rootindex.html"
    remote_src: yes
  when: _dirs_stat[_idx].stat.isdir is defined and _dirs_stat[_idx].stat.isdir
  loop: "{{ gitRepos }}"
  loop_control:
    index_var: _idx

Но проще и быстрее было бы написать на шелле две строки, чем вот это вот.

Лично для меня задача выглядит несколько странно: ты либо управляешь ресурсами (директориями и репозиториями) на хосте или же ты занимаешься созданием хаков. Лично я предпочитаю первое.

Кстати, для гит реп есть специальный модуль.

AnDoR ★★★★★
()
Последнее исправление: AnDoR (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.