Top Banner
GMO Pepabo, Inc. UCHIO KONDO 2015/09/26 HackerTackle インフラ自動化と Hashicorp tools
209

インフラ自動化とHashicorp tools

Apr 13, 2017

Download

Technology

Uchio Kondo
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: インフラ自動化とHashicorp tools

GMO Pepabo, Inc. UCHIO KONDO2015/09/26 HackerTackle

インフラ自動化とHashicorp tools

Page 2: インフラ自動化とHashicorp tools

me

Page 3: インフラ自動化とHashicorp tools
Page 4: インフラ自動化とHashicorp tools

近藤うちお> GMOペパボ > 技術基盤チーム > 福岡支社勤務

Page 5: インフラ自動化とHashicorp tools

東三河出身> 大学入学とともに東京へ > 2013年から福岡 > 名古屋じゃないに~ この辺

Page 6: インフラ自動化とHashicorp tools

興味> Ruby / Golangを少々 > Puppet / Docker / Hashicorp tools > OpenStack

Page 7: インフラ自動化とHashicorp tools

7 years old Rubyist> Rails 2.1.0 ごろからのルビースト(2008 ~) > Rubyをこじらせて著作あり

Page 8: インフラ自動化とHashicorp tools
Page 9: インフラ自動化とHashicorp tools

松江遠征(予定)

スタバの数で圧倒してきます!

Page 10: インフラ自動化とHashicorp tools

いままで> 新卒入社の最初の2年ぐらい社内SE > その後はずっと 開発系な人 > (自社サービスの会社にしかいたことがない)

Page 11: インフラ自動化とHashicorp tools

ペパボで> 技術基盤チームに所属 > Puppetなどを書いたり > サーバ追加や監視をしたりしていた > でも一度も「インフラエンジニアになるぞ~」と思ったことはない…

Page 12: インフラ自動化とHashicorp tools

インフラってなんだ?

Page 13: インフラ自動化とHashicorp tools

Webエンジニア念能力…> フロントエンド > アプリケーション > ミドルウェア/アーキテクト > インフラ > (開発手法、QA)

http://udzura.hatenablog.jp/entry/2013/03/04/114728

Page 14: インフラ自動化とHashicorp tools

インフラ系技術の流れ> “最近のウェブ界隈での「インフラ」という用語の使われ方には、色々異論もあるようだけど、ここではごく最近使われるようになってきた、OS からミドルウェアといったソフトウェアレイヤーを指す言葉としてのインフラについて触れる。(英語圏でも同様の意味で使われているようなので、ある程度市民権を得たと言っても良さそうだし。)”

http://mizzy.org/blog/2013/10/29/1/

Page 15: インフラ自動化とHashicorp tools

Webエンジニア念能力…> フロントエンド > アプリケーション > ミドルウェア/アーキテクト > インフラ > (開発手法、QA)

http://udzura.hatenablog.jp/entry/2013/03/04/114728

このへんで!

Page 16: インフラ自動化とHashicorp tools

今日はあえて DevOpsって言わない

Page 17: インフラ自動化とHashicorp tools

しかも今日はずっと OSより上、ミドルウェアの話ですね

……

Page 18: インフラ自動化とHashicorp tools

Hashicorp tools

Page 19: インフラ自動化とHashicorp tools

Hashicorpとは?> Vagrant、Packer、Serf、Consulの作者、ミッシェル=ハシモト氏により立ち上げられたスタートアップ

> 様々なインフラ運用・開発を “revolutionizing” するための企業

> 具体的には様々なツール(OSS)の開発とそのサポートをしている

Page 20: インフラ自動化とHashicorp tools

Hashicorpとは?> “The Tao of HashiCorp”

> https://hashicorp.com/blog/tao-of-hashicorp.html

Page 21: インフラ自動化とHashicorp tools

Workflows, not Technologies

Page 22: インフラ自動化とHashicorp tools

Simple, Modular, Composable

Page 23: インフラ自動化とHashicorp tools

Codification, Codification, Codification

Page 24: インフラ自動化とHashicorp tools

Codification = Code + ify + ation

Page 25: インフラ自動化とHashicorp tools

参考> Hashicorpのツール群とオーケストレーション > http://www.slideshare.net/zembutsu/hashicorp-orchestration-tools-introduction

Page 26: インフラ自動化とHashicorp tools

自分とHashicorp tools> 自分の好きなこと > DSLを設計したり書いたりする > プラグインを作ったり公開する > ピタゴラスイッチ

Page 27: インフラ自動化とHashicorp tools

自分とHashicorp tools> 自分の好きなこと > DSLを設計したり書いたりする > プラグインを作ったり公開する > ピタゴラスイッチ

