by shigemk2

当面は技術的なことしか書かない

memo OpenStackをAnsibleで操る! #ansiblejp

  • 富士通 cloud service k5とリリース業務
  • Ansible Tips & Example
    • 適用版数を厳密に守る
    • 手順を間違えない
    • 適用対象を間違えない
    • 履歴を残す
  • まとめ

OpenStack

  • オープンソースのクラウド基盤ソフトウェア
    • 多数のサービスが組み合わさった分散構成

FUJITSU Cloud Service K5

  • 9リージョンで提供中
    • OpenStackがベース
    • リリース業務をこなす
  • リリース業務
    • LBを切り替えて、ローリングデプロイ
    • サービス全体を止めないでソフトウェアを更新
    • CLIを利用して、状態、正常性を確認しながら 手順書通りにやる

リリース業務の鉄則

  • 適用版数を厳密に守る
  • 手順を間違えない
  • 適用対象(リージョン)を間違えない
  • 作業履歴を残す

Before

  • 指差し確認
    • 行確認
    • ターミナルのログを流す
  • 作業内容(バッチ適用)
    • 60時間→1.5時間

Ansible Tips & Example

適用版数を厳密に守る

  • 版数の完全性を保証する
    • 更新するパッケージ群とそのバージョンは厳密に指定する
    • 予期しない事故を防ぐための適用版数厳守
    • 依存関係が多い
    • パッケージ版数の厳密管理
      • モジュールAをアップデート/モジュールDをインストールしようとしたのにモジュールEがインストールされている(駄目パターン)
      • 意図しないパッケージの混入を把握/対応する
      • インストール直後のパッケージ一覧を取得
      • それAnsible(set_factで出来るよ)
      • 差分をassertして差分があったら止める

手順を間違えない

  • 間違えたら駄目な手順書を作ってはいけない
    • NG: grep/awk/sedでパース(メンテ性悪すぎ)
    • JSONにして構造化データにして、json_queryフィルタで扱う
  • json_query
    • JSONのメンバやスライスを抽出
    • 構造体のリストから条件に合致するコウを抽出してリストとして出力(2.2)
      • チュートリアルでqueryがテストできる
      • jmespath http://jmespath.org/ で確認出来る
    • OpenStackのデータ抽出を完結に実現
    • keyとかvalueでマッチするやつを抽出
    • フィルタロジック
    • jmespathでいろいろ確認
    • さらなるデータ加工
      • map/reduceっぽいことも出来なくない
      • prettytable to dictくらいはいける
  • 可能な限りすべてJSONで出力する(OpenStack)
  • openstack cli prettytable出力
    • 人間には見やすい??(横に広がると見づらい)
    • Ansibleには見づらい
    • openstack with ansible.....
      • awkやsedを駆使したplaybookが紹介されている(めんどくさい)
    • ホストのvm一覧取得
      • JSONでなんとかしたい
  • XML出力
    • Libvirtや特定機器などさまざまな出力で使用
    • Ansibleでは扱いにくい
  • XMLからJSONへの変換フィルタを実装(converting between xml and json)

適用対象を間違えない/履歴を残す

  • Ansibleだけでは管理できないので他のサービスを使う
    • ジョブ/Playbookはバージョン管理 GHE
    • PlaybookはJenkinsのジョブで実行管理 Jenkins
      • LDAP連携で誰が実行したかも分かる
    • サーバー管理
      • foreman
      • dynamic inventory

作業の流れ

  • Git Playbookの版数管理
  • JenkinsからAnsibleを実行する

    • multi branch pipeline(2から)
    • clone/playbook実行/別playbook clone/別playbook実行
    • Jenkinsfile(groovy)で管理
  • 対象を間違えては意味がない

    • エクセルでサーバー管理してたらコピペミスが起きやすいし見間違いやすい
  • リージョン単位にインベントリ管理
    • 手動の管理はそもそも無理
  • Dynamic Inventory
    • 外部DBを使ってインベントリを管理する
    • コミュニティ版多数
      • openstack/ec2/foreman
      • https://www.theforeman.org/ OSSのダイナミックプロビジョニングツール
      • こっちじゃない!! https://github.com/ddollar/foreman
      • ホストグループを指定して、ホストグループ内のホスト全部に対してplaybookを実行する
      • 作業や結果をJenkinsで管理

まとめと今後

  • 複雑なOpenStackの運用にも、Ansibleは使える
    • 厳密な処理確認をplaybook
    • 出力データのJSON化
    • Foremanで適用対象の管理
    • Jenkinsで実行管理
  • 課題
    • コミュニティへの貢献
    • 作った人がいなくなっても持続できる運用