Fujitsu K5 Infrastructure as Code(Cookie Cutter)

2017-03-10

Fujitsu K5 Infrastructure as Code(Cookie Cutter)

Machine-translated — the English original is authoritative.

最新の課題は、3ノードのシンプルなネットワークという定義済みのインフラストラクチャモデルを、一貫性があり再現可能な方法でデプロイするプロセスを開発することでした。しかし、このモデルは、異なるディスク構成を持つすべてのフレーバータイプでデプロイする必要がありました。

要するに、顧客はスケーラブルな環境で異なるノードフレーバーのパフォーマンステストを行うための再現可能なメカニズムを望んでいました。

以前のHEATの例を基に、必要なインフラストラクチャを含む巨大なYAMLテンプレートを作成することもできました。しかし、これはエラーが発生しやすく、デバッグが困難で、効率的でも柔軟性もありません。

私たちが求めているのは、静的なインフラストラクチャコンポーネントと動的なインフラストラクチャコンポーネントを分離することです。静的なコンポーネントに一致し、動的なコンポーネントをパラメータとして渡すことができるテンプレートを定義します。コーディングに精通している方なら、DRY(Don't Repeat Yourself:繰り返すな)コード原則をご存知でしょう。これも同じ原則が適用されます。

既存のインフラストラクチャを持つプロジェクトにデプロイしていたため、これらの詳細の一部をheatスタックの入力パラメータとして渡しました。例えば、routerId、kpNameなどです。

基本的なインフラストラクチャテンプレートは以下の通りです:

このファイルには、以下に表示されているものとは異なって解釈またはコンパイルされる可能性がある、隠されたバイディレクショナルUnicode文字が含まれています。確認するには、隠されたUnicode文字を表示するエディタでファイルを開いてください。
バイディレクショナルUnicode文字について詳しく見る

隠れた文字を表示

heat_template_version: 2013-05-23
# 著者: Graham Land
# 日付: 2017年3月8日
# 目的: 新しいネットワーク上に3台のサーバーをデプロイし、ネットワークを指定されたルータに接続するFujitsu K5 OpenStack IaaS Heatテンプレート。
# 入力パラメータ –
# routerId – ネットワークを接続するルータの一意のID
# imageName – デプロイされるイメージOS
# flavorName – サーバーのvCPUおよびRAMサイズ
# dataVolume – サーバーに接続されるデータボリュームのサイズ
# cidr – プライベートネットワークのIPアドレス詳細
# azName – サーバーをデプロイするアベイラビリティゾーン – 当然、これはルータの場所と同じである必要があります
# kpName – アベイラビリティゾーンで使用する既存のSSHキーペアの名前
#
#
# 出力パラメータ – 3台のサーバーのIPアドレス
#
# Twitter: @allthingsclowd
# ブログ: https://allthingscloud.eu
#
description: 新しいネットワーク上に3台のサーバーをデプロイし、ネットワークを指定されたルータに接続するFujitsu K5 OpenStack IaaS Heatテンプレート。
# 入力パラメータ
parameters:
imageName:
type: string
label: イメージ名またはID
description: 計算インスタンスに使用されるイメージ
default: "Ubuntu Server 14.04 LTS (English) 02"
flavorName:
type: string
label: フレーバー
description: X vCPU および XXXXMB RAM
default: "T-1"
kpName:
type: string
label: キー名
description: 計算インスタンスに使用されるキーペアの名前
default: "k5-loadtest-az1"
cidr:
type: string
label: IPアドレス詳細
description: ネットワークアドレス範囲
default: "10.99.99.0/24"
dataVolume:
type: string
label: ボリュームサイズ
description: サーバーに接続するデータボリュームのサイズ(GB)
default: "3"
osVolume:
type: string
label: ボリュームサイズ
description: サーバーに接続するOSボリュームのサイズ(GB)
default: "20"
azName:
type: string
label: アベイラビリティゾーン
description: 使用するリージョンAZ
default: "uk-1a"
securityGroup:
type: string
label: 既存のK5セキュリティグループ名
description: プロジェクトセキュリティグループ
default: "demosecuritygroup"
routerId:
type: string
label: 外部ルータ
description: グローバルIP割り当てのための外部アクセスを持つルータ
default: "fcb1dddc-e0c8-4dd5-8a3f-4eee3b042912"
# 構築されるK5インフラストラクチャリソース
resources:
############################ ネットワークリソース ####################
# アベイラビリティゾーンにプライベートネットワークを作成
demostack_private_net :
type: OS::Neutron::Net
properties:
name: "private"
availability_zone: { get_param: azName}
# プライベートネットワーク上に新しいサブネットを作成
demostack_private_subnet :
type: OS::Neutron::Subnet
depends_on: demostack_private_net
properties:
availability_zone: { get_param: azName}
network_id: { get_resource: demostack_private_net }
cidr: { get_param: cidr}
dns_nameservers: ["62.60.39.9", "62.60.39.10"]
# demostacksネットワークのサブネットにインターフェースを接続してルータに接続
router_interface:
type: OS::Neutron::RouterInterface
depends_on: [demostack_private_subnet ]
properties:
router_id: { get_param: routerId }
subnet_id: { get_resource: demostack_private_subnet }
################## サーバーリソース ###########################
################################ demo-mgmt1-serverの作成 ##############################
# サーバー用にデータボリュームを作成
demo-mgmt1-server-data-vol:
type: OS::Cinder::Volume
properties:
availability_zone: { get_param: azName}
description: データストレージ
size: { get_param: dataVolume}
volume_type: "M1"
# サーバー用にシステムボリュームを作成
demo-mgmt1-server-sys-vol:
type: OS::Cinder::Volume
properties:
availability_zone: { get_param: azName}
size: { get_param: osVolume}
volume_type: "M1"
image : { get_param: imageName }
# 上記で定義されたシステムボリュームを使用してサーバーを構築
demo-mgmt1-server:
type: OS::Nova::Server
depends_on: [ demostack_private_subnet ]
properties:
key_name: { get_param: kpName }
image: { get_param: imageName }
flavor: { get_param: flavorName }
security_groups: [{get_param: securityGroup}]
block_device_mapping: [{"volume_size": { get_param: osVolume}, "volume_id": {get_resource: demo-mgmt1-server-sys-vol}, "delete_on_termination": True, "device_name": "/dev/vda"}]
admin_user: "ubuntu"
metadata: { "fcx.autofailover": True, "Example Custom Tag": "Multiple Server Build" }
user_data:
str_replace:
template:
#cloud-config
write_files:
– content:
#!/bin/bash
voldata_id=%voldata_id%
voldata_dev="/dev/disk/by-id/virtio-$(echo ${voldata_id}
mkfs.ext4 ${voldata_dev}
mkdir -pv /mnt/appdata
echo "${voldata_dev} /mnt/appdata ext4 defaults 1 2" >> /etc/fstab
mount /mnt/appdata
chmod 0777 /mnt/appdata
path: /tmp/format-disks
permissions: '0700'
runcmd:
– /tmp/format-disks
params:
"%voldata_id%": { get_resource: demo-mgmt1-server-data-vol }
user_data_format: RAW
networks: ["uuid": {get_resource: demostack_private_net} ]
# 以前定義されたデータボリュームをサーバーに接続
attach-demo-mgmt1-server-data-vol:
type: OS::Cinder::VolumeAttachment
depends_on: [ demo-mgmt1-server-data-vol, demo-mgmt1-server ]
properties:
instance_uuid: {get_resource: demo-mgmt1-server}
mountpoint: "/dev/vdb"
volume_id: {get_resource: demo-mgmt1-server-data-vol}
################################ demo-mgmt2-serverの作成 ##############################
# サーバー用にデータボリュームを作成
demo-mgmt2-server-data-vol:
type: OS::Cinder::Volume
properties:
availability_zone: { get_param: azName}
description: データストレージ
size: { get_param: dataVolume}
volume_type: "M1"
# サーバー用にシステムボリュームを作成
demo-mgmt2-server-sys-vol:
type: OS::Cinder::Volume
properties:
availability_zone: { get_param: azName}
size: { get_param: osVolume}
volume_type: "M1"
image : { get_param: imageName }
# 上記で定義されたシステムボリュームを使用してサーバーを構築
demo-mgmt2-server:
type: OS::Nova::Server
depends_on: [ demostack_private_subnet ]
properties:
key_name: { get_param: kpName }
image: { get_param: imageName }
flavor: { get_param: flavorName }
block_device_mapping: [{"volume_size": { get_param: osVolume}, "volume_id": {get_resource: demo-mgmt2-server-sys-vol}, "delete_on_termination": True, "device_name": "/dev/vda"}]
admin_user: "ubuntu"
security_groups: [{get_param: securityGroup}]
metadata: { "fcx.autofailover": True, "Example Custom Tag": "Multiple Server Build" }
user_data:
str_replace:
template:
#cloud-config
write_files:
– content:
#!/bin/bash
voldata_id=%voldata_id%
voldata_dev="/dev/disk/by-id/virtio-$(echo ${voldata_id}
mkfs.ext4 ${voldata_dev}
mkdir -pv /mnt/appdata
echo "${voldata_dev} /mnt/appdata ext4 defaults 1 2" >> /etc/fstab
mount /mnt/appdata
chmod 0777 /mnt/appdata
path: /tmp/format-disks
permissions: '0700'
runcmd:
– /tmp/format-disks
params:
"%voldata_id%": { get_resource: demo-mgmt2-server-data-vol }
user_data_format: RAW
networks: ["uuid": {get_resource: demostack_private_net} ]
# 以前定義されたデータボリュームをサーバーに接続
attach-demo-mgmt2-server-data-vol:
type: OS::Cinder::VolumeAttachment
depends_on: [ demo-mgmt2-server-data-vol, demo-mgmt2-server ]
properties:
instance_uuid: {get_resource: demo-mgmt2-server}
mountpoint: "/dev/vdb"
volume_id: {get_resource: demo-mgmt2-server-data-vol}
################################ demo-mgmt3-serverの作成 ##############################
# サーバー用にデータボリュームを作成
demo-mgmt3-server-data-vol:
type: OS::Cinder::Volume
properties:
availability_zone: { get_param: azName}
description: データストレージ
size: { get_param: dataVolume}
volume_type: "M1"
# サーバー用にシステムボリュームを作成
demo-mgmt3-server-sys-vol:
type: OS::Cinder::Volume
properties:
availability_zone: { get_param: azName}
size: { get_param: osVolume}
volume_type: "M1"
image : { get_param: imageName }
# 上記で定義されたシステムボリュームを使用してサーバーを構築
demo-mgmt3-server:
type: OS::Nova::Server
depends_on: [ demostack_private_subnet ]
properties:
key_name: { get_param: kpName }
image: { get_param: imageName }
flavor: { get_param: flavorName }
block_device_mapping: [{"volume_size": { get_param: osVolume}, "volume_id": {get_resource: demo-mgmt3-server-sys-vol}, "delete_on_termination": True, "device_name": "/dev/vda"}]
admin_user: "ubuntu"
security_groups: [{get_param: securityGroup}]
metadata: { "fcx.autofailover": True, "Example Custom Tag": "Multiple Server Build" }
user_data:
str_replace:
template:
#cloud-config
write_files:
– content:
#!/bin/bash
voldata_id=%voldata_id%
voldata_dev="/dev/disk/by-id/virtio-$(echo ${voldata_id}
mkfs.ext4 ${voldata_dev}
mkdir -pv /mnt/appdata
echo "${voldata_dev} /mnt/appdata ext4 defaults 1 2" >> /etc/fstab
mount /mnt/appdata
chmod 0777 /mnt/appdata
path: /tmp/format-disks
permissions: '0700'
runcmd:
– /tmp/format-disks
params:
"%voldata_id%": { get_resource: demo-mgmt3-server-data-vol }
user_data_format: RAW
networks: ["uuid": {get_resource: demostack_private_net} ]
# 以前定義されたデータボリュームをサーバーに接続
attach-demo-mgmt3-server-data-vol:
type: OS::Cinder::VolumeAttachment
depends_on: [ demo-mgmt3-server-data-vol, demo-mgmt3-server ]
properties:
instance_uuid: {get_resource: demo-mgmt3-server}
mountpoint: "/dev/vdb"
volume_id: {get_resource: demo-mgmt3-server-data-vol}
outputs:
server1_ip:
description: サーバー1に割り当てられた固定IP
value: { get_attr: [demo-mgmt1-server, networks, "private", 0]}
server2_ip:
description: サーバー2に割り当てられた固定IP
value: { get_attr: [demo-mgmt2-server, networks, "private", 0]}
server3_ip:
description: サーバー3に割り当てられた固定IP
value: { get_attr: [demo-mgmt3-server, networks, "private", 0]}

raw表示
simple_3_node_template.yml
❤️ GitHub によってホストされています

これでInfrastructure as Codeが完成しましたが、入力パラメータを変更しながらスケーラブルにデプロイするにはどうすればよいでしょうか?ここで「APIエコノミー」が前面に出てきます。Fujitsu K5はAPIファーストのプラットフォームであるOpenStackを基盤としています – マーケティング用語ではなく、これはプラットフォームが100% APIのみのインタラクションで駆動できることを意味します…まだ混乱していますか?もっとコードを使いますよ!

Pythonスクリプトを使用して、上記のheatテンプレートと異なるパラメータセットの両方をK5のオーケストレーションエンジンに送信し、データをオーケストレーションエンドポイントに送信できます。

このファイルには、以下に表示されているものとは異なって解釈またはコンパイルされる可能性がある、隠されたバイディレクショナルUnicode文字が含まれています。確認するには、隠されたUnicode文字を表示するエディタでファイルを開いてください。
バイディレクショナルUnicode文字について詳しく見る

隠れた文字を表示

def deploy_heat_stack(k5token, stack_name, stack_to_deploy, stack_parameters):
"""要約: K5プロジェクトにheatスタック(文字列としてラップ)を送信するためのK5 HEAT API呼び出し
戻り値:
タイプ: 新しいStack IDまたはエラーコードを含むJSONオブジェクト
"""
orchestrationURL = unicode(get_endpoint(k5token, "orchestration")) + unicode("/stacks")
print orchestrationURL
token = k5token.headers['X-Subject-Token']
try:
response = requests.post(orchestrationURL,
headers={
'X-Auth-Token': token, 'Content-Type': 'application/json', 'Accept': 'application/json'},
json={
"files": {},
"disable_rollback": True,
"parameters": stack_parameters,
"stack_name": stack_name,
"template": stack_to_deploy,
"timeout_mins": 60
})
return response
except:
return ("\n予期しないエラー:", sys.exc_info())

raw表示
Deploy_Heat_Stack.py
❤️ GitHub によってホストされています

ここで得られる利点は、プロセス全体がコードで定義されており、バージョン管理が容易であるため、一貫したデプロイメントを保証するのに役立つことです。

このソリューションの完全なバージョンはここでチェックアウトできます: https://github.com/allthingsclowd/Fujitsu_OpenStack_K5_Heat_Cookie_Cutter

openstack heat cookie cutterv2

K5_Stack_Deployer – OpenStackテンプレート

著者: Graham Land

日付: 2017年3月8日

Twitter: @allthingsclowd

Github: https://github.com/allthingscloud

ブログ: https://allthingscloud.eu

deploy_stacks.py

このスクリプトは、OpenStack HEATテンプレートを
毎回異なるパラメータで複数回デプロイする方法を示しています

k5regionapiv1.py

このファイルはdeploy_stacks.pyによってインポートされ、K5/OpenStack API関数ラッパーを含んでいます

simple_3_node_stack.py

このファイルには、Pythonで使用するために文字列としてラップされたYAML HEATスタックが含まれています

simple_3_node_stack.yml

デプロイされるネイティブHEATテンプレートです(個別に試したい場合のみ使用)

k5contractsettingsV12.py

デプロイする前に、このファイルを環境に合わせて設定する必要があります。
環境セクションとアプリケーションセクションが含まれています。
環境セクションではK5の詳細を入力し、アプリケーションセクションではheatテンプレートに渡されるパラメータの「バッチ」が構成されます。
各バッチにはHeatテンプレート入力パラメータのリストが含まれており、各パラメータリストはデプロイされたheatテンプレートを表します。

Githubへのリンク
https://github.com/allthingsclowd/Fujitsu_OpenStack_K5_Heat_Cookie_Cutter

raw表示
K5_Cookie_Cutter.md
❤️ GitHub によってホストされています

Happy Stacking!(スタッキングを楽しんでください!)

withk5youcan

Originally published on allthingscloud.eu (2017-03-10).

← All posts