Hashitoolっぽい

Hashitoolっぽい

めちゃくちゃ Hashitoolっぽい!!

Page 28: インフラ自動化とHashicorp tools

最近のHashitool事例> 先日のYAPCなどからいくつか

Page 29: インフラ自動化とHashicorp tools

最近のHashitool事例> Consulと自作OSSを活用した100台規模のWebサービス運用 > “「Consulってこんなに一般化してたのか」的な感想をちらほら見かけるのですが、これはおそらく世間的には全然そんなことはないんじゃないですかね…”

http://sfujiwara.hatenablog.com/entry/2015/08/23/173803

Page 30: インフラ自動化とHashicorp tools

最近のHashitool事例> 我々はどのように冗長化を失敗したのか

http://blog.kenjiskywalker.org/blog/2015/08/22/yapcasia2015/https://twitter.com/kenjiskywalker/status/635659731550408704

Page 31: インフラ自動化とHashicorp tools

最近のHashitool事例> 3分でサービスのOSを入れ替える技術 > “愚直に経験があるもの、評価済みのものをひたすら組み合わせることで、システムアーキテクチャも魔法のようなことを実現できる”

http://yapcasia.org/2015/talk/show/4f85e87a-f9ec-11e4-8262-8ab37d574c3a

Page 32: インフラ自動化とHashicorp tools

最近のHashitool事例> #hashi_wantedly > Working With Terraform > “Terraform + GitHub + CircleCI + Atlas” > “インフラの変更をGitHubのMergeボタンに集約出来る”

http://blog.glidenote.com/blog/2015/02/18/terraform-github-circleci-atlas-aws/

https://speakerdeck.com/glidenote/working-with-terraform

Page 33: インフラ自動化とHashicorp tools

からの

Page 34: インフラ自動化とHashicorp tools

toolsのご紹介 (独断と偏見ver.)

Page 35: インフラ自動化とHashicorp tools

DSL度 ⭐⭐⭐⭐⭐

プラガブル度 ⭐⭐⭐

ピタゴラスイッチ度 ⭐⭐

Page 36: インフラ自動化とHashicorp tools

Vagrant

Page 37: インフラ自動化とHashicorp tools

Vagrant> おなじみ > DSLで開発用VM立ち上げるやつ

> VirualBoxベースのことが多いけど、VMWare、kvm、DigitalOcianなどいろいろバックエンドがあったりする

DSL度 ⭐⭐⭐⭐⭐

プラガブル度 ⭐⭐⭐

ピタゴラスイッチ度 ⭐⭐

Page 38: インフラ自動化とHashicorp tools

Packer

Page 39: インフラ自動化とHashicorp tools

Packer> あらゆる種類の「イメージを作る」

> もともと、VB用の イメージを作るVeeWeeの代用としての紹介が多かったが、実際には、AMI、qemu imageその他いろいろと作れる

> イメージを作る手順も共有できたりする

DSL度 ⭐⭐⭐

プラガブル度 ⭐⭐⭐⭐⭐

ピタゴラスイッチ度 ⭐⭐

Page 40: インフラ自動化とHashicorp tools

Terraform

Page 41: インフラ自動化とHashicorp tools

Terraform> 複数のサーバ構成をある状態に収束させるツールとDSL

> Puppet/Chefなど構成管理ツールが、1台のサーバをある状態に収束させるツールであることの連想

> みんな主にAWSで使ってるので、CloudFormationのあのJSONよりはいいんだなと思う

DSL度 ⭐⭐⭐⭐

プラガブル度 ⭐⭐⭐⭐

ピタゴラスイッチ度 ⭐⭐⭐⭐

Page 42: インフラ自動化とHashicorp tools

Serf

Page 43: インフラ自動化とHashicorp tools

Serf> クラスタ管理ツール > サーバがクラスタに 追加、抜けるなどのタイミングで、任意の処理を実行したりする

> マスターレス > Orchestration(とgossip protocol)の単語を有名にした最初のツール

DSL度 ⭐

プラガブル度 ⭐⭐⭐

ピタゴラスイッチ度 ⭐⭐⭐⭐⭐

Page 44: インフラ自動化とHashicorp tools

Consul

Page 45: インフラ自動化とHashicorp tools

Consul> クラスタ管理ツール(2) > Serfとかぶってるどころか内部でSerf利用

> Serfとは、各サーバでエージェントとして動いている点、ヘルスチェックによるサービスディスカバリを基本にしている点が大きな違い。また、簡易KVSも用意

> see: Raft Algorithm

DSL度 ⭐⭐

プラガブル度 ⭐⭐⭐

ピタゴラスイッチ度 ⭐⭐⭐⭐⭐

Page 46: インフラ自動化とHashicorp tools

