LINUX.ORG.RU
Ответ на: комментарий от anonymous

))) может быть, я просто к языкам высокого уровня привык. А что значит слово «упоролся». А пример упростил что бы суть понятна была.

petav ★★★★★
() автор топика

это что какоето подобие на хеш списки перла?

guyvernk
()

да не случайно получилось

petav ★★★★★
() автор топика
#!/bin/bash

ADAM=(mt)
EVA=(ast zer)

thisnode=${ADAM[*]}
echo ${thisnode[0]} #вывести "mt"
declare -a thisnode=(${EVA[*]})
echo ${thisnode[1]} #вывести "zer"

$ sh test.sh
mt
zer

Хешей нет в bash.

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

дело в том
что ADAM это строка
thisnode=${ADAM

  • }
    которую возвращает uname -n

    Вот у меня проблема подставит именно эту строку.

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

не не совсем, я уже ниже написал ADAM это строка которую получаю uname -n т.е. в зависимости на каком хосте скрипт тот массив и использую

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

Наверное я задачу поставил коряво прошу прощения. Сегодня много информации для меня....

1) Есть два массива

ADAM EVA

2) Если скрипт запускаем на компьютере ADAM то используем массив ADAM...

ADAM=(mt)

EVA=(ast zer)

thisnode=`uname - n` #ADAM

echo $thisnode[0] #вывести «mt»

во как

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

Ах да, и уж конечно не пользоваться такими преобразованиями типов

anonymous
()
Ответ на: комментарий от guyvernk

думаю придется чуть. 100% как хотелось не получается.

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

да ну что вы. Просто вы предложили хороший вариант. Спасибо, я уже его использую только в некоторой доработке.

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

в зависимости на каком хосте скрипт тот массив и использую

А не проще в начале написать

. config

и положить на каждый хост свой config?

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

не скрипт должен иметь представления о конфигах обоих серверов.

Зак....я я все упрощать. Видимо наследие других языков. Решил написать на Pythone. Мне кажется проще будет. Задачка не рядовая на bash красиво не получается.

petav ★★★★★
() автор топика
ADAM=(mt)
EVA=(ast zer)
thisnode="ADAM"
eval echo \${$thisnode[0]} #вывести "mt"
thisnode="EVA"
eval echo \${$thisnode[1]} #вывести "zer"
arsi ★★★★★
()
Ответ на: комментарий от arsi

Я вот все тоже самое пробывал, только без «\»

Что это означает «\»

Спасибо, большое работает так как мне и нужно. Да и в коде красиво смотрится.

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

> Что это означает «\»

экранирует первый бакс, в результате чего он не считается служебным символом. аналогично записи «eval echo '${'$thisnode'[0]}'». разыменование происходит в 2 захода:

1. bash: «eval echo \${$thisnode[0]}» → «eval echo ${ADAM[0]}»;

2. eval: «echo ${ADAM[0]}» → «echo mt».

arsi ★★★★★
()
Ответ на: комментарий от petav

> а как все это не напечатать на экран, а вывести в переменную

ADAM=(mt)
EVA=(ast zer)
thisnode="ADAM"
x=$(eval echo \${$thisnode[0]})
echo $x #вывести "mt"
thisnode="EVA"
x=$(eval echo \${$thisnode[1]})
echo $x #вывести "zer"
arsi ★★★★★
()
Ответ на: комментарий от petav

скрипт должен иметь представления о конфигах обоих серверов

#тогда так
. config.ADAM
...
. config.EVA
...
. config.`hostname`
#или так
adam() {
thisnode=...
}
eva() {...}
adam
echo ${thisnode[...

Решил написать на Pythone

Если только ради конфига, то зря, суммарно хуже получится.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

в итоге еще ни на чем не написал ))))))))

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

а если вот так

x=$(eval echo \${$thisnode[*]})
то в x будет весь массив и его можно перебирать for

petav ★★★★★
() автор топика
Ответ на: комментарий от arsi
#!bin/bash

