Содержание


Добавление программного кода пользователя в шаблоны виртуальных приложений для платформы IBM PureApplication System

Comments

Продукт IBM® PureApplication® System поставляется с набором шаблонов типа Virtual Application Pattern (шаблон виртуального приложения, VAP-шаблон), а также позволяет создавать новые VAP-шаблоны и добавлять их в библиотеку существующих шаблонов. У пользователя шаблона может возникнуть потребность в его адаптации в соответствии с конкретными вариантами его использования. В ряде случаев такую адаптацию необходимо производить без изменения базовой реализации шаблона — по причине того, что данный пользователь не имеет доступа к коду шаблона, либо потому, что его лицензия на данный шаблон не позволяет вносить изменений в определение этого шаблона, либо поскольку другие пользователи этого шаблона возражают против этой адаптации.

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

В данной статье показано, как расширить существующий VAP-шаблон без модификации кода плагина шаблона или изменения определения шаблона. Статья демонстрирует, как создать плагин для добавления пользовательского кода, как выполнить свой пользовательский код на экземплярах VAP-шаблона и как отфильтровать экземпляры VAP-шаблона, в которые будет добавлен этот код. Статья содержит учебный плагин для добавления в экземпляры VAP-шаблона пользовательского кода, содержащего роль WebSphere® Application Server.

Сценарий

В этой статье для демонстрации методики добавления кода на основе плагина в качестве целевого шаблона используется VAP-шаблон Web Application Pattern Type. В нашем сценарии предполагается, что шаблон Web Application Pattern хочет установить несколько дополнительных двоичных файлов на той же виртуальной машине, где установлен продукт WebSphere Application Server, а затем выполнить определенное дополнительное конфигурирование на сервере приложений после его запуска. Предположим, что вышеупомянутым двоичным файлам требуется дополнительный диск объемом 50 ГБ, подключенный к виртуальной машине WebSphere Application Server и смонтированный в папке /dataStorageForAgent. В учебном коде показано, как создать реализацию TopologyProcessor для перезаписывания неразрешенной (unresolved) модели топологии (раздел vm-templates). Реализация TopologyProcessor отфильтрует все развертывания VAP-шаблона, кроме развертываний с ролью WebSphere Application Server. К развертываниям с ролью WebSphere Application Server эта реализация добавит пакеты скриптов учебного плагина и роль учебного плагина.

Добавление роли Sinstall учебного плагина в ту же секцию vm-template, что и роль WebSphere Application Server, "инжектирует" жизненный цикл плагина в ту же виртуальную машину, которая имеет роль WebSphere Application Server. В результате вызывается часть учебного плагина с именем install.py, а на этапе установки этой части плагина двоичные файлы плагина загружаются из репозитария Storehouse. Скрипт учебного плагина configure.py вызывается на этапе конфигурирования. Учебный код configure.py дожидается запуска сервера приложений, а затем исполняет учебный скрипт оболочки, упакованный вместе с двоичными файлами плагина. Пример код также демонстрирует, как использовать TopologyProcessor для добавления еще одного диска и как смонтировать этот диск с указанной папкой.

Создание плагина VAP-шаблона для добавления пользовательского кода в существующие шаблоны

В следующих разделах демонстрируется создание плагина VAP-шаблона для добавления собственного кода пользователя в исполняющиеся экземпляры VAP-шаблона на основе определенных критериев. Данная методика использует среду (framework) преобразования VAP-шаблонов и реализацию интерфейса com.ibm.maestro.model.transform.TopologyProcessor, что позволяет обрабатывать и преобразовывать топологии VAP-шаблонов до их развертывания. Для создания плагина VAP-шаблона выполните следующие шаги.

  1. Создайте плагин VAP-шаблона и соответствующий типовой шаблон для оформления реализации своего пользовательского кода.
  2. В конфигурационном файле плагина config.json задайте групповой символ "*" для вторичного типового шаблона — это сделает возможным добавление этого плагина к любому развертыванию VAP-шаблона. Этот плагин будет содержать регулярные части VAP-шаблона и скрипты жизненного цикла ролей (install.py, configure.py, start.py и stop.py).
  3. Создайте реализацию TopologyProcessor, которая определит критерии фильтрации с целью выявления экземпляров VAP-шаблона, подлежащих адаптации.
  4. В экземплярах, отобранных для адаптации, обновите JSON-модель неразрешенной топологии, а также включите пакеты скриптов и роль плагина.
  5. Измените JSON-модель неразрешенной топологии и выполните другие адаптации, необходимые вашему коду. Например, вы можете изменить топологию JSON-модели и добавить том хранения, а затем смонтировать его в локальную папку.

