Showing posts with label сеть хранения данных. Show all posts
Showing posts with label сеть хранения данных. Show all posts

Tuesday, May 29, 2012


Как составить список объектов подключённых к сети хранения данных SAN.


Для удобной работы с коммуникаторами и особенно для автоматизации через скрипты, Вам необходимо установить SSH ключи на ваши устройства. Это можно сделать вручную или через предлагаемые утилиты,если у вас, как и у меня сеть достаточно велика. Я опишу оба метода, но прежде всего как с генерировать ключ (если вы это знаете, просто пропустите этот раздел)
Генерация SSH ключа ssh-keygen
В большинстве UNIX систем это делается командой ssh-keygen, она имеет довольно много аргументов, но в нашем случае хватит -f для указания в каком файле сохранить ключ, если вы опустите и его, то ключ будет сохранен в файле по-умолчанию /home/<имя_пользователя>/.ssh/id_rsa что не всегда удобно, поскольку возможно данный файл существует и используется в других целях. Итак:
 ssh-keygen -f my_key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):  -- Здесь необходимо нажать ввод, иначе скрипт остановится для запроса пароля
Enter same passphrase again:
Your identification has been saved in my_key.
Your public key has been saved in my_key.pub.
The key fingerprint is:
70:4f:9c:ab:f4:f0:8e:cf:14:24:5a:a4:47:82:1c:4e my_user@server.com

В результате:
ls -l my_key*
-rw------- 1 user group 1675 May 24 21:01 my_key
-rw-r--r-- 1 user group 412 May 24 21:01 my_key.pub
Мы получили пару ключей файл my_key.pub содержит публичную часть ключа которую мы пошлём в коммуникатор или другое устройство, а my_key личный ключ который подтверждает право на подключение.
Мы готовы устанавливать ключи.

Вручную
Cisco
Тут всё достаточно просто: извлекаем ключ из файла –
cat my_key.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA18qtCG8mEd0G99t7BC90PfInOONYj3XAgyIBk3jE+QruXDsyjg5AuBB/N0DTEbq8t6L3ki8DkyeGg+MgKMH/4n6kk K/662SbJlXfHOPJxRWoW9RYBiIA75wko92PE6EHZtWxZAabStWC3XzUxYcfF0FLgg1fRdqTB2xbgmSpIvJG5W6gG8VtVTIqONqUgJ8svGARF/vvig7NCKbRT8lQvY S9OLsf5s43YTxuHJHZSMhQ1Qtvk1/jgSTgV4FU6W3VCb7DG8VtolrDnJTqn+KWjqgsGVKf9NkmUrU8DP+HrWheK+6y9As1AbStSNM3irVGGxf2VQboEEih+sovQxM UiQ== user@server.com

Подключаемся к коммуникатору через ssh или telnet
Вводим команду conf t для перехода в режим конфигурации
и после этого -
user admin sshkey ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA18qtCG8mEd0G99t7BC90PfInOONYj3XAgyIBk3jE+QruXDsyjg5AuBB/N0DTEbq8t6L3ki8DkyeGg+MgKMH/4n6kk K/662SbJlXfHOPJxRWoW9RYBiIA75wko92PE6EHZtWxZAabStWC3XzUxYcfF0FLgg1fRdqTB2xbgmSpIvJG5W6gG8VtVTIqONqUgJ8svGARF/vvig7NCKbRT8lQvY S9OLsf5s43YTxuHJHZSMhQ1Qtvk1/jgSTgV4FU6W3VCb7DG8VtolrDnJTqn+KWjqgsGVKf9NkmUrU8DP+HrWheK+6y9As1AbStSNM3irVGGxf2VQboEEih+sovQxM UiQ== user@server.com

конечно в вашим ключом :)
и наконец сохраняем конфигурацию -
copy running-config startup-config

Всё, дело сделано, можно уходить.

