LINUX.ORG.RU
решено ФорумAdmin

Создать директорий с помощью цикла в Ansible

 


1

1

Всем привет. Подскажите неофиту,как создать директории с помощью цикла. Нужно создать диры, чтоб в них скопировать бекапы приложух. Проблема в том, что у каждой диры должен быть свой путь, например /opt/MSK/vassya/application_name_bkp/ Городов несколько (5 штук ). Имён так же, несколько (5 штук ). Все города и имена помещаю в переменные списком ( отдельный файл vars.yml ).

то есть, на выходе, нужно сделать диры

/opt/MSK/vassya/application_name_bkp/

/opt/MSK/petya/application_name_bkp/

/opt/MSK/kolya/application_name_bkp/

/opt/SPb/vassya/application_name_bkp/

….

и так далее и тому подобное. Всего около сотни папок на 2х хостах.



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

Вот так вроде бы должно работать:

  vars:
    city_name_list: ["MSK/vassya", "MSK/petya", "MSK/kolya", "SPb/vassya"]

...

    - name: Backup dirs
      file:
        path: "/opt/{{ item }}/application_name_bkp"
        state: directory
      loop: "{{ city_name_list }}"
No
()

Можно сделать основной цикл. Из основного цикла вызывать вторичный цикл. Затем из вторичного цикла вызывать третий цикл. Вот приблизительной рабочий пример.

https://gist.github.com/Nurmukhamed/8a073969a7db02f1876b7cb66efad3e3

Nurmukh ★★★
()
Последнее исправление: Nurmukh (всего исправлений: 1)
Ответ на: комментарий от CaHbl4

чисто факультативно - если еще и flatten применить, можно продолжать до бесконечности)

- hosts: localhost
  vars:
    cities:
      - MSK
      - SPB
      - EKB
    names:
      - vasya
      - petya
      - kolya
    apps:
      - app1
      - app2
      - app3
  tasks:
    - debug:
        msg: "{{ cities | product(names) | product(apps) | map('flatten') | map('join', '/') }}"
ok: [localhost] => {
    "msg": [
        "MSK/vasya/app1",
        "MSK/vasya/app2",
        "MSK/vasya/app3",
        "MSK/petya/app1",
        "MSK/petya/app2",
        "MSK/petya/app3",
        "MSK/kolya/app1",
        "MSK/kolya/app2",
        "MSK/kolya/app3",
        "SPB/vasya/app1",
        "SPB/vasya/app2",
        "SPB/vasya/app3",
        "SPB/petya/app1",
        "SPB/petya/app2",
        "SPB/petya/app3",
        "SPB/kolya/app1",
        "SPB/kolya/app2",
        "SPB/kolya/app3",
        "EKB/vasya/app1",
        "EKB/vasya/app2",
        "EKB/vasya/app3",
        "EKB/petya/app1",
        "EKB/petya/app2",
        "EKB/petya/app3",
        "EKB/kolya/app1",
        "EKB/kolya/app2",
        "EKB/kolya/app3"
    ]
}
CaHbl4
()
Ответ на: комментарий от CaHbl4

Спасибо!

Попробовал с product сделать, создалась 1 папка. Видимо что то сделал не так. Я не программист, вполне вероятно, что то не доходит до меня. Написал так

  -name: "Generate multiple dir"
   ansible.builtin.file:
     path: "/home/testing/{{['MSK','SPb'] | product (['vas','pet']) | map('join','/')}}"
     recursive: yes
     owner: abc
     group: abc

Отработало без ошибок, но создалась 1 дир, с именем <generator object do map at 0x*********>:))

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

В общем и целом, что то ничего у меня не получается. У меня там еще и версия питона 2.7.5, может из за этого косяки какие то вылазят.

А если упростить задачу. Я из конфигурационной базы, могу список путей вытащить ко всем приложениям. Есть вариант засунуть все пути в список и чтоб он по всем прошелся и скопировал приложуху в папку *bkp%data_time%?

++++ Сделал как в 1-ом сообщении, всё получилось.

Спасибо всем.

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