Vault

Page 47: インフラ自動化とHashicorp tools

Vault> 期待の新人 > センシティブな情報を安全に管理、共有、そして監査する

> githubなどのアカウントチームを、Vault上の権限とひも付けて、そしてMySQLやらConsulやらといい感じに連携

DSL度 ⭐⭐⭐

プラガブル度 ⭐⭐⭐⭐⭐

ピタゴラスイッチ度 ⭐⭐⭐

Page 48: インフラ自動化とHashicorp tools

Atlas

Page 49: インフラ自動化とHashicorp tools

Atlas> ここまで紹介した各種ツールを横軸でまとめるウェブサービス

> ごめんな、これだけOSSとちゃうんや。SaaSなんやで。 > いまのところConsulの中央サーバ、Vagrant BOXの置き場所などの用途。SaaSとしての安定性も含め、利用シーンは未知数なところが多い。UIもまだ渋い……

DSL度 ?

プラガブル度 ?

ピタゴラスイッチ度 ?

Page 50: インフラ自動化とHashicorp tools

To Be Continued?

Page 51: インフラ自動化とHashicorp tools

Artifact Pipeline

Page 52: インフラ自動化とHashicorp tools

https://www.hashicorp.com/blog/atlas-artifact-pipeline.html

Page 53: インフラ自動化とHashicorp tools

事例紹介

Page 54: インフラ自動化とHashicorp tools

Packerのプラグインを書いた話

Page 55: インフラ自動化とHashicorp tools

Packer

Page 56: インフラ自動化とHashicorp tools

Packer

Page 57: インフラ自動化とHashicorp tools

http://www.slideshare.net/hsbt/advanced-technic-for-os-upgrading-in-3-minutes

Page 58: インフラ自動化とHashicorp tools

Do scale-out

Page 59: インフラ自動化とHashicorp tools

#3分で スケールアウト

Page 60: インフラ自動化とHashicorp tools

http://udzura.hatenablog.jp/entry/2015/03/20/192619

Page 61: インフラ自動化とHashicorp tools

やりました

Page 62: インフラ自動化とHashicorp tools

Packer で、 やりました

Page 63: インフラ自動化とHashicorp tools

じゃあ、それをOpenStackでも

Page 64: インフラ自動化とHashicorp tools
Page 65: インフラ自動化とHashicorp tools

Nyahについて> ネットワークに癖がある > DHCPエージェントは使わない > metadataエージェントも使わない

> なのでこうする > 事前にport(仮想NIC)を作る > IP、MAC addressなどをuserdataを使って流し込んでネットにつなぐ

Page 66: インフラ自動化とHashicorp tools

既存のopenstack builder> ネットワークに癖がある > DHCPエージェントは使わない > metadataエージェントも使わない

> なのでこうする > 事前にport(仮想NIC)を作る > IP、MAC addressなどをuserdataを使って流し込んでネットにつなぐ

こういうカスタマイズには対応していない!

Page 67: インフラ自動化とHashicorp tools

じゃあどうしよう

Page 68: インフラ自動化とHashicorp tools
Page 69: インフラ自動化とHashicorp tools

packer-builder-nyah

Page 70: インフラ自動化とHashicorp tools

Packerプラグインの 作り方

Page 71: インフラ自動化とHashicorp tools

Pluginの種類> Builder > プラットフォームごとのアダプター(AWS, Openstack, QEMUなど)

> Provisioner > 立ち上げたソースサーバに実際のプロビジョニングをしていく(Shell Script, Chef, Puppetなど)

> Post Processor > 後処理(docker builderならdockerhubにpushするとか)

Page 72: インフラ自動化とHashicorp tools

今回必要なのは Builder Plugin

Page 73: インフラ自動化とHashicorp tools

方針> 既存のOpenStackプラグインの実装を参考にする、どんどんパチる

> Nyah固有の必要な処理だけ自分で書く > 先にPort用意して特別なuserdataを流すとこだけ書けばいい、はず。そのはずなんだ

Page 74: インフラ自動化とHashicorp tools

How to write

Page 75: インフラ自動化とHashicorp tools

最低限のルール> 以下を満たすインターフェース

> これが処理のエントリポイントになる

type Builder interface { Prepare(...interface{}) error Run(ui Ui, hook Hook, cache Cache) (Artifact, error) Cancel() }

Page 76: インフラ自動化とHashicorp tools

Builder typeを> これをコマンドのエントリポイントにして > 普通にビルドすれば良い > 利用するには、packer-builder-nyah という名前のバイナリにしPATHを通す

Page 77: インフラ自動化とHashicorp tools

それぞれのフェ~ズPrepare(...interface{}) error