Brocade
Тут все к сожалению несколько сложнее, Brocade не принимает ключ как строку, он либо сам генерирует пару, что часто не удобно, либо запрашивает параметры сервера откуда он может получить файл ключа по FTP или SCP. Как это происходит:
Вы подключаетесь к коммуникатору через ssh или telnet и вводите команду -
sshutil importpubkey  
коммуникатор начинает импорт ключа и запрашивает IP сервера (именно IP а не имя) вы вводите адрес сервера где находится с генерированный вами ключ, например 192.168.1.10 -
Enter IP address: 192.168.1.10
после этого следует запрос папки в которой лежит файл, вы вводите путь, например /home/user/
Enter remote directory: /home/user/
следует запрос имени файла ключа, обратите внимание - его публичной части, вводим например my_key.pub -
Enter public key name(must have .pub suffix): my_key.pub
теперь вводим имя пользователя на сервере где хранится ключ, например user -
Enter login name: user
и его пароль, например password -
user@192.168.1.10's password:                                 -- пароль не отображается

Если все прошло хорошо, вы получите подтверждение успешного импорта ключа.

Теперь ssh команда вроде -
ssh -i /home/user/my_key admin@my-switch
позволит вам подключится к коммуникатору без пароля

Всё это достаточно просто, но если вы счастливый обладатель большой сети, и не любите повторять подобные операции по сто раз, воспользуйтесь утилитами brc_sw_ssh_key.exp и cis_sw_ssh_key.exp которые я выкладываю здесь - util.tar.gz 
Скопируйте архив в директорию программы и распакуйте, эти и некоторые другие утилиты (о которых позже) вы найдёте в папке ./util . Для работы программы необходим стандартный пакет expect.

Автоматическая установка ключа:
Cisco (скрипт cis_sw_ssh_key.exp)
./cis_sw_ssh_key.exp <Switch> <SW_pass> <Key_file>
где -
<Switch>      - Имя или IP коммуникатора
<SW_pass>  - Пароль пользователя admin
<Key_file>     - Файла публичной части ключа
Пример:  ./cis_sw_ssh_key.exp switch-1 password /home/user/my_key.pub

!!! Рекомендую вам создать батч файл, и запускать команду из него, иначе в history вашего сервера останется администраторский пароль открытым текстом !!!

Brocade (скрипт brc_sw_ssh_key.exp)
./brc_sw_ssh_key.exp <Switch> <SW_pass> <Server_IP> <Srv_User> <Key_Dir> <Key_file> <Srv_pass>
где -
<Switch>      - Имя или IP коммуникатора
<SW_pass>  - Пароль пользователя admin
<Server_IP>  - IP сервера доступного по SCP и хранящего файл публичной части ключа
<Srv_User>   - Пользователь для доступа к этому серверу
<Key_Dir>     - Папка где хранится ключ
<Key_file>     - Файла публичной части ключа
<Srv_pass>   - Пароль учётной записи пользователя на этом сервере
Например: ./brc_sw_ssh_key.exp switch-1 password 192.168.1.10 user /home/user/ my_key.pub password

!!! Рекомендую создать батч файл, и запускать команду из него, иначе в history вашего сервера останется администраторский пароль а так-же пароль пользователя открытым текстом !!!

И так, SSH ключи на коммуникаторах установлены, а это значит можно начать автоматическую работу.

Для полнофункциональной работы автоматических скриптов теперь не хватает только библиотеки объектов, т.е. набора имён и WWN для каждого объекта подключённого к фабрику.

Начнём с дисковых массивов, я предложу методы для EMC symmetrix, EMC VNX, EMC Clariion, Netapp и Hitachi хотя подход одинаков для любого другого стореджа.
Сначала руками:

EMC Symmetrix, используем команду SYMCLI -
symcfg  -sid <SID> list -v -FA all  - команда выводит информацию о всех front-end портах, нас интересуют те у которых Director Connection Status - Yes т.е. подключённые к фабрику.

