У меня есть доступная игра, состоящая из двух пьес, как показано ниже:
process.tar.gz
файл в определенном каталоге на всех удаленных серверах. Ниже мой сценарий:
---
- name: Play 1
hosts: 127.0.0.1
tasks:
- name: check whether we have all the necessary files
shell: "ls files/ | wc -l"
retries: 10
delay: 10
register: number_of_files
until: "number_of_files.stdout == '10'"
- name: Total number of files
debug: msg="Total files {{ number_of_files.stdout }}"
- name: check whether all the files are generated within a minute difference
shell: "find files/ -mmin -1 -type f -print | wc -l"
register: file_time
failed_when: "file_time.stdout != '10'"
- name: Total number of files
debug: msg="Total files {{ file_time }}"
- name: check whether success file was generated
shell: "ls files/SUCCESS | wc -l"
register: success_file
failed_when: "success_file.stdout != '1'"
- name: Success file
debug: msg="{{ success_file }}"
- name: compress all the files in tar.gz
shell: "rm process.tar.gz; tar -czvf process.tar.gz -C files . --exclude='SUCCESS'"
- name: Play 2
hosts: ALL_HOSTS
serial: "{{ serial }}"
tasks:
- name: creates directory
file: path=/data/taks/files/ state=directory
- name: copy and untar process.tar.gz file
unarchive: src=process.tar.gz dest=/data/taks/files/
- name: sleep for few seconds
pause: seconds=20
Я хотел посмотреть, есть ли лучший способ написать свой анзибл? Так как я недавно начал работать с ansible, поэтому не уверен, что следую всем лучшим практикам. Я использую версию ansible ansible 2.4.3.0
. Также я всегда получаю предупреждение от ansible по этой задаче:
- name: compress all the files in tar.gz
shell: "rm process.tar.gz; tar -czvf process.tar.gz -C files . --exclude='SUCCESS'"
Вот предупреждение:
[WARNING]: Consider using file module with state=absent rather than running rm
[WARNING]: Consider using unarchive module rather than running tar
Обновить:
Ниже приведен мой путь, по которому находится мой доступный playbook, и только из этого каталога я выполняю свой PLAYBOOK1
. И files
каталог содержит все файлы, включая SUCCESS
который мне нужно сжать в tar.gz.
jenkins@machineA:~/jobs/processdata/workspace$ ls -lrth
total 145M
drwxr-xr-x 2 jenkins jenkins 4.0K Feb 19 17:36 files
-rw-r--r-- 1 jenkins root 1.6K Feb 19 19:32 PLAYBOOK1.yml
-rw-r--r-- 1 jenkins root 1.6K Feb 19 19:32 PLAYBOOK2.yml
Вот ошибка, которую я получаю после выполнения PLAYBOOK1
с вашими изменениями:
TASK [Check all files] **********************************************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": false, "examined": 0, "failed_when_result": true, "files": [], "matched": 0, "msg": "/files was skipped as it does not seem to be a valid directory or it cannot be accessed\n"}
Смотрите мои комментарии, отмеченные #
Playbook1
- hosts: YOURHOST1
remote_user: "YOURUSER"
become: True
tasks:
#Instead using shell, use find module... It will check if there are 10 files created before 1 minute in folder, otherwise playbook fails
- name: Check all files
find: paths=/var/lib/jenkins/jobs/processdata/workspace/files
file_type=file
age=-1m
age_stamp=mtime
register: files
failed_when: files.matched < 10
- name: Number of files
debug: msg="Total files {{ files.matched }}"
#Check for SUCCESS file, I didn't add an action to delete SUCCESS file... Hope you have any other script to do it
- name: Check Success File
find: paths=/var/lib/jenkins/jobs/processdata/workspace/files
file_type=file
patterns=SUCCESS
register: success_file
failed_when: success_file.matched < 1
- name: Success file
debug: msg='Success file is {{ success_file.files.0.path }}'
- name: Remove previous tarFile
file: path=/tmp/process.tar.gz
state=absent
#I've found a way to make it work
- name: compress all the files in tar.gz
archive: path="{{ files_to_archive }}"
dest=/tmp/test.tar.gz
format=gz
vars:
files_to_archive: "{{ files.files | map(attribute='path') | list }}"
- include: PLAYBOOK2.yml
Playbook2 Если одно из предыдущих действий не удается, Ansible останавливается и не запускает никаких других действий.
- hosts: YOURHOST2
remote_user: "YOURUSER"
become: True
tasks:
- name: creates directory
file: path=/data/taks/files/
state=directory
- name: Copy tar file
copy: src=/tmp/test.tar.gz
dest=/tmp/process.tar.gz
owner=root
group=root
mode=0744
- name: copy and untar process.tar.gz file
unarchive: src=/tmp/process.tar.gz
dest=/data/taks/files/
- name: Remove SUCCESS File
file: path=/data/taks/files/SUCCESS
state=absent
#I don't know why you'll need this:
- name: sleep for few seconds
pause: seconds=20
Учтите, что одной из особенностей ansible является идемпотентность, вы должны написать свои скрипты для запуска и продолжения предыдущих действий (если они не удались при предыдущем запуске). Ни ваш, ни мой скрипты не являются идемпотентными, потому что вам нужно найти файлы новее, чем за минуту до этого, поэтому при следующем запуске (если что-то не удается) ваш скрипт отбрасывает файлы старше минуты.
То же самое происходит с файлом SUCCESS, если у вас есть платформа / сценарий, который продолжает его удалять, возможно, что сценарий Ansible не работает при запуске.