#Узлы кластера
nodes=(ADAM EVA)

#Запущенные домены на узле ADAM
ADAM=(mt)

#Запущенные домены на узле ADAM
EVA=(ast zer)

#функция через которую выполняю каманды, а она отслеживает где должны выполняться команды на локальном хосте или по ssh
function line {
	command=$1 #команда
	node=$2 #Получаем имя узла на котором находимся сейчас
	
	if ($node==`uname -n`) #Работать с доменами на локальной машине
		#Здесь в цикле перебрать все домены $domains
	else #Работать с доменами на удаленной машине через ssh
		#Здесь в цикле перебрать все домены $domains

}

#Функция которая показвает состояние доменов, еще похожая start и stop
function state {
	for ((i=0; i<${#nodes[@]}; i++)); do #перебираем все узлы в кластере. Ну их всего два
		domains=($(eval echo \${$node[*]})) #Получаем массив доменов для узла $i
		for ((ii=0; ii<${#domains[@]}; ii++)); do #Перебираем массив доменов
			state=line("virsh domstate ${#domains[$ii]}", ${node[$i]}) #Узнаем сотояние какждого домена
			echo ${node[$i]} ${#domains[$ii]} state #выводим имя узла имя_домена состояние
		done
	done
}

#Обработчик переданных аргументов
state






Это набросок того что я хочу второй день написать на bash но не могу постигнуть тонкости программирования на нем. Все эти скобочки крючечки как регулярные выражения прямо.

Поправьте пожалуйста мои ошибочки, по примеру мне будет проще разобраться как в bash все устроено.

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

Написать - это еще ладно, а вот сопровождать это кому придется?

Если не баш-гуру, то я бы такое не использовал - через полгода придется снова на ЛОРе спрашивать что эти «скобочки» означают.

Да и в коде красиво смотрится.

Писать красиво - это не цель, а способ сделать свое будущее светлее. А у тебя выходит почти что наоборот. Для баша есть свои задачи, не надо использовать его из принципа.

fagot ★★★★★
()
Ответ на: комментарий от petav

#Функция которая показвает состояние доменов, еще похожая start и stop

def state:
    for i in nodes:
        for d in i:
            state = line("virsh domstate %s", d)
            print i, d, state

Сравни свой код на bash и что-то вроде того на python - одна и та же задача требует принципиально разного уровня владения языком.

Понятно что и на питоне это можно реализовать еще проще, но может не стоит усложнять себе жизнь башем? :)

fagot ★★★★★
()
Ответ на: комментарий от fagot

Ну я же не приложение пишу. Думаю bash тут уместнее. Тут у меня задача несколько команд обвязать логикой. Хотя я уже и не знаю. Наверное буду писать на bash из принципа что бы понять как это работает. Опыт нарабатывать. Ну а ваш код конечно красивее тут не поспоришь и читабельнее потому что на многие языки похож, bash Тоже читабелен если понять принципы.

petav ★★★★★
() автор топика
Ответ на: комментарий от petav
#cat скрипт
DOMS_HOST1="mt"
DOMS_HOST2="ast zer"
for list in ${!DOMS_*} ; do
  host=`tr A-Z a-z <<<${list#*_}`
  test `hostname -s` = "$host" && rcmd="" || rcmd=ssh
  eval doms="\$$list"
  for dom in $doms ; do
    $rcmd virsh "$@" $dom
  done
done
#./скрипт domstate
#./скрипт start
#и т.д.

А вообще слишком похоже на ненужный костыль, концептуальнее ставить систему мониторинга/управления, и уже встраивать в неё.

и на питоне короче не будет, башевские недостатки проявляются только в 1 строке.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Красота, я не все ходы понимаю конечно, особенно что значат <<<

<<<{list#*_}
и $@
$rcmd virsh "$@" $dom

концептуальнее ставить систему мониторинга/управления, и уже встраивать в неё

Не проясните подробнее суть вашего предложения в скрипт domstste нужно вынести логику как я понимаю которая покажет состояние домена.

$ скрипт start
$ скрипт stop
$ скрипт status

Как это увязать с вашей концепцией. Простите я только хочу стать гуру bash ))).

petav ★★★★★
() автор топика
Ответ на: комментарий от petav
 "$@" 

Это понял что к чему ))))). Это аргументы вызова скрипта. Но осталось не понятно что вы имеете ввиду про эти скрипты:

 #./скрипт domstate #./скрипт star 

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