Результат будет примерно:
...............................
   Director Identification: FA-11G

        Director Type                      : FibreChannel (563)
        Director Status                    : Online

        Number of Director Ports        : 2
        Director Ports Status                : [ON,ON,N/A,N/A]
        Director Connection Status      : [Yes,N/A,N/A,N/A]
        Director Symbolic Number      : 11G
        Director Numeric Number        : 107
        Director Slot Number               : 11
        Director Port: 0
        WWN Node Name                    : 5000097407145800
        WWN Port Name                      : 50000974071459A8

Что означает - порт 11G:1 подключён к фабрику.
Для портов SRDF  - репликация между массивами команда немного другая:
symcfg  -sid <SID> list -v -RA all

и результат соответственно:
 Director Identification: RF-9H

        Director Type                                    : RDF-BI-DIR
        Director Status                                   : Online
        Director Symbolic Number                : 09H
        Director Numeric Number                 : 121
        Director Slot Number                         :  9
        Negotiated Speed (GB/Second)         :   4
        RDF HW Compression Supported     : No
        WWN Node Name                             : 50000974071459E0

EMC Clariion или VNX, используя navicli -
naviseccli -password <Password> -scope 0 -user <User_Name> -h <Host_name> port -list -sp либо
naviseccli -h <Host_name> port -list -sp если предварительно создан SecureFile командой -
naviseccli -AddUserSecurity -password <Password> -scope 0 -user <User_Name> -h <Host_name>
на выходе ищим линки не помеченные как "Down"

Например:
SP Name:             SP A
SP Port ID:          9
SP UID:              50:06:02:60:C6:E0:5A:86:50:06:01:62:46:E3:5A:86
Link Status:         Up
Port Status:         Online
Switch Present:      NO
SP Name:             SP A
SP Port ID:          10
SP UID:              50:06:02:60:C6:E0:5A:86:50:06:01:62:46:E6:5A:87
Link Status:         Down
Port Status:         DISABLED
Switch Present:      NO

Порт А9 подключён.

NETAPP, используем команду fcp config запускаемую через SSH или RSH -
ищем порты ONLINE

например:
0c:   ONLINE <ADAPTER UP>  PTP  Fabric
        host address 030380
        portname 50:0a:09:85:87:e9:4c:c8  nodename 50:0a:09:80:87:e5:4c:c8
        mediatype auto speed auto
0f:   OFFLINED BY USER/SYSTEM <ADAPTER DOWN>
        host address 000000
        portname 50:0a:09:84:97:43:3c:75 nodename 50:0a:09:85:87:43:3c:78
        mediatype auto speed auto

Порт 0c  ONLINE

HITACHI, команда aufibre1 -unit <storage_name> -refer -
находим блок: Port Information для поиска PWWN и блок: Link Status для проверки линка.

Пример:
Port Information
                                                    Port Address
  CTL  Port   Node Name          Port Name          Setting Current
    0     A   50060E8021054380   50060E8021054380   0000EF  0300A0
    0     B   50060E8021054381   50060E8021054381   0000EF  282900
    0     C   50060E8021054382   50060E8021054382   0000EF  000000
Link Status
  CTL  Port   Status
    0     A   LinkUp(F_Port Connected)
    0     B   LinkUp(F_Port Connected)
    0     C   Link Failure
    0     D   Link Failure


Как видите это не слишком сложно, однако довольно хлопотно.
Для автоматизации всего процесса я написал утилиту get_stor_port.sh которая выполняет за вас всю работу на основе файлов конфигурации. Перед её запуском необходимо запустить утилиту get_switch_obj.sh которая отследит информацию необходимую для распределения адресов по фабрикам.

Последними компонентами которые я заношу в библиотеку объектов являются PWWN серверов. Эта информация может быть получена из операционной системы и утилит поставляемых производителями оптических карт, либо извне, т.е. блэйд центров, коммуникаторов или BIOS сервера. Как я уже говорил в первой статье я работаю в основном с HP Blade System и написал специальную утилиту для сбора информации обо всех серверах через неё. Если вам будет интересно я опубликую и её, а так-же помогу разобраться как найти PWWN на уровне ОС.