> 準備。主に、設定を読み込む。 > このフェーズでサーバはいじるべきではないとのこと Run(ui Ui, hook Hook, cache Cache) (Artifact, error)

> 実際のサーバ立ち上げ処理。詳細後述 Cancel()

> キャンセル時/失敗時/正常終了時全部で呼ばれる後処理。名前……

Page 78: インフラ自動化とHashicorp tools

Runの中身> Run(ui Ui, hook Hook, cache Cache) (Artifact, error)

> packer.Artifactも、またインタフェース

> https://github.com/mitchellh/packer/blob/master/packer/artifact.go という便利ドキュメントを読んで頑張る(サーバIDとかそういう情報を返せば良いとのこと)

Page 79: インフラ自動化とHashicorp tools

まずは> ビルドが > できる > とこまで…うう

Page 80: インフラ自動化とHashicorp tools

いよいよ、Run()の 中身を書く

Page 81: インフラ自動化とHashicorp tools

Run() 既存実装の詳細> キーペア登録 > サーバ立ち上げ > Floating IPの割り当て > SSH接続、操作 > 終了処理 > イメージ作成

Page 82: インフラ自動化とHashicorp tools

この辺をいじれば良さそう> キーペア登録 > サーバ立ち上げ > Floating IPの割り当て > SSH接続、操作 > 終了処理 > イメージ作成

portの作成を事前にする

portの情報から 適切なuserdataを 作った上で立ち上げ

Floating IP は使わない (portにIP情報がある)

Page 83: インフラ自動化とHashicorp tools

Goを書くぞ

Page 84: インフラ自動化とHashicorp tools

mitchellh/multistep> Step構造体を定義してそれを並べるだけ

> Stepの再利用できる > やることが、Stepという単位で分割される

Page 85: インフラ自動化とHashicorp tools

mitchellh/mapstructure> 「賢いJSON」 > JSONのパーサライブラリ > 現実的なユースケースに色々対応していてコードがスッキリする

https://github.com/mitchellh/mapstructure

Page 86: インフラ自動化とHashicorp tools

gophercloud> Goライブラリのデファクトスタンダード > Rackspace社で保守 > APIは結構……あれだけど活発な開発 > 以前別のクライアントで使って、経験があった

https://github.com/rackspace/gophercloud

Page 87: インフラ自動化とHashicorp tools

ロゴが良い(...)

Page 88: インフラ自動化とHashicorp tools

さて、どんな感じか中身を見てみよう…

Page 89: インフラ自動化とHashicorp tools
Page 90: インフラ自動化とHashicorp tools
Page 91: インフラ自動化とHashicorp tools
Page 92: インフラ自動化とHashicorp tools

fork………?????

Page 93: インフラ自動化とHashicorp tools

諸事情でforkされていた。。。だと

Page 94: インフラ自動化とHashicorp tools

michellさん「Wow!」

Page 95: インフラ自動化とHashicorp tools

そして足りない機能がある…………> サーバ立ち上げ時に、「ネットワークID」じゃなくて「ポートID」を指定する必要がある

