Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Operating CI / CD with two Stack

Operating CI / CD with two Stack

OpenStack Days Tokyo 2018で発表。

Wataru Manji

August 02, 2018
Tweet

More Decks by Wataru Manji

Other Decks in Technology

Transcript

  1. Copyright© 2018 NTT TechnoCross Corporation 2 自己紹介 氏名: 萬治 渉

    (Manji Wataru) 所属: • NTTテクノクロス株式会社 IoTイノベーション事業部 • 日本StackStormユーザ会 専門: • OpenStack • StackStorm • Ansible
  2. 4 Copyright© 2018 NTT TechnoCross Corporation 本編: 35分 質疑: 5分

    • 本編 1. 自動テストしようとしたコードの話 2. 自動テストのために解決すべき課題 3. 解決策となる2つの「Stack」 4. 動作イメージ 5. 今後の展望 • 質疑
  3. Copyright© 2018 NTT TechnoCross Corporation 6 ・何のためのコードなのか? → マネージドなオンプレクラウド基盤! ...の初期構築用コード

    ~詳しい説明は弊社ブースまで~ ・NTTグループ各社のクラウド基盤を設計、構築、 保守してきたノウハウを商品化 ・IaaSだけでなく、PaaSレイヤのサービスも提供 ・最短1営業日で環境払い出し可能
  4. Copyright© 2018 NTT TechnoCross Corporation 7 ・どうやって作ろうとしていたのか? → 神のごとき「精緻」なAnsible遺産を改造する ~経緯~

    構築資材、どう作ろうかな... AnsibleのPlaybook、前に社内クラウド 作るとき作ったじゃん。あれ使いなよ。 (あれって、ちゃんと動くのか...?)
  5. Copyright© 2018 NTT TechnoCross Corporation 8 ・何が問題になったのか → その1: 実行環境が無い

    理由: • そんなポンポンサーバを買えない • AWSとかGCPでは動かない • いわゆるport_securityにひっかかる • nested kvmできない※ ※: 現在ではGCPで有効にできる
  6. Copyright© 2018 NTT TechnoCross Corporation 9 ・何が問題になったのか → その2: 動かない

    • 単純に文法エラーで失敗する • 一度失敗したらなぜか二度と成功しない • 成功してるのにOpenStackが動かない 心を無にしてログを眺めるOpenStackエンジニアのいらすと
  7. Copyright© 2018 NTT TechnoCross Corporation 10 ・何が問題になったのか → その3: 「精緻」すぎて読むのが大変

    • yml合計: • 169ファイル • 6,718行 • 175,685文字 • j2合計: • 44ファイル • 22,875行 • 779,416文字 ※コメント含む 心を無にしてコードを眺めるAnsibleエンジニアのいらすと
  8. Copyright© 2018 NTT TechnoCross Corporation 11 • Enterprise Cloud 2.0のベアメタルサーバでは動いたので、

    そこで延々と動作確認 • Ansible資材を一から見直し。構造、依存性、べき等性を再設計。 • 構築されたOpenStackの正常性も一から確認。 • 社内クラウドで発生した問題への対処を組込み。 • etc... めげずに頑張った その結果
  9. Copyright© 2018 NTT TechnoCross Corporation 12 ・何が問題になったのか → その4: 自分しかPlaybookを読めなくなった

    • 元コードがもはや残っていない。 • 構造や命名規則がかなり変わった。 • AnsibleやJinja2の機能をガッツリ使うことによる半黒魔術化
  10. Copyright© 2018 NTT TechnoCross Corporation 14 当たった問題その2: 精緻すぎて読むのが大変 解決策その1: 実行箇所、修正箇所が分かりやすくなるよう、

    テスト用の実行スクリプトを作る 当たった問題その3: 動作確認の実行環境が無い 解決策その2: テスト環境を自動で用意してくれて、 テストも実行してくれる仕組みを作る → 常に動く状態を保てるようにする 当たった問題その1: 動かない
  11. Copyright© 2018 NTT TechnoCross Corporation 15 もしかして: CI CIツールを使えば、 •

    テスト環境の準備 • Ansible実行 • テストの実行 • Ansible&テスト結果の公開 を自動で実施できるのでは...?
  12. Copyright© 2018 NTT TechnoCross Corporation 19 こういう仕組みで実現できそう MergeRequest契機で Webhook 必要な資材をclone

    クラウド基盤を操作して テスト環境を作成 構築用Ansible実行 & テスト実行 CIツール GitLab
  13. Copyright© 2018 NTT TechnoCross Corporation 20 こういう仕組みで実現できそう MergeRequest契機で Webhook 必要な資材をclone

    クラウド基盤を操作して テスト環境を作成 構築用Ansible実行 & テスト実行 実行結果を通知 CIツール GitLab
  14. Copyright© 2018 NTT TechnoCross Corporation 22 その1: リソースの問題 問題: ・前述の通り、AWSやGCPでは実行できない。

    (勝手なIPを使えないので、FloatingIPとかの動作検証ができない) ・ECL2.0 ベアメタルを使えば実行可能だが、 環境構築を自動化できない問題がある。 (悪用されないようFWの設定が必要だが、自動設定できない) ・VMの動作確認のためにsshとかしたいけど、インターネット上に配置すると グローバルIPの確保とかにコストがかかる ・社内に空いてるサーバは転がってない... 1章でも軽く触れたが、以下のような状態だった。
  15. Copyright© 2018 NTT TechnoCross Corporation 23 その1: リソースの問題 要件: •

    自由にIPアドレスを名乗って通信できる、自由なNWがあること • サーバ、NWの構成を自動で作成できること • サーバ上に作ったVMなどに、社内から疎通可能であること できればこういう環境が欲しい
  16. Copyright© 2018 NTT TechnoCross Corporation 24 その2: CIツールの問題 • ジョブにすると一瞬でオーパーツ化するので、後々の修正が大変

    • Pipelineを使うと、タスクの部品化や条件分岐の実装などが大変 • インストール後に設定を手でポチポチ入れるのが面倒 Jenkinsがいいかな、と考えていたが、以下のような問題があった。 実は似たようなことをするためのJenkinsジョブ群がチーム内に 存在していたのだが、見事にオーパーツ化していた。二の舞は避けたい。
  17. Copyright© 2018 NTT TechnoCross Corporation 25 その2: CIツールの問題 他にも色々考えた結果、以下が実現できるCIツールが欲しいという結論に。 要件:

    • CI関連のコード(pipeline, job)は全部Git管理したい • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい
  18. Copyright© 2018 NTT TechnoCross Corporation 28 その1: リソースの問題 「自由にIPアドレスを名乗れる」仮想NWを作れるneutronのオプション port_security_enabled=False

    自チームで管理している社内クラウドはOpenStack製。 そこには管理者しか使えない特殊機能があった。
  19. Copyright© 2018 NTT TechnoCross Corporation 29 (そもそも)port securityとは ポート(インスタンスとNWを結ぶ口)を通る通信について、 そのポートに登録されていないアドレス(IP,

    MAC)の通信をDropする機能 ※雑な理解かもしれない インスタンス 192.168.1.101/aa:bb:cc:dd:~ → OK 192.168.1.102/aa:bb:cc:dd:~ → NG 192.168.1.101/a1:b1:c1:d1:~ → NG ※備考: allowed_address_pairとして登録すればOKにできる ポート作成時のアドレス: 192.168.1.101/aa:bb:cc:dd:~
  20. Copyright© 2018 NTT TechnoCross Corporation 30 port securityを無効にすると どんなアドレスでも通信が通るようになる インスタンス

    192.168.1.101/aa:bb:cc:dd:~ → OK 192.168.1.102/aa:bb:cc:dd:~ → OK 192.168.1.101/a1:b1:c1:d1:~ → OK ※備考: セキュリティグループが使えなくなる ポート作成時のアドレス: 192.168.1.101/aa:bb:cc:dd:~
  21. Copyright© 2018 NTT TechnoCross Corporation 31 好きなIPアドレスを使えるようになったので、 • VMがFloatingIPを使って通信できるようになった •

    OpenStack APIなどが通る仮想IPを複数ノード間で回せるようになった 要件: • 自由にIPアドレスを名乗って通信できる、自由なNWがあること • サーバ、NWの構成を自動で作成できること • サーバ上に作ったVMなどに、社内から疎通可能であること 問題解決
  22. Copyright© 2018 NTT TechnoCross Corporation 32 他の要件についても解決できた • heatを導入してるのでサーバ、NW構成は自動作製できる •

    社内クラウドなので当然社内から疎通できる 要件: • 自由にIPアドレスを名乗って通信できる、自由なNWがあること • サーバ、NWの構成を自動で作成できること • サーバ上に作ったVMなどに、社内から疎通可能であること 要件完全クリア!!!
  23. Copyright© 2018 NTT TechnoCross Corporation 34 • 社内クラウド • ECL2.0

    ベアメタル • 普通のベアメタル どれに対してもできる限り同じコードで構築できるよう、資材を再設計。 社内クラウド用構築 コード(master) ECL2.0用コード: +資源の自動作成 +独自のNW設定 ベアメタル用コード: +PXEブート自動化 +NW機器の設定 +独自のNW設定 fork
  24. Copyright© 2018 NTT TechnoCross Corporation 35 その2: CIツールの問題 要件: •

    CI関連のコード(pipeline, job)は全部Gitで管理したい • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい これくらいだったら「アレ」で解決できそう
  25. Copyright© 2018 NTT TechnoCross Corporation 38 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい

    • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい これは簡単。
  26. Copyright© 2018 NTT TechnoCross Corporation 39 StackStormの機能その① Pack Packという単位でAction, Workflow,

    RuleをGit管理することができる 1. 全部突っ込んでGitへpush 2. GitリポジトリのURLを指定して1コマンドでインポート
  27. Copyright© 2018 NTT TechnoCross Corporation 40 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい

    • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい 余裕。
  28. Copyright© 2018 NTT TechnoCross Corporation 42 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい

    • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい これぞst2の本領
  29. Copyright© 2018 NTT TechnoCross Corporation 44 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい

    • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい GUIで見れる
  30. Copyright© 2018 NTT TechnoCross Corporation 47 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい

    • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい できちゃう
  31. Copyright© 2018 NTT TechnoCross Corporation 51 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい

    • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい かなり楽に実現できる
  32. Copyright© 2018 NTT TechnoCross Corporation 53 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい

    • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい Jenkins Pipelineよりは簡単
  33. Copyright© 2018 NTT TechnoCross Corporation 55 余談: 最近対応したWorkflowフォーマット StackStorm 2.8でOrchestraというフォーマットが利用できるようになった。

    • Mistralより実行が高速 • Mistralの機能をフルサポート(予定) • まだドキュメントは全然揃っていない ※ 特に意味は無いですが、この資料を書きながら、 CI用Workflowを全てOrchestraで書き直しました。 非常にキビキビ動いてくれてますが、 loopに対応していないのでコード量は増えました... 引用: https://docs.stackstorm.com/latest/orchestra/index.html
  34. Copyright© 2018 NTT TechnoCross Corporation 56 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい

    • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい 完全勝利
  35. Copyright© 2018 NTT TechnoCross Corporation 57 ここまでのまとめ 1章: • 「複雑なコードは整理しても複雑なままになる」

    2章: • 「ツールも環境も、対象に合わせて検討しよう」 3章: • 「OpenStackのような自由な基盤を持っておくと便利」 • 「StackStormの機能は特殊な要件のCIにも対応できる」
  36. Copyright© 2018 NTT TechnoCross Corporation 61 動作イメージ① Ansible&テスト実行 MergeRequest契機で Webhook

    必要な資材をclone クラウド基盤を操作して テスト環境を作成 (OpenStack Heat) StackStorm GitLab 社内クラウド
  37. Copyright© 2018 NTT TechnoCross Corporation 62 動作イメージ① Ansible&テスト実行 MergeRequest契機で Webhook

    必要な資材をclone クラウド基盤を操作して テスト環境を作成 構築用Ansible実行 & テスト実行 StackStorm GitLab 社内クラウド
  38. Copyright© 2018 NTT TechnoCross Corporation 63 動作イメージ① Ansible&テスト実行 MergeRequest契機で Webhook

    必要な資材をclone クラウド基盤を操作して テスト環境を作成 構築用Ansible実行 & テスト実行 実行結果を通知 StackStorm GitLab 社内クラウド
  39. Copyright© 2018 NTT TechnoCross Corporation 64 ssh_config: Success http://<host>/<MR-id>/ansible_ssh_config.log init:

    Success http://<host>/<MR-id>/ansible_init.log memcashed: Success http://<host>/<MR-id>/ansible_memcashed.log ~略~ Refstack: Success http://<refstack結果のURL> ~略~ テスト結果の出力イメージ Ansibleのdebug出力が膨大なため、 個別にログを管理する方式としている
  40. Copyright© 2018 NTT TechnoCross Corporation 65 動作イメージ② 目視確認 動作イメージ①実行時に ・鍵ファイル

    ・sshのconfig ・Ansible、テスト資材 が配置される 踏み台越しにテスト環境 へ接続&状況確認可能 社内クラウド
  41. Copyright© 2018 NTT TechnoCross Corporation 66 動作イメージ③ 環境削除 MergeRequest Closeに

    対応したWebhook発行 StackStorm GitLab 社内クラウド MergeRequestがCloseされると、 テスト環境も自動で削除される
  42. Copyright© 2018 NTT TechnoCross Corporation 67 動作イメージ③ 環境削除 MergeRequest Closeに

    対応したWebhook発行 StackStorm GitLab 社内クラウド 社内クラウドを操作して テスト環境を削除 MergeRequestがCloseされると、 テスト環境も自動で削除される
  43. Copyright© 2018 NTT TechnoCross Corporation 69 今後の展望 試験内容: • ベアメタル環境を模擬した、PXEによるOSインストールを

    自動テストしたい • NW機器についても、仮想アプライアンスを用いてAnsibleによる 設定投入を自動テストしたい • 各ミドルウェアを本気で潰しにかかるような耐久試験を実現したい 試験環境(CIツールなど): • CI環境全体で社内クラウドのリソース使用量上限を定めて、 試験をpendingする仕組みを作りたい • 社内チャットと連携したい(今までは諸般の事情により難しかった)