Adobe Experience Manager (AEM) багцууд нь агуулгын удирдлагын үл мэдэгдэх баатрууд бөгөөд код, тохиргооноос эхлээд чухал контент хүртэлх бүх зүйлийг багтаасан хүчирхэг контейнер юм. Гэхдээ үүнийг хүлээн зөвшөөр: эдгээр багцуудыг гараар үүсгэх, тохируулах, татаж авах нь товшилтын уйтгартай бүжиг шиг санагдаж болно.
Хэрэв та хэд хэдэн товчлуур дарснаар энэ үйл явцыг автоматжуулж, тогтвортой байдал, хурд, найдвартай байдлыг хангаж, хүнд ачаа бага өргөдөг бол яах вэ?
Би танд AEM хөгжүүлэгчид болон админууд Багц Менежер API-тай хэрхэн ажилладаг тухай скриптийг эргүүлдэг (хөгжөөгүй!) Bash скриптийг үзүүлэх болно. Хэдхэн секундын дотор багц хийх, шүүлтүүрийг хурдан тохируулах, нөөцлөлтийг мэс заслын нарийвчлалтайгаар хийх талаар бодож үзээрэй - таны кофе ууж буй төгс температурт хөргөхөөс өмнө. ☕
Усанд орохоосоо өмнө товч тэмдэглэл : Энэ нийтлэл нь гүн гүнзгий шумбах, нарийн нарийвчлалтай, техникийн хувьд уучлалт гуйхгүй. Бид скриптийн логикийг задлан шинжилж, AEM API-ийн нарийн төвөгтэй байдлыг судалж, захын тохиолдлуудад алдааг олж засварлах болно. Код руу шууд орохыг хүсч буй хөгжүүлэгчдэд та нийтлэлийн доод хэсэгт очиж болно. Гэхдээ хэрэв та автоматжуулалтын ард хэрхэн, яагаад гэдгийг ойлгох гэж ирсэн бол оосортой бол - бид туулайн нүх рүү чиглэн явна. 🕳️
create-remote-aem-pkg.sh
скрипт нь AEM-ийн багц менежер API-тай харилцан үйлчлэлийг автоматжуулж, багц үүсгэх, тохируулах, түгээх бүтэцтэй хандлагыг санал болгодог. Хөгжүүлэгчид болон администраторуудад зориулагдсан бөгөөд гарын авлагын ажлын урсгалыг тууштай, найдвартай байдлыг чухалчилдаг тушаалын мөрөнд тулгуурласан процессоор орлуулдаг.
/content/dam
, /apps
) программчлан тодорхойлдог.curl
дамжуулан үндсэн¹ итгэмжлэлд суурилсан баталгаажуулалтыг дэмждэг./etc
эсвэл /apps
ын тогтвортой байдлыг авна уу. ./create-remote-aem-pkg.sh admin securepass123 localhost 4502 backup-group "Content Backup" /backups /content/dam /etc/clientlibs
Энэ тушаал нь /content/dam
болон /etc/clientlibs
зэрэг backup-group
доор "Агуулгын нөөц" нэртэй багцыг үүсгэж, гаралтыг /backups
санд хадгална.
create-remote-aem-pkg.sh
скриптийг задлан үзэцгээе (та үүнийг нийтлэлийн доод хэсгээс олж болно), энэ нь AEM багцын менежментийг хэрхэн зохицуулдгийг ойлгох болно. Бид түүний бүтэц, үндсэн функцууд болон ажлын урсгалын логик дээр анхаарлаа төвлөрүүлэх бөгөөд энэ нь уг хэрэгслийг өөрчлөх эсвэл дибаг хийх хүсэлтэй хөгжүүлэгчдэд тохиромжтой.
_log()
: Аудитын мөрүүдийг тодорхой болгохын тулд мессежийг цагийн тэмдэгтээр угтдаг туслах функц. _log () { echo "[$(date +%Y.%m.%d-%H:%M:%S)] $1" }
Энэ нь яагаад чухал вэ : Үйлдэл бүрийг (жишээ нь, "Багц бүтээгдсэн") контексттэй нь бүртгэж, алдааг олж засварлах ажлыг хялбаршуулдаг.
check_last_exec()
: Гарах код болон API хариултуудыг шалгах замаар өмнөх командуудын амжилтыг баталгаажуулдаг. check_last_exec () { # Checks $? (exit status) and $CURL_OUTPUT for errors if [ "$status" -ne 0 ] || [[ $output =~ .*success\":false* ]]; then _log "Error detected!"; exit 1; fi }
Энэ нь яагаад чухал вэ : Баталгаажуулалтын асуудал эсвэл хүчингүй зам зэрэг чухал алдаануудын гүйцэтгэлийг зогсоосноор чимээгүй бүтэлгүйтлээс сэргийлнэ.
Скрипт нь байрлалын долоон аргумент, дараа нь динамик шүүлтүүрийг хүлээн авдаг:
USR="$1" # AEM username PWD="$2" # AEM password SVR="$3" # Server host (eg, localhost) PORT="$4" # Port (eg, 4502) PKG_GROUP="$5" # Package group (eg, "backups") PKG_NAME="$6" # Package name (eg, "dam-backup") BK_FOLDER="$7" # Backup directory (eg, "/backups") shift 7 # Remaining arguments become filters (eg, "/content/dam")
Байршлын аргументууд нь энгийн байдлыг хангадаг бол shift
хувьсах шүүлтүүрийн замыг уян хатан зохицуулдаг.
PKG_NAME
доторх зайг доогуур зураасаар солино. PKG_NAME=${PKG_NAME// /_}
curl
ашиглан багцуудыг AEM-ийн API-ээр жагсааж, илүүдэл үүсгэхээс сэргийлнэ. if [ $(curl ... | grep "$PKG_NAME.zip" | wc -l) -eq 1 ]; then _log "Package exists—skipping creation." else curl -X POST ... # Creates the package fi
Оролтын замаас JSON шүүлтүүрийн массивыг бүтээдэг:
FILTERS_PARAM="" for i in "${!FILTERS[@]}"; do FILTERS_PARAM+="{\"root\": \"${FILTERS[$i]}\", \"rules\": []}" # Adds commas between entries, but not after the last done
Жишээ гаралт :
[{"root": "/content/dam"}, {"root": "/apps"}]
Энэ JSON нь AEM-ийн /crx/packmgr/update.jsp
төгсгөлийн цэгээр дамжуулан багцын тодорхойлолтод тарина.
build
командыг ашиглан эмхэтгэлийг идэвхжүүлнэ: curl -X POST … -F "cmd=build"
Тайлбар : Скрипт нь үргэлжлүүлэхийн өмнө бүтээц дуустал хүлээнэ.
curl
ашиглан .zip
файлыг татаж аваад цагийн тэмдэгтэй файлын нэрээр хадгална: BK_FILE="$PKG_NAME-$(date +%Y%m%d-%H%M%S).zip" curl -o "$BK_FOLDER/$BK_FILE" ...
create-remote-aem-pkg.sh
гэх мэт хараа хяналтгүй скриптүүдийн хувьд алдаатай харьцах, бүртгэх нь маш чухал бөгөөд алдааг эрт илрүүлж, тодорхой бүртгэдэг. Энэ скрипт нь гэнэтийн асуудлаас хэрхэн хамгаалж, хэрэгжүүлэх боломжтой ойлголтуудыг өгдөг.
_log
функц нь мессеж бүрийг [YYYY.MM.DD-HH:MM:SS]
гэсэн угтвартай болгож, дибаг хийх аудитын мөрийг үүсгэдэг: _log "Starting backup process..." # Output: [2023.10.25-14:30:45] Starting backup process...
Яагаад чухал вэ : Цагийн тэмдэг нь скриптийн үйл ажиллагааг AEM серверийн бүртгэл эсвэл гадаад үйл явдлуудтай (жишээ нь, cron ажлын хуваарь) уялдуулахад тусалдаг.
Нислэгийн өмнөх шалгалт :
BK_FOLDER
) байгаа эсэхийг баталгаажуулна: if [ ! -d "$BK_FOLDER" ]; then _log "Backup folder '$BK_FOLDER' does not exist!" && exit 1 fi
PKG_NAME
ариутгана (жишээ нь, доогуур зураасаар солигдсон зай).
API хариултын баталгаажуулалт :
check_last_exec
функц нь бүрхүүлээс гарах код ( $?
) болон AEM API хариултуудыг хоёуланг нь шалгадаг:
check_last_exec "Error message" "$CURL_OUTPUT" $CURL_STATUS
curl
сүлжээний алдаа) нь шууд гарах үйлдлийг өдөөдөг.
success\":false
JSON хариулт эсвэл "HTTP ERROR" мөрүүдийг илрүүлдэг.
3.3 HTTP статусын баталгаажуулалт : Багцыг татаж авах үед скрипт нь 200
статусын кодыг шалгана:
if [ "$(curl -w "%{http_code}" ...)" -eq "200" ]; then # Proceed if download succeeds else _log "Error downloading the package!" && exit 1 fi
check_last_exec
401 Unauthorized
хариултыг барьж, тодорхой алдааны мэдэгдлээр гарна.success:false
, скрипт "Шүүлтүүр нэмэхэд алдаа" гэж бүртгэж, дуусгавар болно.BK_FILE
бичиж чадсангүй, файлын хэмжээг -s
тугаар шалгаж, гарахын өмнө анхааруулга өгнө.curl
тэгээс өөр кодоор гарна, скрипт "Багцыг бүтээхэд алдаа" гэж бүртгэдэг.curl -k
ашигладаг бөгөөд SSL баталгаажуулалтыг алгасдаг. Үйлдвэрлэлийн зөвлөмж : CA багцыг зааж өгөхийн тулд --cacert
гэж солино.
$AEM_PASSWORD
).set -x
түр нэмнэ үү.curl
командуудыг ажиллуулж асуудлыг тусгаарлана ./create-remote-aem-pkg.sh ... >> /var/log/aem_backup.log 2>&1
create-remote-aem-pkg.sh
скрипт нь эхлэх цэг байхаар бүтээгдсэн—багийнхаа хэрэгцээнд нийцүүлэн өөрчлөх боломжтой суурь юм. Үйл ажиллагааг нь өргөтгөх эсвэл тодорхой хэрэглээний тохиолдлуудад дасан зохицохын тулд хэрэгжүүлэх удирдамжийн хамт нийтлэг тохиргоонуудыг доор харуулав.
Өгөгдмөл файлын нэр нь цагийн тэмдэг ашигладаг ( $PKG_NAME-$(date +%Y%m%d-%H%M%S).zip
). Орчны нэр, төслийн ID эсвэл семантик хувилбарыг оруулахын тулд үүнийг өөрчил:
# Example: Include environment (eg, "dev", "prod") BK_FILE="${PKG_NAME}-${ENV}-$(date +%Y%m%d).zip" # Example: Add Git commit SHA for traceability COMMIT_SHA=$(git rev-parse --short HEAD) BK_FILE="${PKG_NAME}-${COMMIT_SHA}.zip"
Зөвлөмж : Огноо/цагийн форматыг файлын нэрэнд хориглосон тэмдэгтүүдээс (жишээ нь, Windows дээр хоёр :
) оруулахгүй байхыг анхаарна уу.
Скрипт нь динамик замыг шүүлтүүр болгон хүлээн зөвшөөрдөг боловч та мөн байнга ашиглагддаг замыг хатуу кодлох эсвэл хасах зүйл нэмж болно:
# Hardcode essential paths (eg, "/var/audit") DEFAULT_FILTERS=("/content/dam" "/apps" "/var/audit") FILTERS=("${DEFAULT_FILTERS[@]}" "${@}") # Merge with command-line inputs # Add exclusion rules (requires AEM API support) FILTERS_PARAM+="{\"root\": \"${FILTERS[$i]}\", \"rules\": [{\"modifier\": \"exclude\", \"pattern\": \".*/test/*\"}]}"
Энгийн текст нууц үгээс зайлсхий :
Итгэмжлэлийг оруулахын тулд орчны хувьсагч эсвэл нууц менежер ашиглана уу:
# Fetch password from environment variable PWD="$AEM_PASSWORD" # Use AWS Secrets Manager (example) PWD=$(aws secretsmanager get-secret-value --secret-id aem/prod/password --query SecretString --output text)
SSL баталгаажуулалтыг хэрэгжүүлэх :
curl -k
(найдваргүй) -г итгэмжлэгдсэн CA сертификатаар солино уу:
curl --cacert /path/to/ca-bundle.crt -u "$USR":"$PWD" ...
Амжилттай татаж авсны дараа скриптийг сунгахын тулд доод процессыг идэвхжүүлнэ үү:
# Example: Upload to cloud storage aws s3 cp "$BK_FOLDER/$BK_FILE" s3://my-backup-bucket/ # Example: Validate package integrity CHECKSUM=$(sha256sum "$BK_FOLDER/$BK_FILE" | cut -d ' ' -f 1) _log "SHA-256 checksum: $CHECKSUM" # Example: Clean up old backups (retain last 7 days) find "$BK_FOLDER" -name "*.zip" -mtime +7 -exec rm {} \;
Амжилт, бүтэлгүйтлийн талаар Slack, имэйл эсвэл хяналтын хэрэгслээр багууддаа мэдэгдэх:
# Post to Slack on failure curl -X POST -H 'Content-type: application/json' \ --data "{\"text\":\"🚨 AEM backup failed: $(hostname)\"}" \ https://hooks.slack.com/services/YOUR/WEBHOOK/URL # Send email via sendmail if [ $? -ne 0 ]; then echo "Subject: Backup Failed" | sendmail [email protected] fi
AEM багцуудыг удирдах нь гар ажиллагаатай, алдаа гаргадаг ажил байх албагүй. create-remote-aem-pkg.sh
скриптийн тусламжтайгаар та багц үүсгэх, шүүх, түгээх үйл явцыг хялбаршуулсан, давтагдах процесс болгон хувиргах боломжтой. Энэ хэрэгсэл нь зөвхөн цаг хугацаа хэмнээд зогсохгүй, таны AEM үйл ажиллагаанд тогтвортой байдал, найдвартай байдал, өргөтгөх чадварыг идэвхжүүлэх явдал юм.
Автоматжуулалт ялалт : Гүйлгээний интерфэйсийн давтагдах харилцан үйлчлэлийг арилгаснаар скрипт нь хүний алдааг багасгаж, багууд илүү үнэ цэнэтэй ажлуудад анхаарлаа төвлөрүүлэх боломжийг олгодог.
Уян хатан байдлын чухал ач холбогдолтой : Чухал агуулгыг нөөцлөх, орчныг синхрончлох эсвэл шинэчлэлт хийхэд бэлтгэхэд скрипт нь хамгийн бага тохируулгатай олон төрлийн хэрэглээний тохиолдлуудад дасан зохицдог.
Тохиромжтой байдал нь гол зүйл юм : Бүртгэл, алдаа шалгах, аюулгүй байдлын талаар анхаарах зүйлс нь бүх зүйл хажуу тийшээ явсан ч скриптийг урьдчилан таамаглах боломжтой болгодог.
Гайхалтай хэрэгслүүд нь бодит ертөнцийн сорилтуудаас төрдөг. Энэ скрипт нь эхлэлийн цэг юм; Танай багийн хэрэгцээ өсөхийн хэрээр үүнийг бий болгох үндэс суурь гэж бодоорой. Та соло хөгжүүлэгч эсвэл том DevOps багийн нэг хэсэг эсэхээс үл хамааран үүнтэй төстэй автоматжуулалт нь кодонд хийсэн жижиг хөрөнгө оруулалт нь бүтээмж, сэтгэлийн амар амгаланд асар их өгөөж авчрах жишээг харуулж байна.
Дараагийн алхам хийхэд бэлэн үү?
Дагасанд баярлалаа - одоо урагшлаад автоматжуул! 🚀
#!/bin/bash set -eo pipefail # The script will create a package thought the package manager api: # - The package is created, if not already present # - Package filters are populated accordingly to specified paths # - Package is builded # - Package is download to the specified folder _log () { echo "[$(date +%Y.%m.%d-%H:%M:%S)] $1" } check_last_exec () { local message="$1" local output="$2" local status=$3 if [ "$status" -ne 0 ]; then echo && echo "$message" && echo exit 1 fi if [[ $output =~ .*success\":false* ]] || [[ $output =~ .*"HTTP ERROR"* ]]; then _log "$message" exit 1 fi } USR="$1" PWD="$2" SVR="$3" PORT="$4" PKG_GROUP="$5" PKG_NAME="$6" BK_FOLDER="$7" shift 7 # The following paths will be included in the package FILTERS=($@) BK_FILE=$PKG_NAME"-"$(date +%Y%m%d-%H%M%S).zip _log "Starting backup process..." echo "AEM instance: '$SVR':'$PORT' AEM User: '$USR' Package group: $PKG_GROUP Package name: '$PKG_NAME' Destination folder: $BK_FOLDER Destination file: '$BK_FILE' Filter paths: " printf '\t%s\n\n' "${FILTERS[@]}" if [ ! -d "$BK_FOLDER" ]; then _log "Backup folder '$BK_FOLDER' does not exist!" && echo exit 1 fi PKG_NAME=${PKG_NAME// /_} check_last_exec "Error replacing white space chars from package name!" "" $? || exit 1 _log "Removed whitespaces from package name: '$PKG_NAME'" BK_FILE=$PKG_NAME.zip _log "Backup file: '$BK_FILE'" _log "Creating the package..." if [ $(curl -k -u "$USR":"$PWD" "$SVR:$PORT/crx/packmgr/service.jsp?cmd=ls" 2>/dev/null | grep "$PKG_NAME.zip" | wc -l) -eq 1 ]; then _log " Package '$PKG_GROUP/$PKG_NAME' is already present: skipping creation." else curl -k --silent -u "$USR":"$PWD" -X POST \ "$SVR:$PORT/crx/packmgr/service/.json/etc/packages/$PKG_GROUP/$PKG_NAME?cmd=create" \ -d packageName="$PKG_NAME" -d groupName="$PKG_GROUP" check_last_exec " Error creating the package!" "" $? _log " Package created" fi # create filters variable FILTERS_PARAM="" ARR_LEN="${#FILTERS[@]}" for i in "${!FILTERS[@]}"; do FILTERS_PARAM=$FILTERS_PARAM"{\"root\": \"${FILTERS[$i]}\", \"rules\": []}" T=$((i+1)) if [ $T -ne $ARR_LEN ]; then FILTERS_PARAM=$FILTERS_PARAM", " fi done # add filters _log "Adding filters to the package..." CURL_OUTPUT=$(curl -k --silent -u "$USR":"$PWD" -X POST "$SVR:$PORT/crx/packmgr/update.jsp" \ -F path=/etc/packages/"$PKG_GROUP"/"$PKG_NAME".zip -F packageName="$PKG_NAME" \ -F groupName="$PKG_GROUP" \ -F filter="[$FILTERS_PARAM]" \ -F "_charset_=UTF-8") CURL_STATUS=$? # Pass the status to the check_last_exec function check_last_exec "Error adding filters to the package!" "$CURL_OUTPUT" $CURL_STATUS _log " Package filters updated successfully." # build package _log "Building the package..." CURL_OUTPUT=$(curl -k -u "$USR":"$PWD" -X POST \ "$SVR:$PORT/crx/packmgr/service/script.html/etc/packages/$PKG_GROUP/$PKG_NAME.zip" \ -F "cmd=build") check_last_exec " Error building the package!" "$CURL_OUTPUT" $? _log " Package built." # download package _log "Downloading the package..." if [ "$(curl -w "%{http_code}" -o "$BK_FOLDER/$BK_FILE" -k --silent -u "$USR":"$PWD" "$SVR:$PORT/etc/packages/$PKG_GROUP/$PKG_NAME.zip")" -eq "200" ]; then if [ -f "$BK_FOLDER/$BK_FILE" ] && [ -s "$BK_FOLDER/$BK_FILE" ]; then _log " Package $BK_FILE downloaded in $BK_FOLDER." exit 0 fi fi _log " Error downloading the package!" exit 1
[¹] curl -k
ашиглан SSL баталгаажуулалтыг алгасах нь тест хийхэд тохиромжтой, гэхдээ та үйлдвэрлэлд илүү бат бөх зүйлийг (жишээ нь --cacert
) хүсэх болно!