50
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved. OpenStack関連セッション 1 OpenStack Summit Barcelona 2016 参加報告 神尾皓 立見祐介 Ansibleによるおっちょこちょい の運用自動化 高橋拓也 4年間、OpenStackをデプロイし てみた 北田駿也 OpenStack on Kubernetes 木下裕太

Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT①

  • Upload
    yahoo

  • View
    499

  • Download
    3

Embed Size (px)

Citation preview

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

OpenStack関連セッション

1

OpenStack Summit Barcelona 2016 参加報告

神尾皓 立見祐介

Ansibleによるおっちょこちょいの運用自動化

高橋拓也

4年間、OpenStackをデプロイしてみた

北田駿也

OpenStack on Kubernetes

木下裕太

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

2017年1月30日

2

高橋拓也(24)

サイトオペレーション本部 インフラ技術1部 クラウドイノベーション

Ansibleによる

おっちょこちょいの運用自動化

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

自己紹介

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

自己紹介

4

• 高橋拓也

• インフラ技術1部 クラウドイノベーション所属• プライベートクラウド(OpenStack)の運用・開発を担当

• 2016年度新卒入社

• インフラの基礎技術について、目下勉強中です

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

6

• はじめての既存システム運用• しかもものすごく大規模システム

• 一つのミスが複数のサービスに大影響を

• しかし、そんな自覚が足りなかった新人1ヶ月目

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

7

