Удаление нескольких файлов и папок с помощью Ansible

Мне нужно удалить файлы и папки с помощью ansible playbook. Я передаю пути к файлам/папкам как переменную в плейбук Ansible из скрипта Groovy. Переменные находятся в файле свойств с именем delete.properties. Я сохранил пути к файлам/фолерам отдельно в переменных, чтобы в будущем я мог изменять пути по мере необходимости.

удалить.свойства:

delete_files=/home/new-user/myfolder/dltfolder1 /home/new-user/myfolder/dltfolder2 /home/new-user/myfolder/dltfolder3

Крутой скрипт:

     stage("Read variable"){
      steps{
        script{
         def propertifile = readFile(properti file path)
         deleteParams = new Properties()
         deleteParams.load(new StringReader(propertifile))
        }
     }
  }
    stage("Delete files/folders"){
      steps{
        script{
         sh script: """cd ansible code path && \
         export ANSIBLE_HOST_KEY_CHECKING=False && \
         ansible-playbook delete.yml \ 
         --extra-vars"dete_files=${deleteParams.delete_files}" --user user"""
        }
     }
  }

Ansible playbook:

---
- name: delete files
  hosts: localhost
  tasks:
   - name: delete files
     file:
      path: "{{ delete_files }}"
      state: absent

В результате приведенных выше кодов удаляется только первый путь к файлу в переменной delete_files (/home/new-user/myfolder/dltfolder1) в файле delete.properties.

Мне также нужно удалить другие пути к файлам/папкам, включенные в переменную delete_files.

У вас есть как минимум две проблемы: первая (с точки зрения Ansible): модуль файлов не сможет удалять файлы без цикла. Второе (но, возможно, более важное для вас): --extra-vars"dete_files=${deleteParams.delete_files}" отобразится как --extra-vars"delete_files=a b c" и в итоге получится delete_files == 'a', потому что k=v не справится с этими пробелами.

β.εηοιτ.βε 05.12.2022 17:41

Глупый вопрос: почему вы хотите передать это как extra-vars? Почему бы не прочитать файл из плейбука Ansible?

β.εηοιτ.βε 05.12.2022 17:42

Дополнительная переменная dete_files не используется в вашем плейбуке. отредактируйте вопрос и сделайте его минимально воспроизводимым примером . idownvotedbecau.se/nomcve и попросил закрыть.

Vladimir Botka 06.12.2022 09:23
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
1
3
104
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Одним из решений может быть анализ файла свойств внутри плейбука Ansible с помощью поиска ini, если вы действительно действуете localhost, как вы показываете это в своем плейбуке:

- hosts: localhost
  gather_facts: no

  tasks:
    - file:
        path: "{{ item }}"
        state: absent
      loop: >-
        {{
          lookup(
            'ini',
            'delete_files type=properties file=delete.properties'
          ).split()
        }}
Ответ принят как подходящий

Поместите путь к файлу в дополнительные переменные. Например,

         sh script: """cd ansible code path && \
         export ANSIBLE_HOST_KEY_CHECKING=False && \
         ansible-playbook delete.yml \ 
         --extra-vars "dete_files=/tmp/delete.properties" --user user"""

Затем, учитывая дерево

shell> tree /tmp/test
/tmp/test
├── f1
├── f2
└── f3

, файл

shell> cat /tmp/delete.properties 
delete_files=/tmp/test/f1 /tmp/test/f2 /tmp/test/f3

, и сборник игр

shell> cat delete.yml
- hosts: localhost

  vars:

    delete_files: "{{ lookup('ini',
                             'delete_files',
                             file=dete_files,
                             type='properties') }}"

  tasks:

    - debug:
        var: delete_files

    - name: delete files
      file:
        path: "{{ item }}"
        state: absent
      loop: "{{ delete_files.split() }}"

дает, работает в режиме --check --diff

shell> ansible-playbook delete.yml --extra-vars "dete_files=/tmp/delete.properties" -CD

PLAY [localhost] *****************************************************************************

TASK [debug] *********************************************************************************
ok: [localhost] => 
  delete_files: /tmp/test/f1 /tmp/test/f2 /tmp/test/f3

TASK [delete files] **************************************************************************
--- before
+++ after
@@ -1,5 +1,2 @@
 path: /tmp/test/f1
-path_content:
-  directories: []
-  files: []
-state: directory
+state: absent

changed: [localhost] => (item=/tmp/test/f1)
--- before
+++ after
@@ -1,5 +1,2 @@
 path: /tmp/test/f2
-path_content:
-  directories: []
-  files: []
-state: directory
+state: absent

changed: [localhost] => (item=/tmp/test/f2)
--- before
+++ after
@@ -1,5 +1,2 @@
 path: /tmp/test/f3
-path_content:
-  directories: []
-  files: []
-state: directory
+state: absent

changed: [localhost] => (item=/tmp/test/f3)

PLAY RECAP ***********************************************************************************
localhost: ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

Это делает то же самое, что и мой скрипт. Удаляет первую папку, определенную в переменной. Не удаляет пути к папкам/файлам после первого

mamt_007 06.12.2022 08:28

Вывод ясно показывает, что все папки /tmp/test/f1, f2 и f3 будут удалены на итерации loop: "{{ delete_files.split() }}". Запустите свой плейбук в --check --diff mode и опубликуйте подробности.

Vladimir Botka 06.12.2022 09:22

Это работает. Проблема заключалась в том, как я дал пути к файлам переменной в файле свойств. Спасибо за ответ

mamt_007 09.12.2022 14:43

Другие вопросы по теме