TopologyProcessor

Методика добавления кода, рассматриваемая в этой статье, возможна благодаря использованию интерфейса com.ibm.maestro.model.transform.TopologyProcessor, который описан в данном разделе. В последующих разделах описываются скрипты жизненного цикла плагина и скрипты исполнения плагина, упакованные с двоичными файлами типового шаблона. В процессе развертывания VAP-шаблона любой плагин, который участвует в VAP-шаблоне и реализует интерфейс com.ibm.maestro.model.transform.TopologyProcessor, может обработать и изменить определение топологии. Это позволяет плагину вставлять любые пользовательские конфигурации, роли или пакеты в топологию VAP-шаблона без внесения изменений в код в VAP-шаблона и без изменения определения шаблона с помощью инструмента Virtual Application Builder.

Во время развертывания среда развертывания PureApplication System вызывает public-метод JSONObject processTopology (топология JSONObject), предоставленный плагином в рамках реализации TopologyProcessor. Сигнатура метода объекта топологии представляет модель неразрешенной топологии для экземпляра, подлежащего развертыванию. TopologyProcessor-реализация плагина может вносить изменения в эту JSON-модель неразрешенной топологии, а затем возвращать обновленную модель обратно в среду развертывания. Соответственно среда использует возвращенную JSON-модель обновленной топологии для развертывания экземпляра.

Реализация TopologyProcessor для нашего учебного примера прилагается к данной статье. Как показано в листинге 1, код в методе processTopology(JSONObject topology) сначала ищет секцию vm-templates в объекте топологии, чтобы проверить наличие/отсутствие роли WebSphere Application Serve у развернутого экземпляра.

Листинг 1. Листинг 1. Проверка развертывания на наличие роли WebSphere Application Server
private final String[] agentInjectToRoles = new String[] {"WAS"};
JSONArray templates = (JSONArray)topology.get("vm-templates");
for (Object obj : templates) {	
   if( injectPlugin(template) ) {
      .... inject the sample plug-in role and package here ....
      .... also add new disk and mount to vm folder here ....
      }
}
/** 
 * Возвратить значение true, если вы хотите связать плагин с ролью этого типа 
 */
protected boolean injectPlugin(JSONObject template)
{
   JSONArray rolesArray = (JSONArray)template.get("roles");
   if (rolesArray == null) {
      return false;    
   }    
   for (Object roleObj : rolesArray) { 
      JSONObject role = (JSONObject) roleObj;
      if(role.get("type") != null) { 
         String roleType = role.get("type").toString(); 
         for(String agentInjectRole : agentInjectToRoles) {
            if( roleType.equals(agentInjectRole))
               return true;	
          }
      } 
   }  
   return false;  
}

Затем, если секция vm-template содержит роль WebSphere Application Server, код добавляет роль и пакет скриптов учебного плагина (см. листинг 2). Вызов скриптов жизненного цикла учебного плагина осуществляется на этапе активации экземпляра.

Листинг 2. Листинг 2. Добавление пакета скриптов и роли
addRoles(template, new JSONObject[] { sagentRole });
addPackages(template, new String[] { "SInstall" });

Кроме того, этот код вносит изменения в определение модели топологии, добавляя новый диск и монтируя его в точку монтирования /dataStorageForAgent(см. листинг 3).

Листинг 3. Листинг 3. Добавление нового диска
JSONArray vmStorage = null;
if(template.get("storage") == null) {
   vmStorage = new JSONArray();
   template.put("storage", vmStorage);
}
else {
   vmStorage = (JSONArray) template.get("storage");
} 
addVMStorage(vmStorage, "ext-sagentSt1", "/dev/sdb",
   "/dataStorageForAgent");

Учебный плагин VAP-шаблона

Помимо реализации TopologyProcessor учебный плагин определяет следующие скрипты жизненного цикла и конфигурационные файлы. Для получения дополнительной информации по скриптам жизненного цикла VAP-шаблона и по их использованию обратитесь в раздел Ресурсы в конце статьи.

Файл config.json