Аааааааааа, наверное вот здесь чуть поправить нужно ваш код

$rcmd virsh "$@" $dom
на
$rcmd "$@" $dom

и теперь в подключаемом скрипте ./status написать

function status {
   $dom=$1
   virsh domstate $dom
   drbdadmin cstate  $dom
   drbdadmin role  $dom
   # и т.д
}

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

только вот на удаленном хосте ssh не найдет status. Что-то я все таки не допонял. Нужно отдохнуть

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

как-то так?

#!/bin/bash

#Узлы кластера
nodes='ADAM EVA'

#Запущенные домены на узле ADAM
ADAM='mt'

#Запущенные домены на узле ADAM
EVA='ast zer'

#функция через которую выполняю каманды, а она отслеживает где должны выполняться команды на локальном хосте или по ssh
function line {
   command=$1 #команда
   node=$2 #Получаем имя узла на котором находимся сейчас

   if [ "$node" = "$(uname -n)" ]; then #Работать с доменами на локальной машине
      echo "(running command '$command' on localhost)"
   else #Работать с доменами на удаленной машине через ssh
      echo "(running command '$command' on remote node '$node')"
   fi
}

#Функция которая показвает состояние доменов, еще похожая start и stop
function state {
   for node in $nodes; do #перебираем все узлы в кластере. Ну их всего два
      domains=${!node} #Получаем массив доменов для узла $i
      for domain in $domains; do #Перебираем массив доменов
         line "virsh domstate $domain" $node #Узнаем сотояние какждого домена
         echo "$node $domain $?" #выводим имя узла имя_домена состояние
      done
   done
}

#Обработчик переданных аргументов
state
arsi ★★★★★
()
Ответ на: комментарий от DonkeyHot

Подход хороший но не гибкий. Просто логика для каждой функции отличается. К примеру status выполняет одинаковые команды на каждом узле синхронно. Ваш пример работает отлично. Но start уже нет, одни команды на одном узле другие на другом.

К примеру если выполнить команду start на первом узле:
1) Проверить не запущен ли домен на этом узле
2) Проверить не запущен ли домен на втором узле
3) Выставить drbd диск в primary
4) Выставить drbd диск в secondary
4) Запустить домен на первом узле

(некоторую логику я опустил)
Может я просто все таки не понял суть предложения

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

Ага, похоже. Сейчас попробую функцию start написать в таком подходе и отвечу. [br] [code=bash] domains=${!node} [/code] Так вот как оказывается в переменную «перегрузить» массив

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

><<<{list#*_}

доллар потерялся. (<<<${list#*_}) == передать программе строку из переменной list, отбросив оттуда всё до первого '_'.

концептуальнее

С ростом системы наступит момент, когда придётся ставить отдельную систему для управления всем зоопарком. Тогда придётся выбрасывать эти скрипты и писать новые, с интерфейсом выбранной системы.

Т.ч. если рост предвидится, лучше всего сразу делать «энтерпрайзно» - ставить какую-нибудь систему управления и прикручивать всё к ней, in the long run выгоднее.

DonkeyHot ★★★★★
()
Ответ на: комментарий от petav

>некоторую логику я опустил

Вот с этого нужно было начинать:) Твои требования _уже_ переросли мелкие скрипты. Смотри готовые решения. Порыться хотя-бы на linux-ha.org, там что-то должно быть по этому поводу.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

я просто привык делить задачу на мелкие подзадачи, а тут как то не справился с этим :). Зато много о баше узнал :). Я там и порылся несколько похожих нашел, но все равно под свои задачи хочу сам написать.

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