Ну и в заключении как выглядит разультат работы скрипта:
 ./txt_get_zones.sh serv1,serv2 ALL ALL -v

BRC_FBR: PROD1

serv1_VMAX181_5F0 50:01:43:80:04:c3:6b:48 50:00:09:74:06:04:69:50
serv2_VMAX131_14E0 50:01:43:80:03:bc:1a:60 50:00:09:74:06:03:a1:34
 serv2_VMAX131_4E0 50:01:43:80:03:bc:1a:60 50:00:09:74:06:03:a1:0c
 serv2_VMAX555_5G0 50:01:43:80:03:bc:1a:60 50:00:09:74:06:16:99:90
 serv2_VMAX555_6G0 50:01:43:80:03:bc:1a:60 50:00:09:74:06:16:99:94
 serv2_VMX181_7G0 50:00:09:74:06:04:69:98 50:01:43:80:03:bc:1a:60

CIS_FBR: PROD1 VSAN: 1

serv1_VMAX181_7E1 50:01:43:80:04:c3:6b:4a 50:00:09:74:06:04:69:19
serv2_VMX181_FA-5G-1 50:01:43:80:03:bc:1a:62 50:00:09:74:06:04:69:91
 serv2_VMAX555_5G1 50:01:43:80:03:bc:1a:62 50:00:09:74:06:16:99:91
 serv2_VMAX555_6G1 50:01:43:80:03:bc:1a:62 50:00:09:74:06:16:99:95
 serv2_VMAX131_13E0 50:01:43:80:03:bc:1a:62 50:00:09:74:06:03:a1:30
 serv2_VMAX131_3E0 50:01:43:80:03:bc:1a:62 50:00:09:74:06:03:a1:08

Friday, May 18, 2012


Как начать пользоваться программой?

Всё предельно просто. Для начала, сгрузите архиве программы, содержащий сам скрипт, а так-же конфигурационные файлы и необходимые директории, отсюда - sites.google.com/site/san4fan/project - fbr.tar.gz. И разверните на вашем UNIX сервере откуда есть SSH доступ к коммуникаторам. И распакуйте:
tar xvf fbr.tar.gz

В результате вы получите папку ops со следующей структурой:
OBJ
conf
tmp
util
txt_get_zone_brc.sh
txt_get_zone_cis.sh
txt_get_zones.sh

Файл txt_get_zones.sh является собственно скриптом, а txt_get_zone_brc.sh и txt_get_zone_cis.sh дополнениями для работы с Brocade и Cisco устройствами соответственно.

Папка tmp - здесь всё понятно, как следует из имени предназначена для хранения временных файлов.

Папка conf - содержит следующие конфигурационные файлы:
fabric - тип и имя ваших фабриков, а так-же коммуникаторы для коммуникации с ними:
#Cisco
<SW_Type>#<FBR_Name>#<SW_Name>#<VSAN>
#Brocade
<SW_Type>#<FBR_Name>#<SW_Name>#

например:
CIS#PROD1#switch-1#1   -   Т.е. Cisco фабрик с именем PROD1 доступен через коммуникатор switch-1 для VSAN 1
BRC#TEST1#switch-2#     -   Т.е. Brocade фабрик с именем TEST1 доступен через коммуникатор switch-2

Замечу, что если вы в Cisco используете несколько VSAN-ов то вам придётся сделать строку для каждого, это даёт возможность различать VSAN-ы и скрипт построения зон не позволит построить зоны между объектами в разных VSAN-х.

auth - содержит данные для доступа ко всем контролируемым элементам, если библиотеку объектов (смотри ниже) вы будите создавать вручную - достаточно указать только информацию для доступа к коммуникаторам.
Содержит:
##Switches
#SW#<FBR_Name>#<SW_Name1,SW_Name2...>#<User>#<Key_file>#<Password>
например:
SW#PROD1#switch-1,switch-2#admin#/root/.ssh/.id_key#                     -  коммуникаторы switch-1 и switch-2 доступны с текущего сервера для пользователя admin с SSH ключом хранящемся в /root/.ssh/.id_key