Этот конфигурационный файл определяет типовой шаблон, которому принадлежит этот плагин. В листинге 4 ниже показан конфигурационный файл учебного плагина. Этот плагин задает SimpleInstallAgent в качестве основного типового шаблона. Этот типовой шаблон используется для импорта плагина в систему PureApplication System и для обновления плагина по мере необходимости. Кроме того, конфигурация определяет вторичный шаблон как "*". Это означает, что данный плагин может использоваться любым типом шаблона, имеющимся в системе. Благодаря тому, что вторичный шаблон определен в виде "*", плагин присоединяется к любому развернутому экземпляр VAP-шаблона.

Листинг 4. Листинг 4. Конфигурационный файл учебного плагина
"name": "sagent",
"version": "1.0.0.0",
"patterntypes": {
   "primary": {
      "SimpleInstallAgent": "1.0"

   },
   "secondary":[
      {
      "*":"*"
      }
   ] 
}

Файл install.py

Скрипт установки частей загружает двоичные файлы плагина из репозитария Storehouse, разархивирует двоичные файлы, а затем перемещает их в папку /home/virtuser(см. листинг 5).

Листинг 5. Листинг 5. Скрипт установки частей
# Копировать ваш двоичный файл из репозитария в папку /tmp/downloads
downloadPath = '/tmp/downloads'
logger.debug('creating directory: ' + downloadPath);
maestro.trace_call(logger, ['mkdir', downloadPath])