• (^o^)。。( 本番環境にアクセスっと

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

8

• (^o^)。。( 本番環境にアクセスっと

• (^o^)。。(Haproxyあがってないな、 $ sudo service haproxy start

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

9

• (^o^)。。( 本番環境にアクセスっと

• (^o^)。。(Haproxyあがってないな、 $ sudo service haproxy start

• (´・ω・`) < 高橋くん、それheartbeatだよ。。。

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

10

• (^o^)。。( 本番環境にアクセスっと

• (^o^)。。(Haproxyあがってないな、 $ sudo service haproxy start

• (´・ω・`) < 高橋くん、それheartbeatだよ。。。

• (´・ω・`) < もうちょっと確認してから sudoは打とうね。。。

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

11

• (^o^)。。( 本番環境にアクセスっと

• (^o^)。。(Haproxyあがってないな、 $ sudo service haproxy start

• (´・ω・`) < 高橋くん、それheartbeatだよ。。。

• (´・ω・`) < もうちょっと確認してから sudoは打とうね。。。

はじめてのオペミス (運用業務開始2日目

本番環境こわい

対策: 本番環境では気を引き締めよう

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

12

• (^o^)。( 今度は慎重にやるぞー

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

13

• (^o^)。( 今度は慎重にやるぞー

• (^o^)。( だんだん疲れてきたな。。

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

14

• (^o^)。( 今度は慎重にやるぞー

• (^o^)。( だんだん疲れてきたな。。

• (^o^)。( VMのnicを削除するぞ!

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

15

• (^o^)。( 今度は慎重にやるぞー

• (^o^)。( だんだん疲れてきたな。。

• (^o^)。( VMのnicを削除するぞ!

• (^o^) < あ!削除するnicを間違えた!!

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

16

• (^o^)。( 今度は慎重にやるぞー

• (^o^)。( だんだん疲れてきたな。。

• (^o^)。( VMのnicを削除するぞ!

• (^o^) < あ!削除するnicを間違えた!!

• (´・ω・`) < 事故

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

17

• (^o^)。( 今度は慎重にやるぞー

• (^o^)。( だんだん疲れてきたな。。

• (^o^)。( VMのnicを削除するぞ!

• (^o^) < あ!削除するnicを間違えた!!

• (´・ω・`) < 事故

• 必要ないポートだったため事故とはならず

• 対策: 目grepはやめてマシンにgrepさせる

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

18

• (^o^)。( このDB書き込みオペはミスできないな。。

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

19

• (^o^)。( このDB書き込みオペはミスできないな。。

• (^o^)。( 手順書からしっかりコピペして、2回チェックして

• (^o^)。( 出力結果も残したし、完璧だ!!

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

20

• (^o^)。( このDB書き込みオペはミスできないな。。

• (^o^)。( 手順書からしっかりコピペして、2回チェックして

• (^o^)。( 出力結果も残したし、完璧だ!!

• (´・ω・`) < 高橋くん、それslaveだよ。。。

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

つらかったこと

21

• (^o^)。( このDB書き込みオペはミスできないな。。

• (^o^)。( 手順書からしっかりコピペして、2回チェックして

• (^o^)。( 出力結果も残したし、完璧だ!!

• (´・ω・`) < 高橋くん、それslaveだよ。。。

• 先輩社員の神業オペレーションにより、影響を残さず処理できた

• 対策: hostnameをターミナルに出力し続ける

• もしhostnameを見逃したら。。。 → あまり対策になってない

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

気づいたこと

22

• オペミスする確率はエンターを押す回数と比例する

• 「対策: 気をつける」 は、必ず失敗する

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

気づいたこと

23

• オペミスする確率はエンターを押す回数と比例する

• 「対策: 気をつける」 は、必ず失敗する

オペミスが起きないインターフェースを使おう!

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

脱オペミス!

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

オペミスが起きないIFとは?

• オペミスが起きないIFとは• 実行のたびに状態が変化しない

• 冪等性を保つ or 保つ仕組みがある• 作業内容が見える

• 第三者によりチェックされた作業しか実行できないようにする

• 入力が少ない• 固定の設定値はツールで保持する

• 人力作業が少ない• 単純作業は自動化させる

25

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.26

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.27

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

Ansibleによる運用自動化

28

• なぜAnsible?• 実行のたびに状態が変化しない

• 冪等性を保つ仕組みを持つ• →作業実行に迷わない

• 作業内容が見える• 作業内容をコード化して管理できる• タスク実行が逐次処理となる• →やり方のわからない作業がなくなる

• 入力が少ない• 変数として値をplaybookに保持できる• →どの変数を利用するかを入力として与えれば良い

• 人力作業が少ない• 単純作業は自動化させる• →エンターの叩かれる回数は確実に減る

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

30

• OpenStackを操作してFlavorを追加する• Flavor … インスタンスのスペック情報

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.31

実行手順手順

1. クラスタのユーザー情報を読み込む

2. Clientをロードする

3. nova flavor-create を実行し、flavoを作成する

4. nova flavor-key を実行し、flavorのextra_spec(quotaなど) を追加する

実行コマンド

1. $ source cluster/adminrc

2. $ source /os/liberty/activate

3. $ nova flavor-create 2v-1024M-40G auto 1024 40 2

4. $ nova flavor-key set drive_type=ssd

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.32

実行手順手順

1. クラスタのユーザー情報を読み込む

2. Clientをロードする

3. nova flavor-create を実行し、flavoを作成する

4. nova flavor-key を実行し、flavorのextra_spec(quotaなど) を追加する

実行コマンド

1. $ source cluster/adminrc

2. $ source /os/liberty/activate

3. $ nova flavor-create 2v-1024M-40G auto 1024 40 2

4. $ nova flavor-key set drive_type=ssd

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

33

• OpenStackを操作してFlavorを追加する• Flavor … インスタンスのスペック情報

• OpenStackのクラスタ毎に追加するスペックが異なる• SSD機のクラスタはdisk quotaをゆるめたりとか

• 想定されるオペミス• 同名のフレーバーを作ろうとしてしまう

• extra_specの値を間違えて設定してしまう

Ansibleでワークフロー化

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

34

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

35

add_flavor.yaml

- hosts: work

user: takutaka

roles:

- nova/flavor-create

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

36

vars/flavor-create.json

{

"flavor_name": "2v-1024M-30G",

"cluster_name": “cluster1"

}

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

37

vars/flavor-create.json

{

"flavor_name": "2v-1024M-30G",

"cluster_name": “cluster1"

}

add_flavor.yaml

- hosts: work

user: takutaka

roles:

- nova/flavor-create

$ ansible-playbook add_flavor.yaml –i hosts ¥–-extra-vars “@vars/flavor-create.json”

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

38

flavor-create/tasks/main.yaml

- name: parse flavor name to machine spec

flavor2spec:

flavor: '{{flavor_name}}'

register: spec

- name: check flavor name

shell: |

nova flavor-list |grep {{flavor-name}}

register: result

failed_when: result not in [0, 1]

- name: create flavor

shell: |

nova flavor-create "{{flavor_name}}" auto ¥

{{spec.mem}} {{spec.disk}} {{spec.vcpu}}

when: result.rc == 1

- name: set extra_spec to flavor

shell: |

nova flavor-key "{{flavor_name}}" set ¥

"{{item.key}}"="{{item.value}}"

with_dict: "{{vars[cluster_name]}}"

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

39

Library/flavor2spec.sh

#!/bin/bash

name=`cat $1|awk -F'flavor=' '{print $2}'|awk -F' ' '{print $1}' `

vcpu=`echo $name|awk -F'-' '{print $1}'`

mem=`echo $name|awk -F'-' '{print $2}'`

disk=`echo $name|awk -F'-' '{print $3}'`

echo -n

{"name":"${name}","vcpu":"${vcpu}","mem":"${mem}","disk":"${disk}"

}

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

40

flavor-create/tasks/main.yaml

- name: parse flavor name to machine spec

flavor2spec:

flavor: '{{flavor_name}}'

register: spec

- name: check flavor name

shell: |

nova flavor-list |grep {{flavor-name}}

register: result

failed_when: result not in [0, 1]

- name: create flavor

shell: |

nova flavor-create "{{flavor_name}}" auto ¥

{{spec.mem}} {{spec.disk}} {{spec.vcpu}}

when: result.rc == 1

- name: set extra_spec to flavor

shell: |

nova flavor-key "{{flavor_name}}" set ¥

"{{item.key}}"="{{item.value}}"

with_dict: "{{vars[cluster_name]}}"

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

41

flavor-create/tasks/main.yaml

- name: parse flavor name to machine spec

flavor2spec:

flavor: '{{flavor_name}}'

register: spec

- name: check flavor name

shell: |

nova flavor-list |grep {{flavor-name}}

register: result

failed_when: result not in [0, 1]

- name: create flavor

shell: |

nova flavor-create "{{flavor_name}}" auto ¥

{{spec.mem}} {{spec.disk}} {{spec.vcpu}}

when: result.rc == 1

- name: set extra_spec to flavor

shell: |

nova flavor-key "{{flavor_name}}" set ¥

"{{item.key}}"="{{item.value}}"

with_dict: "{{vars[cluster_name]}}"

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

活用例

42

Flavor-create/vars/main.yaml

cluster1:

'quota:disk_write_bytes_sec': 1536000000

'quota:disk_read_bytes_sec': 1536000000

'quota:vif_outbound_average': 64000

'quota:vif_inbound_peak': 64000

'quota:vif_inbound_average': 64000

'quota:vif_outbound_peak': 64000

'drive_type': ssd

cluster2:

'quota:disk_write_bytes_sec': 153600000

'quota:disk_read_bytes_sec': 153600000

'quota:vif_outbound_average': 64000

'quota:vif_inbound_peak': 64000

'quota:vif_inbound_average': 64000

'quota:vif_outbound_peak': 64000

'drive_type': sas

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

確認項目が減少

43

自動化前確認項目(11項目) 自動化後確認項目(2項目)

フレーバー名 フレーバー名

vcpu クラスタ名

Memory

Disk

quota:disk_write_bytes_sec

quota:vif_outbound_average

quota:vif_inbound_peak

quota:vif_inbound_average

quota:disk_read_bytes_sec

quota:vif_outbound_peak

drive_type

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.44

運用手順も減少1. クラスタadminrcを読み込む

2. Clientをロードする

3. 手順書を元にコマンドを作成する

4. コマンドを実行する

5. 追加するextra_spec分コマンド実行する (7回)

計 11手順

1. フレーバー名とクラスタ名をjsonに書き込む

2. Playbookを実行する

計 2手順

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.45

運用手順も減少1. クラスタadminrcを読み込む

2. Clientをロードする

3. 手順書を元にコマンドを作成する

4. コマンドを実行する

5. 追加するextra_spec分コマンド実行する (7回)

計 11手順

1. フレーバー名とクラスタ名をjsonに書き込む

2. Playbookを実行する

計 2手順

脱オペミス完了!

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

自動化の懸念

46

• Playbookの信憑性は誰が担保する?• 冪等性の保たれたPlaybookを書く• ベテラン運用者に確認してもらう• 検証環境で試す

• 運用のための知識が身につかないのでは?• 運用の知識を伴わないとそもそもPlaybookが書けない• 空いたリソースで他の問題が解決できたらそれが一番

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

運用フロー

47

Push & PR

おねがい

Merge

Webhook

pullexecute

cluster

cluster

Playbook開発者

Playbook開発者

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

自動化の懸念

48

• Playbookの信憑性は誰が担保する?• 冪等性の保たれたPlaybookを書く• ベテラン運用者に確認してもらう• 検証環境で試す

• 運用のための知識が身につかないのでは?• 運用の知識を伴わないとそもそもPlaybookが書けない• Playbookを見れば、「正しいやり方」を身につけられる• 空いたリソースで他の問題が解決できたらそれが一番

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

まとめ

49

• 手動の運用はつらいよ

• 自動化すると改善できることがあるよ

• Ansibleなら、始めやすいしシンプルでおすすめだよ

• 自動化に振り回されないように気をつけよう

Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.

他の構成管理ツールとの比較

50

実装言語 設定言語 冪等性 モジュール言語 エージェント

Fabric Python Python ☓ python ☓

Capistrano Ruby DSL(Ruby) ☓ Ruby ☓

Chef Ruby DSL(Ruby) ○ Ruby ○

puppet Ruby 独自 ○ 独自 △

Ansible Python Yaml ○ なんでも ☓