##Storage
#ST#<ST_Type>#<Storage_Name>#<Connection_string>#              - в Connection_string допустимы достаточно сложные выражения, но об этом позже.
например:
ST#NETAPP#netapp1a#rsh#                                                                   - Определяет доступ к Netapp-у netapp1a через протокол rsh для текущего пользователя
ST#CLAR#10.127.0.5#-password password -scope 0 -user admin#        - Определяет доступ к Clariion (EMC) для пользователя admin  с паролем password

##Servers
#SR#<SRV_Type>#<SR_Name1,SR_Name2...>#<User>#<Key_file>#<Password>
SR#HPBC#hpbc01,hpbc02p#Administrator#/root/.ssh/.id_key#            - Определяет доступ к HP Blade System для пользователя Administrator с SSH ключом хранящемся в /root/.ssh/.id_key

serv - содержит список всех серверов (или blade system как в моём случае)
##Servers
#<SRV_Type>#<FBR_Name>_<FBR_Type>#<System_Name>#<HBA_N{1|2}>
HPBC#PROD1_BRC#hpbc02p#1                                                        - Система типа HPBC (HP Blade Center) с именем hpbc02p подключена к фабрику PROD1 типа Brocade через HBA 1. Последнее поле важно для случаев когда сервер подключён к двум фабрикам для обеспечения устойчивости к падениям.

stor - содержит список стореджай
##<ST_Type>#<ST_Alias>#<ST_Name>   
##Netapp
#NETAPP#N1A#netapp1a
##VNX & Clariion
#VNX#VNX7500#10.10.0.5
#CLAR#CLAR960#clariion1
#VMAX
#VMAX#VMAX282#000292600111                                              -  Поскольку VMAX управляется через FC а не по сети, в качестве параметра используется SID
#Hitachi
#HIT#HIT_2#hitachi2

Папка OBJ - будет содержать библиотеку всех объектов (порты серверов и массивов) присутствуюсчих в каждом упровляемом фабрике.
Её структура:
./OBJ/<FBR>_<SW_TP>/stor/<ST_Name>
./OBJ/<FBR>_<SW_TP>/serv/<SR_GR_Name>
где:
<FBR>                  - имя фабрика (eng. case sensitive) , например PROD1
<SW_TP>             - тип фабрика BRC или CIS для Brocade и Cisco соответственно (другие типы коммуникаторов пока не поддерживаются)
<ST_Name>          - имя дискового массива в удобном для построения имени зоны формате (eng. case sensitive) , например VMAX111
<SR_GR_Name>  - имя группы серверов (eng. case sensitive) , например HPBS - HP Blade System

в результате получаем что-то вроде:
./OBJ/PROD1_CIS/stor/VMAX111
./OBJ/TEST2_BRC/serv/HPBC

Файлы <SR_GR_Name> и <ST_Name> имеют следующий формат:
<SR_GR_Name>
<Server_name>_#_<WWN>
например serv1_#_50:01:43:80:04:BC:1A:1C или serv2.dom.com_#_50:01:43:80:08:BC:1B:1D

<ST_Name>
<PORT>  <PWWN> - например (для VMAX) 8G:0 50:00:09:74:08:A3:17:8C или 
                                                       (для Netapp) 0A 50:0A:09:82:6F:3D:7B:F7

Имя сервера и порта вы сможете использовать позже как параметры скриптов управления фабриком.
Для создания этих файлов есть два пути вручную - используя информацию об имеющихся у вас системах :) , или с помощью набора утилит. Об обоих этих методах  мы поговорим позже.

Wednesday, May 16, 2012

Несколько слов для начала