storehousePath = 'SAgentBinaries/SampleContent.tar.gz'
logger.debug('start downloading AGENT install binaries from storehouse:
   %s to local folder: %s' % (storehousePath, downloadPath))
# Maestro разархивирует ваш двоичный файл в указанное вами место (downloadPath)
installerUrl = urlparse.urljoin(maestro.filesurl, storehousePath)	
maestro.downloadx(installerUrl, downloadPath)
logger.debug('AGENT binaries download completed complete')

# Переместить скрипт myproductInstall.sh в папку /home/idcuser/ProductFolder
logger.debug('move scripts from /tmp/downloads to /home/virtuser ')

args=['mv', '/tmp/downloads/ProductFolder', '/home/virtuser']
logger.debug(args)
rc = maestro.trace_call(logger, args)
maestro.check_status(rc, 'Failed to move ProductFolder folder')

Файл configure.py

Этот скрипт ищет журнал startServer.log продукта WebSphere Application Server в папке /opt/IBM и дожидается его доступности. Найдя этот файл, скрипт каждые 60 секунд проверяет его на наличие сообщения Open for e-business. После обнаружения этого сообщения осуществляется вызов конфигурационного скрипта плагина /home/virtuser/ProductFolder/productConfigure.sh с использованием мандата администратора WebSphere Application Server. Скрипт productConfigure.sh просто создает перечень доступных API-интерфейсов виртуальных Java-машин (Java Virtual Machine, JVM) на сервере WebSphere Application Server. Код файла confgure.py показан в листинге 6.

Листинг 6. Листинг 6. Скрипт конфигурирования роли
template = maestro.node['template']
user_id=''
user_pwd=''
if 'roles' in template:
   roles = template['roles']
   for role in roles:
      if 'name' in role and role['name'] == 'DMGR' and 'parms' in role:
         logger.debug('DMGR parms are %s' % role['parms'])
         for key in role['parms']:
            roleParms = role['parms'][key]
            if key == 'dmgr_user':
               user_id = roleParms
            elif key == 'dmgr_pwd':
               user_pwd = str(maestro.decode(roleParms))
            elif 'name' in role and role['name'] == 'WAS' and 'parms' in role:
               logger.debug('WAS parms are %s' % role['parms'])
               for key in role['parms']:
                  roleParms = role['parms'][key]
                  if key == 'USERID':
                     user_id = roleParms
                  elif key == 'PASSWORD':
                     user_pwd = str(maestro.decode(roleParms))
                     
logPath=''
matches = []
while len(matches) == 0:
   for root, dirnames, filenames in os.walk('/opt/IBM'):
      for filename in fnmatch.filter(filenames, 'startServer.log'):
         matches.append(os.path.join(root, filename))
   time.sleep(60)
   
if len(matches) > 0:
   logPath = '%s' % matches[0]
   
wasInstalled = False
while wasInstalled == False:
   logger.debug('wait for the WAS server to start')
   
   if os.path.isfile(logPath):
      logger.debug('startServer.log file found, check status')
      with open(logPath, 'r') as content_file:
          content = content_file.read()
          if content.rfind('open for e-business') != -1:
             wasInstalled = True
          else:
             logger.debug('WAS start log content does not contain open
                 for e-business message, wait')          
   else:
      logger.debug('%s file not found, wait' % logPath)
      
   if wasInstalled == False:
      time.sleep(60)
      
logger.debug("WAS server is running, configure the agent now")

configscript = '/home/virtuser/ProductFolder/productConfigure.sh'

# run productConfigure.sh script
args=[configscript, user_id, user_pwd]
logger.debug('user_id is %s ' % user_id)
rc = maestro.trace_call(logger, args)
maestro.check_status(rc, 'Failed to run install scripts')

Учебный типовой VAP-шаблон

Типовой шаблон exportSimpleInstallAgent-1.0.0.0.tgz упаковывает учебные двоичные файлы в файл files/SampleContent.tar.gz. Если вы загрузите предлагаемый вместе со статьей учебный файл, а затем откроете его с помощью какого-либо инструмента разархивации, то увидите, что архивный tar-файл содержит следующие файлы.

  • productInstall.sh— Учебный скрипт оболочки, демонстрирующий использование скрипта для установки двоичного файла продукта из скрипта жизненного цикла частей install.py. Этот скрипт будет выполняться перед конфигурированием учебной роли SInstall.
  • productConfigure.sh— Учебный скрипт оболочки, демонстрирующий конфигурирование сервера приложений с использованием мандата администратора сервера приложений. Вызов этого скрипта оболочки осуществляет скрипт configure.py жизненного цикла роли SInstall. Этот скрипт принимает два параметра (идентификатор и пароль пользователя-администратора WebSphere Application Server). Скрипт вызывает listJvm.py для получения списка JVM-машин. Скрипт productConfigure.sh показан в листинге 7.
Листинг 7. Листинг 7. Конфигурирование учебного сервера приложений
#!/bin/sh
USER_ID=$1
USER_PWD=$2
echo "Configure the product "
WAS_BIN=`find /opt/IBM -name wsadmin.sh`
echo "WAS_BIN=$WAS_BIN"
echo "Configure agent"
DIR_NAME=$(dirname $0)
echo $DIR_NAME
pushd $DIR_NAME
echo "List JVM "
$WAS_BIN/wsadmin.sh -user $USER_ID -password $USER_PWD -f /home/virtuser/ProductFolder/listJvm.py
echo "End List JVM "
popd

Когда вы импортируете типовой шаблон в систему PureApplication System, архивный tar-файл с двоичными файлами загружается в репозитарий Storehouse. Репозитарий Storehouse for PureApplication System содержит системные артефакты и артефакты рабочей нагрузки VAP-шаблона.

Для просмотра артефактов, хранящихся в репозитарии Storehouse, выберите Workload console => System => Storehouse Browser. Обратите внимание, что окно Storehouse Browser могут просматривать только пользователи, имеющие право на просмотр меню System.

Репозитарий Storehouse можно использовать для хранения двоичных файлов продукта. К этому репозитарию могут обращаться экземпляры VAP-шаблона во время активации экземпляра. В следующих абзацах будет показано, как использовать репозитарий Storehouse для хранения двоичных файлов учебного плагина.

Загрузка двоичных файлов плагина в репозитарий Storehouse

Двоичные файлы продукта можно загрузить в репозитарий Storehouse посредством упаковки двоичного файла с типовым шаблоном, содержащим плагины VAP-шаблона. Мы применим этот подход для загрузки учебного двоичного файла SampleContent.tar.gz в следующее местоположение в репозитарии Storehouse: /admin/files/SAgentBinaries/.

Чтобы упаковать двоичный файл SampleContent.tar.gz с типовым шаблоном, сначала задайте структуру папок в рамках этого типового шаблона (рис. 1). Обратите внимание, что двоичный архив помещен в папку \patterntype.sagent\storehouse\files\SagentBinaries согласно требованиям по исполнению файла Ant-скрипта addStorehouseFiles.xml, которые объясняются ниже.

Рисунок 1. Рисунок 1. Структура типового шаблона
Pattern type structure

После размещения файла двоичного архива выполните следующие шаги для создания архива типового шаблона \patterntype.sagent\exportSimpleInstallAgent-1.0.0.0.tgz.

  1. Сформируйте код типового шаблона и плагина. Чтобы сформировать типовой шаблон и плагин без двоичных файлов, нажмите правой кнопкой на patterntype.sagent и выберите IBM Pattern Toolkit => Build )
  2. Запустите на исполнение файл \patterntype.sagent\addStorehouseFiles.xml. Для этого нажмите правой кнопкой на \patterntype.sagent\addStorehouseFiles.xml и выберите Run As => Ant Build, чтобы добавить двоичные файлы к архиву типового шаблона. В результате исполнения этого Ant-скрипта будет создан типовой шаблон с соответствующей структурой папок для загрузки двоичного файла в местоположение /admin/files/SAgentBinaries/ репозитария Storehouse. Если после этого шага открыть созданный типовой шаблон с помощью какого-либо инструмента для разархивирования, его содержимое будет выглядеть как на рис. 2. Этот архивный файл содержит папку файлов, в которой находится двоичный файл SampleContent.tar.gz.
    Рисунок 2. Рисунок 2. Архив типового шаблона, содержащий двоичные файлы Storehouse
  3. После создания типового шаблона его можно импортировать в PureApplication System. Перейдите в окно Workload Console, а затем выберите ссылку Cloud => Pattern Types. Воспользуйтесь действием plus для импорта tar-файла типа шаблона: /patterntype.sagent\export\SimpleInstallAgent-1.0.0.0.tgz. Если импорт оказался успешным, вы должны увидеть SampleContent.tar.gz в окне Storehouse Browser (см. рис. 3).
    Рисунок 3. Рисунок 3. Содержимое репозитария Storehouse после импорта типового шаблона

Работа с учебным плагином

К статье прилагается учебный типовой шаблон (с исходным кодом) patterntype.sagent-1.0.0.0.tgz

После импорта файла patterntype.sagent-1.0.0.0.tgz в свою систему IBM PureApplication System вы должны увидеть файл /admin/files/SAgentBinaries/SampleContent.tar.gz, добавленный в окно Storehouse Browser (см. рис. 3). Кроме того, вы должны увидеть типовой шаблон с именем sample.sagent-1.0. Для этого выберите: Workload Console => Cloud => Pattern Types.

После того как вы импортировали и активировали типовой шаблон sample.sagent-1.0, разверните экземпляр типового шаблона Web Application Pattern Type. После развертывания экземпляра Web Application Pattern Type убедитесь в том, что роль учебного плагина SInstall присоединена к виртуальной машине, на которой исполняется WebSphere Application Server. Для этого выполните следующие шаги.

  1. В перспективе Virtual machines развернутого экземпляра нажмите на ссылку Show more под столбцом Middleware Status виртуальной машины Web Application. Вы должны увидеть роль SInstall (см. рис. 4), которая определена учебным плагином.
    Рисунок 4. Рисунок 4. Учебная роль присоединена к экземпляру WebSphere Application Server
  2. На той же виртуальной машине нажмите на ссылку Log. Убедитесь в наличии журнала trace.log для роли SInstall. Откройте этот журнал (см. рис. 5) и убедитесь в том, что код учебного плагина был вызван ожидаемым образом.
    Рисунок 5. Рисунок 5. Журнал трассировки учебного плагина
  3. В экземпляре WebSphere Application Server добавьте ssh-ключ с использованием ссылки Manage => Operations => ssh, а затем войдите в систему по ssh с именем пользователя virtuser. Убедитесь в том, что вы можете видеть дополнительный диск объемом 50 ГБ, присоединенный к папке /dataStorageForAgent, для чего выполните команду df -h (рис. 6).
    Рисунок 6. Рисунок 6. Папка для монтирования учебного плагина

Заключение

В этой статье вы изучили методику адаптации существующего VAP-шаблона и добавления своего пользовательского кода без внесения изменений в существующий код плагина шаблона или в определение шаблона. Эта методика предусматривает создание нового плагина, который реализует интерфейс TopologyProcessor, и задание надлежащей вторичной конфигурации шаблона, которая делает этот плагин доступным для всех развертываний данного VAP-шаблона. Вы увидели, как с помощью расширения TopologyProcessor можно обновить определение топологии для любого экземпляра VAP-шаблона в процессе развертывания и как добавить новые роли и новые диски для плагина.


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Облачные вычисления, WebSphere
ArticleID=976307
ArticleTitle=Добавление программного кода пользователя в шаблоны виртуальных приложений для платформы IBM PureApplication System
publish-date=07012014