LINUX.ORG.RU

Ansible копирование файлов по условию

 


0

2

Доброго времени суток!
Имеется много машин и ещё больше пользователей. Пользователи могут заходить на любые машины.
Задача: скопировать список файлов списку пользователей на рабочий стол, только в том случае, если пользователь заходил на машину (т.е. если существует /home/user/Desktop/).
Нужно оформить это всё в одном плейбуке.
Плейбук ругается на item.result.stat.exists:

- hosts: пользователи
  vars:
    users:
      - user1
      - user2
      - ...
      - userN
    files:
      - file1
      - file2
      - ...
      - fileM

  tasks:

    - stat: path=/home/{{item}}/Desktop/
      with_items: "{{users}}"
      register: usr

    - copy: src=/etc/ansible/files/{{item.file}} dest=/home/{{item.user}}/Desktop/
      when: item.result.stat.exists
      with_items:
        - {result: "{{usr.results}}", file: "{{files}}", user: "{{users}}"}

P.S.: понял, что чушь написал в плейбуке, ведь количество пользователей не совпадает с количеством файлов...



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

а зачем использовать именно список файлов? copy позволяет копировать содержимое директории

If path is a directory, it is copied recursively.
In this case, if path ends with "/", only inside contents of that directory are copied to destination
CaHbl4
()

Но вообще в ансибле есть подобие вложенных циклов (with_nested):

Думаю примерно так сработает

  tasks:
    - stat:
        path: /home/{{ item }}/Desktop/
      with_items: "{{ users }}"
      register: usr

    - copy:
        src: /etc/ansible/files/{{ item[1].file }}
        dest: /home/{{ item[0].item }}/Desktop/
      when: item[0].stat.exists
      with_nested:
        - "{{ usr.results }}"
        - "{{ files }}"

  • usr.results - список результатов проверок юзеров (в usr.results.N.item будет находится элемент из предыдущего цикла)
  • item[0].item - соответственно юзер
  • item[0].stat.exists - результат проверки каталога

Плейбук ругается на item.result.stat.exists

это потому что в случае цикла в переменную сохраняется список (по всем элементам) item.result.N.stat.exists

CaHbl4
()
Ответ на: комментарий от CaHbl4

Благодарю! Всё работает с небольшой доработкой: вместо item[1].file нужно писать item[1].

И я использую написание item.0 и item.1, потому как в документации так написано.

speed_vm
() автор топика
Ответ на: комментарий от speed_vm

вместо item[1].file нужно писать item[1]

это да, правил копипасту, не удалил лишнее

И я использую написание item.0 и item.1, потому как в документации так написано.

В документации ансибла везде по-разному написано. Синтаксис идет от jinja2 и, за исключением одного нюанса, эти записи равнозначны:

{{ foo.bar }}
{{ foo['bar'] }}
# или
{{ foo.0 }}
{{ foo[0] }}
http://jinja.pocoo.org/docs/dev/templates/#variables

CaHbl4
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.