Последние несколько лет я по долгу службы много соприкасаюсь с дисковыми массивами и серверами соединёнными по технологии SAN. Основная масса систем с которыми мне приходится сталкиваться это разнообразные сотреджи от EMC от больших VMAX и новых VNX, до мелких AX; а так-же такие системы как Netapp и Hitachi. Из серверов я работаю почти исключительно с HP blade разных модификаций. Связывают это хозяйство воедино коммуникаторы от Cisco или Brocade. Я специально подробно остановился на том железе с которым мне приходится работать, поскольку большинство используемых мной методов, а так-же вопросы которые я хочу обсудить в этом блоге будут ориентированны на эти продукты. Однако если кому-то понадобится помощь в работе с другими системами, буду рад помочь чем смогу.


Несколько слов для чего предназначен данный набор скриптов: это попытка построить API для быстрой и безошибочной работы с одним или несколькими фабриками. Он включат:
1) Скрипт для построения за один проход любого количества зоне по схеме сервер-порт - сторедж-порт, на входе список серверов и список портов, на выходе - зоны с именем сервер_сторедж_порт, зоны автоматически создаются на правильных коммуникаторах.
2) Поиск зон по имени сервера, стореджа или порта - скрипт работает со писком параметров и в любой их комбинации, возможна замена любого параметра на ALL.
3) Удаление зон по тому-же принципу

Немного предыстории. Около четырёх лет назад моя фирма решила активно внедрять технологию SAN в наших системах. До этого у нас был богатый опыт работы с NAS в основном от Netapp, а так-же несколько разрозненных и небольших SAN массивов разных производителей. Помочь нам с переходом на SAN :) взялось EMC. В их семействе Symmetrix только что появился VMAX, с него всё и началось.
И так, для управления и мониторинга систем было куплено ECC от EMC которое в начале довольно неплохо справлялось с управлением фабриком, но когда количество коммуникаторов в каждом фабрике превысило 20, пользоваться им стало практически не возможно - время ожидания при любом изменении в конфигурации зон стало недопустимо велико (более часа), а вероятность успешного завершения слишком мала. Хочу заметить, что в новой системе - ProSphere данная функциональность полностью удалена.
В результате встал вопрос - как управлять фабриками (Cisco и Brocade) где количество коммуникаторовпревысило 40 в каждом а количество объектов приблизилось к 1000. Конечно можно было воспользоваться программами производителя коммуникаторов: Cisco Fabric Manager и Brocade DCFM, но во-первых - пользоваться двумя продуктами не слишком удобно (Brocade и Cisco у нас работают в параллель для повышения устойчивости системы к багам производителя), а во-вторых - после ECC в конфигурациях не осталось ни одного "алиеса" и единственным методом определения объекта стал WWN, что мягко говоря не слишком удобно.

Как результат описанного выше я решил начать разработку своих средств управления SAN системами. Скрипты которые я буду здесь выкладывать, являются переработанной и адаптированной под не специфическую сеть версией. Они написаны на BASH и должны без проблем выполнятся на любой UNIX системе. Если для работы скрипта будет необходим дополнительный пакет (например expect), я постараюсь дать разъяснения по его установке дополнительно.
Данная версия для коммуникации с объектами использует SSH, возможно, если по мнению пользователей, более подходящим протоколом будет telnet или SNMP - я займусь доработкой и под эти протоколы. Однако, для систем управления наиболее мощным, безопасным и универсальным является именно SSH.

И так, первый скрипт предназначен для поиска зон (Soft Zone) в одном или нескольких фабриках. В качестве входных параметров указывается список хостов, имя стореджа и список его портов, любой из параметров может быть заменён словом ALL для получения полного списка зон относящихся к данному серверу, массиву или порту соответственно. На выходе - список зон объединяющих объекты запроса, с разделением по сетям (фабрикам).
При применении ключа -v указываются WWN(ы) входящие в каждую зону. Скрипт использует для поиска WWN объектов хранимых в конфигурационных файлах и текущую конфигурацию зон извлекаемых непосредственно из коммуникаторов (один для каждого фабрика).