> forkされた段階のgophercloudには未実装$ nova help boot --nic <net-id=net-uuid,v4-fixed-ip=ip-addr,v6-fixed-ip=ip-addr,port-id=port-uuid> Create a NIC on the server. Specify option multiple times to create multiple NICs. net- id: attach NIC to network with this UUID (either port-id or net-id must be provided), v4-fixed-ip: IPv4 fixed address for NIC (optional), v6-fixed-ip: IPv6 fixed address for NIC (optional), port-id: attach NIC to port with this UUID (either port-id or net-id

Page 96: インフラ自動化とHashicorp tools

forkをfork

Page 97: インフラ自動化とHashicorp tools
Page 98: インフラ自動化とHashicorp tools

$ go test ./... # git.***.***/tech/packer-builder-nyah ../../../../.go/src/git.***.***/tech/packer-builder-nyah/builder.go:75: cannot use auth (type "github.com/mitchellh/gophercloud-fork-40444fb".AccessProvider) as type "github.com/udzura/gophercloud-fork-9419da4".AccessProvider in argument to "github.com/udzura/gophercloud-fork-9419da4".Server: "github.com/mitchellh/gophercloud-fork-40444fb".AccessProvider does not implement "github.com/udzura/gophercloud-fork-9419da4".AccessProvider (wrong type for FirstEndpointUrlByCriteria method) have FirstEndpointUrlByCriteria("github.com/mitchellh/gophercloud-fork-40444fb".ApiCriteria) string want FirstEndpointUrlByCriteria("github.com/udzura/gophercloud-fork-9419da4".ApiCriteria) string

Page 99: インフラ自動化とHashicorp tools

パッケージ名が合わない!> ミスマッチの対応のためのバッドノウハウ > ミスマッチするところは、そのimport文だけを変えた形で本家からコピーして配置しておく

Page 100: インフラ自動化とHashicorp tools

いろいろなYakを狩りまくり 最終的には……動いた!

Page 101: インフラ自動化とHashicorp tools

そしてNヶ月が過ぎた

Page 102: インフラ自動化とHashicorp tools
Page 103: インフラ自動化とHashicorp tools

またまた~

Page 104: インフラ自動化とHashicorp tools
Page 105: インフラ自動化とHashicorp tools
Page 106: インフラ自動化とHashicorp tools

突然の _人人人人人人人人人人_ > upstream変更 < ‾Y^Y^Y^Y^Y^Y^Y‾

Page 107: インフラ自動化とHashicorp tools

どうしたか?> godepの導入 > packerの、動いている段階のビルドを探して………………………………………………………………………………………………………………………………………………………………………

> fork

Page 108: インフラ自動化とHashicorp tools
Page 109: インフラ自動化とHashicorp tools

得られた教訓> 容赦なくupstreamが変わる、それがGoの世界 > とくに、packerは別にもとから外部向けのライブラリではなく、たまたまいい具合にパッケージが分かれていたのを使っただけなので、仕方なさがある

> 運用で使うようになったらgodeps > しかしGoは型があるので便利 > いざとなったらとにかくコンパイルエラーを直し、なんとかする

> CIしようぜ!!! > すぐ気づける

Page 110: インフラ自動化とHashicorp tools

おまけ> Provisioner Pluginも作ってみた > https://github.com/udzura/packer-provisioner-serverspec

> 同じように、インタフェースを合わせれば良い。便利 > 詳細はコードで!

Page 111: インフラ自動化とHashicorp tools

Consulをバーンと入れた話

Page 112: インフラ自動化とHashicorp tools

http://www.slideshare.net/hsbt/advanced-technic-for-os-upgrading-in-3-minutes

Page 113: インフラ自動化とHashicorp tools

Do scale-out

Page 114: インフラ自動化とHashicorp tools

#3分で スケールアウト

Page 115: インフラ自動化とHashicorp tools

大事なことなので2回ry

Page 116: インフラ自動化とHashicorp tools

サーバをカジュアルに増やす> from 12 facter app > V. Build, release, run > Strictly separate build and run stages

> IX. Disposability > Maximize robustness with fast startup and graceful shutdown

Page 117: インフラ自動化とHashicorp tools

監視についても> Runしたら、自動で監視対象になってほしい > Terminateしたら、勝手に外れてほしい > イメージから立ち上げたはいいけど、アプリが正常に動いていることを何かしら確認したい

Page 118: インフラ自動化とHashicorp tools

Consul

Page 119: インフラ自動化とHashicorp tools

Consul の機能> クラスタリング、ヘルスチェック > Web UI を公式に用意している > consul-alerts なんかで通知もできる

Page 120: インフラ自動化とHashicorp tools
Page 121: インフラ自動化とHashicorp tools

検証する価値はありそう

Page 122: インフラ自動化とHashicorp tools

インストールして立ち上げてみた

Page 123: インフラ自動化とHashicorp tools
Page 124: インフラ自動化とHashicorp tools

何これ怖い

Page 125: インフラ自動化とHashicorp tools

vm.overcommit_memory=0

Page 126: インフラ自動化とHashicorp tools

おおう……

Page 127: インフラ自動化とHashicorp tools

strace

32 GB+ 8 GB

Page 128: インフラ自動化とHashicorp tools

メモリをガツッと確保する> Consul makes use of LMDB internally for various data storage purposes. LMDB relies on using memory-mapping, a technique in which a sparse file is represented as a contiguous range of memory.

> vm.overcommit_memory=2 だったので、落ちた > ※ 0.5.0では vm.overcommit_memory=2 でも落ちなくなっていた

https://www.consul.io/docs/faq.html

Page 129: インフラ自動化とHashicorp tools

立ち上がったので クラスタリングしてみようかな

Page 130: インフラ自動化とHashicorp tools
Page 131: インフラ自動化とHashicorp tools

めちゃくちゃ不安定……> いろいろいじった結果、UDPのポート8301 をお互いに許可していなかった。。。。。。

> 開けたら安定した > 使うポート/プロトコルは↓

https://www.consul.io/docs/agent/options.html

Page 132: インフラ自動化とHashicorp tools

よっしゃ導入OK!

Page 133: インフラ自動化とHashicorp tools

それから数週間後

Page 134: インフラ自動化とHashicorp tools
Page 135: インフラ自動化とHashicorp tools
Page 136: インフラ自動化とHashicorp tools

CPU 1個のインスタンスだと……> consulは、 GOMAXPROCS=2 以上の設定を強く推奨している

> GOMAXPROCS=1、またはCPU 1個だとパフォーマンスで問題が起こる

> 1個のものは、CPU2個以上で、作り直した

Page 137: インフラ自動化とHashicorp tools

“https://groups.google.com/forum/#!msg/consul-tool/qewFEqgAoF8/b9hxhmy1v6gJ

“The reason we recommend setting GOMAXPROCS is to avoid potential starvation of the scheduler. The Go runtime uses green threads (M:N). If a single goroutine blocks the scheduler (via cgo for example) it can cause degraded performance. Having another kernel thread available helps to

mitigate those issues.”

Page 138: インフラ自動化とHashicorp tools

Tips: VirtualBoxで試すとき> IO/APIC を有効にしないとダメです

> Vagrantなら以下の感じ

Page 139: インフラ自動化とHashicorp tools

そんなこんなで 安定運用(?)

Page 140: インフラ自動化とHashicorp tools

できなかったことが できるようになる

Page 141: インフラ自動化とHashicorp tools

内部DNS

Page 142: インフラ自動化とHashicorp tools

OpenStackの内部DNS> 結構悩んでいた > DHCP agentは使えないし、自分でDDNS?うえ~

> APIを叩いてhostsを定期更新、とかも手。 だが……

Page 143: インフラ自動化とHashicorp tools

DNS INTERFACE

Page 144: インフラ自動化とHashicorp tools

方針> ドメインを minne.lan とかにする > dnsmasq を全台に導入 > *.node.minne.lan は dnsmasq からlocalhost:8600にフォワード、各サーバでは127.0.0.1をリゾルバに

Page 145: インフラ自動化とHashicorp tools

あっさり導入完了

Page 146: インフラ自動化とHashicorp tools

Consulが撃沈したり……> DNS APIは、リーダーがいないと叩けない > 一時的にリーダーがいなくなるタイミングとかはどうしてもあるので

> dnsmasqの設定にしてしまってキャッシュしておく

Page 147: インフラ自動化とHashicorp tools

これを5分ごとに実行CACHE_TMP=/tmp/consul-cns-cache.$$ TARGET=/etc/dnsmasq.d/999-nodes-cache.conf set -e set -o pipefail

curl -s localhost:8500/v1/catalog/nodes \ | jq -r "map(\"address=/\(.Node).node.minne.lan/\(.Address)\")[]" \ > $CACHE_TMP cp -af $CACHE_TMP $TARGET systemctl restart dnsmasq

set -e してるので、 consul自体が使えないときはそもそも

キャッシュが上書きされないようにしている

Page 148: インフラ自動化とHashicorp tools

便利> クラスタにジョインしたら、すぐに内部の名前でSSHできるようになった!

> ConsulのAPIはめっちゃ軽いので良い

Page 149: インフラ自動化とHashicorp tools

副産物> 踏み台+内部DNS+peco+Consul APIにより便利ログイン君ができて便利になった

Page 150: インフラ自動化とHashicorp tools
Page 151: インフラ自動化とHashicorp tools

動的LB

Page 152: インフラ自動化とHashicorp tools

ELB的なやつにほしい要素> 動的なメンバー追加、削除 > 自動的なヘルスチェック > 高い可用性

Page 153: インフラ自動化とHashicorp tools

consul-template

Page 154: インフラ自動化とHashicorp tools

consul-templateで> 動的なメンバー追加、削除 > 自動的なヘルスチェック > この二つは実現できるぞ!

Page 155: インフラ自動化とHashicorp tools

consul-templateの仕組み

LB

www

www

www

フロントLBもNginxとする。 全台、consulのクラスタに

ジョインする

Page 156: インフラ自動化とHashicorp tools

consul-templateの仕組み

LB

www

www

www

たとえばバックエンドのプロセス (NginxならNginx) に特定のタグを加えて

Consulのチェックを追加する

Page 157: インフラ自動化とHashicorp tools

JSONの例

“sandbox-front” というタグを特別につけている

Page 158: インフラ自動化とHashicorp tools

consul-templateの仕組み

LB

www

www

www

LB側では、「sandbox-front」 というタグに紐付いた

サービスの状態を監視している

Page 159: インフラ自動化とHashicorp tools

テンプレートを書くupstream rails_apps { {{range service "sandbox-front.nginx@nyah" "passing"}} server {{.Address}}:80;{{end}} }

server { listen 80; # server_name minne.com api.minne.com; server_name _

proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host;

location / { proxy_pass http://rails_apps; } }

sandbox-frontというタグのついたnginxのチェックのうち 正常(passing)のものを監視する

Page 160: インフラ自動化とHashicorp tools

consul-templateの仕組み

LB

www

www

www

たとえば、ここで1台の Nginxがダウンしたとする

💥

Page 161: インフラ自動化とHashicorp tools

consul-templateの仕組み

LB

www

www

www

consul-template は、 nginxのfailedを検知する

💥

Page 162: インフラ自動化とHashicorp tools

consul-templateの仕組み

LB

www

www

www

変更を検知して、 passingなメンバーのみで

ループを回し、 テンプレートを更新する

💥

Page 163: インフラ自動化とHashicorp tools

consul-templateの良さ> 仕組み自体は理解できれば割とシンプル > チェック項目、フックなどのカスタマイズがわかりやすい

> フロントのNginx自体には、何の手も加えていない > そのため、本来のNginxのパフォーマンスが出るし、チューニング等も特別なことはない

Page 164: インフラ自動化とHashicorp tools

制限事項> 最後に残った、LB自体の可用性は、普通にLVSなりkeepalivedなりに頼ることになります……。

> ここは地道に頑張っている

Page 165: インフラ自動化とHashicorp tools

インフラ運用で 新規ツールを導入する意義

Page 166: インフラ自動化とHashicorp tools

ここから ビッグ主語

Page 167: インフラ自動化とHashicorp tools

運用と開発

Page 168: インフラ自動化とHashicorp tools

きょうびのWeb開発> バンバンバージョンアップされる > Railsが有名だが、PHPも激しいし、フロントエンド界隈、nodejs、Go、Docker、iOS/Android開発……

> どんどん変わっていく > 動き続けないと、古くなる > 古くなると動きが遅くなる。どこかで、新しいことができなくなる

Page 169: インフラ自動化とHashicorp tools

> 「運用とはユーザの価値を減らさないよう維持することだ」 > by haras⚪u5さん

> 重い言葉だと思う。ユーザが必ずしも変化を求めているか?

一方、運用とは?

Page 170: インフラ自動化とHashicorp tools

なお、インフラエンジニアは死んだらしいぞ

Page 171: インフラ自動化とHashicorp tools

どうすればいいの?> Webに関わるソフトウェアの大きな潮流は、動き続ける、変わり続けることに舵を切っている

> 運用エンジニア・インフラエンジニアもこの潮流を全く無視することはできないのではないだろうか?

Page 172: インフラ自動化とHashicorp tools

リスクの例: 脆弱性

> 「変わらない」に舵を切った結果、CentOS 4 のサーバが残っていたらどうする?

Page 173: インフラ自動化とHashicorp tools

変化を恐れない

Page 174: インフラ自動化とHashicorp tools

動き続けるインフラ運用

Page 175: インフラ自動化とHashicorp tools

変化を適切に恐れる

Page 176: インフラ自動化とHashicorp tools

よく知られた事実> 新しくソフトウェアを書くと、

Page 177: インフラ自動化とHashicorp tools

よく知られた事実> 新しくソフトウェアを書くと、 > バグが起こることがある!!!

Page 178: インフラ自動化とHashicorp tools

cf. バスタブ曲線

https://ja.wikipedia.org/wiki/%E6%95%85%E9%9A%9C%E7%8E%87%E6%9B%B2%E7%B7%9A

Page 179: インフラ自動化とHashicorp tools

一切ソフトウェアを書かなければ バグも起こらない

Page 180: インフラ自動化とHashicorp tools

動くことにもリスクがある> なので、我々は、動くことのリスクを最小限にしないとならない

Page 181: インフラ自動化とHashicorp tools

リスクを減らすには?

Page 182: インフラ自動化とHashicorp tools

ここでやっと

Page 183: インフラ自動化とHashicorp tools

Hashicorp

Page 184: インフラ自動化とHashicorp tools

動き続けるインフラ運用になぜHashicorpが効くか

Page 185: インフラ自動化とHashicorp tools

より運用者に近いレイヤ

Page 186: インフラ自動化とHashicorp tools

レイヤ分け> ミドルウェアの3分類 > 日常の作業のツール > 運用のためのデーモン > ユーザに直接関わるデーモン

> 上の2つについては、新しいものを試しやすく、切り戻しも比較的容易

Page 187: インフラ自動化とHashicorp tools

レイヤ分け> ミドルウェアの3分類 > 日常の作業のツール > 運用のためのデーモン > ユーザに直接関わるデーモン

> 上の2つについては、新しいものを試しやすく、切り戻しも比較的容易

Vagrant, Packer, TerraformConsul, Serf, Vault

(consul-template)

Page 188: インフラ自動化とHashicorp tools

ツール自体のモダンさ

Page 189: インフラ自動化とHashicorp tools

Hashicorp toolsの考え方> ツール自体が大変近代的な開発 > githubでオープンに開発 > テストコード、CI完備

> Codification=設定は必ずコードになる > 設定変更を履歴管理ことを強く推奨する

> Go言語を選択し、コードも綺麗 > 導入時の安定性

Page 190: インフラ自動化とHashicorp tools

インフラCIをはじめとした、テスト> テストを、それも自動でする時代 > Serverspec、Infrataster > Dockerなどによるインフラのコンポネント化 > 「責務を小さく」することでのテスト容易性

> ミドルウェアにも洗練されたテストコード > Hashicorp toolsはテスト、開発のオープンさを重視している

> なにより、監視 > 最近はmackerelのようなサービスもある

Page 191: インフラ自動化とHashicorp tools

cf. サーバ開発自体のモダン化> 検証環境を作るコストが格段に下がっている > AWSをはじめとしたクラウドのコモディティ化 > 構成管理ツール(Chef/Puppet/…)の普及 > Vagrantの出現 > コンテナ仮想化のブーム

> その気になればステージングを丸ごともうひとつ > (そこでterraform?)

Page 192: インフラ自動化とHashicorp tools

「新しい」ことのアドバンテージ> モダンなOSS開発手法 > モダンなツール、言語、環境 > →ソフトウェア自体の質が向上している > このアドバンテージが「枯れているが、保守されていないミドルウェア」に勝る時代になってきているのではないか

Page 193: インフラ自動化とHashicorp tools

TerraformのMakefile> CIのテスト、受入テスト、レースコンディションの検知テストが全部コマンド一発(らしい)

Page 194: インフラ自動化とHashicorp tools

目的をはっきりさせる

Page 195: インフラ自動化とHashicorp tools

目的をはっきりさせる> ゴールデンイメージを作る手順を完全にコード化したい > →Packerを使う

> 動的な監視を、まずは実現したい(それ以上のことはおいおいでもいい) > →Consulを使う

> 達成できない、とわかったらちゃんと引き返す

Page 196: インフラ自動化とHashicorp tools

既存のツールでいいときは冒険しない> 例えば: > サービスが落ちたのをconsulでチェック→落ちたことをフックにconsul watchでサービス再起動→ やった!自動再起動できた!

> それ、monitでできるよ……

Page 197: インフラ自動化とHashicorp tools

ちゃんと2つ以上の何かを減らせるか?> 小さな、かつ新規性のあるツールを選ぶ > “何か新しいものを1つ入れるときは既存の何かを2つ以上減らせること” > http://myfinder.hatenablog.com/entry/2015/03/27/141416

Page 198: インフラ自動化とHashicorp tools

非連続性に挑戦する

Page 199: インフラ自動化とHashicorp tools

連続性、非連続性> 普通の運用は連続的 > 枯れたツールを使う > 変化を避けていく > 手順を継承する

> 連続的に問題を解決することはめちゃくちゃ大事である!!

Page 200: インフラ自動化とHashicorp tools

どこかで、非連続性がほしい> 今までに解決していない問題を解決しないといけない

> 非連続性への “投資” > Yak刈りの結果、どんな問題が解決するか?

Page 201: インフラ自動化とHashicorp tools

非連続の先を見るために Yak刈りを厭わない

Page 202: インフラ自動化とHashicorp tools

Hashicorp toolsは> 新しい概念(=非連続性)でOpsの問題を解決するツール > 実際に、イメージ作成の簡易化、機密情報の管理、サービスディスカバリ、動的設定変更など、これまで難しいとされてきた課題に答えを出しつつある

> しかも、非常にオープンなツールで使いやすい

Page 203: インフラ自動化とHashicorp tools

総括

Page 204: インフラ自動化とHashicorp tools

動き続けるために

Page 205: インフラ自動化とHashicorp tools

動き続けるためのバランス> むやみな破壊をしない > むやみに守らない > ちゃんとバリューを出せる見込みを持って攻め込んで行こう

Page 206: インフラ自動化とHashicorp tools

Hashicorpツールから学ぶべきことは、ツール自体以上に、

たくさんあるかもしれない

Page 207: インフラ自動化とHashicorp tools

[PR]

Page 208: インフラ自動化とHashicorp tools

ペパボにはHashitoolsを使う仕事があります

> 福岡でもインフラ絶賛募集! > ペパランチョンでお話を。 > https://pepabo.com/recruit/pepaluncheon/?fukuoka

Page 209: インフラ自動化とHashicorp tools

画像ソース> タイトル写真

> https://commons.wikimedia.org/wiki/File:Kings_Cross_Train_Station_London_England.jpg