Fujitsu K5 Infrastructure as Code(Cookie Cutter)
2017-03-10
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
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).
