Мне нужно удалить файлы и папки с помощью 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
.
Глупый вопрос: почему вы хотите передать это как extra-vars
? Почему бы не прочитать файл из плейбука Ansible?
Дополнительная переменная dete_files
не используется в вашем плейбуке. отредактируйте вопрос и сделайте его минимально воспроизводимым примером . idownvotedbecau.se/nomcve и попросил закрыть.
Одним из решений может быть анализ файла свойств внутри плейбука 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
Это делает то же самое, что и мой скрипт. Удаляет первую папку, определенную в переменной. Не удаляет пути к папкам/файлам после первого
Вывод ясно показывает, что все папки /tmp/test/f1, f2 и f3 будут удалены на итерации loop: "{{ delete_files.split() }}"
. Запустите свой плейбук в --check --diff mode
и опубликуйте подробности.
Это работает. Проблема заключалась в том, как я дал пути к файлам переменной в файле свойств. Спасибо за ответ
У вас есть как минимум две проблемы: первая (с точки зрения Ansible): модуль файлов не сможет удалять файлы без цикла. Второе (но, возможно, более важное для вас):
--extra-vars"dete_files=${deleteParams.delete_files}"
отобразится как--extra-vars"delete_files=a b c"
и в итоге получитсяdelete_files == 'a'
, потому что k=v не справится с этими пробелами.