LINUX.ORG.RU

Помогите с Bash скриптом

 


0

1

Всем привет! пишу скрипт для бекапа Elasticsearch, и хочу после завершения бекапа смотреть действительно ли забекапились данные ( индексы ) Каждый день у меня в elasticsearch создаются некие индексы которые я хочу бекапить, и при запуске скрипта для бекапа эти индексы я вставляю в переменную ( для примера сниппет из моего скрипта)

_DATE=$(date '+%Y.%m.%d')
_UZBEKISTAN_INDICES=$(curl -s -X GET "localhost:9200/_cat/indices?v" | grep 'tashkent-'$_DATE'\|fergana-'$_DATE'' | awk '{ print $3 }')

и если мы сделаем echo _$UZBEKISTAN_INDICES в скрипте то вывод будет такой

tashkent-2021.09.20 fergana-2021.09.20

Для проверки бекапа Имеется такой выхлоп со списком индексов которые забекапились

curl -s -XGET "localhost:9200/_snapshot/uzbekistan-2021.09.20/uzbekistan-2021.09.20/?pretty"
{
  "snapshots" : [
    {
      "snapshot" : "uzbekistan-2021.09.20",
      "uuid" : "CLDZ6bLpS06s37tUKNwxpg",
      "version_id" : 7040099,
      "version" : "7.4.0",
      "indices" : [
        "tashkent-2021.09.20",
        "fergana-2021.09.20"
      ],
      "include_global_state" : false,
      "metadata" : {
        "taken_by" : "kimchy",
        "taken_because" : "backup before upgrading"
      },
      "state" : "SUCCESS",
      "start_time" : "2021-09-20T07:00:06.272Z",
      "start_time_in_millis" : 1632121206272,
      "end_time" : "2021-09-20T07:00:06.472Z",
      "end_time_in_millis" : 1632121206472,
      "duration_in_millis" : 200,
      "failures" : [ ],
      "shards" : {
        "total" : 2,
        "failed" : 0,
        "successful" : 2
      }
    }
  ]
}

думаю что правильнее будет проверять какие именно индексы забекапились и сравнивать их с содержимым переменной _$UZBEKISTAN_INDICES а проверять нужно с этого момента в выхлопе

"indices" : [
       "tashkent-2021.09.20",
       "fergana-2021.09.20"
     ],

знатоки, подскажите пожалуйста как грамотно организовать проверку?

Не скажу с т.ж. эластика, правильны ли твои портянки, но получить данные из json можно через jq. Конкретно для твоего примера

... | jq '.snapshots[0].indices | to_entries[] | .value'
anonymous
()

а можете пожалуйста подсказать как сравнивать множество из этого output с целевой переменной?

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

столкнулся с такой вещью в проверке бекапа на эластике, индексы идут с такой последовательностью

 "indices" : [
      "tashkent-2021.09.20",
      "fergana-2021.09.20",

а в переменной с вот такой

fergana-2021.09.20 tashkent-2021.09.20 

вопрос как мне можно сравнивать данные строки? т.е чередование слов идет по разному, в выхлопе сначала tashkent потом fergana, а в переменной наоборот fergana потом tashkent, можно ли сделать как то что бы сравнивание было именно на слова а не на порядок слов?

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

Вообщем попробовал через bash arrays и циклом прошелся

ARR1=($_BACKUP_OUTPUT)
ARR2=($_BACKUP_INDICES)

RES=1

for i in "${ARR1[@]}"; do
    [[ ! " ${ARR2[*]} " =~ " ${i} " ]] && RES=0 && break
done

[ $RES -eq 1 ] && echo 'Indices is present on backup' || echo 'Backup failed'

проверил работает Уважаемые знатоки, как по вашему мнению результат? или же можно было сделать лучше

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

Можно на этапе операции из _UZBEKISTAN_INDICES получить две переменные (например, через awk NR==N) и через jq получить две переменные (через to_entries[N]), а затем их сравнить. Без циклов и массивов. По простому.

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

Попробовал еще вот так через if

if [[ $(tr ' ' '\n' <<<"$_BACKUP_OUTPUT" | sort) = $(tr ' ' '\n' <<<"$_BACKUP_INDICES" | sort) ]]; then echo "indices present on backup" ; else echo "indices don't present on backup"; fi

работает

SimpleEnough
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.