いまからはじめるAnsible 第2回 

3月 10日 @ 9:00 PM - 10:00 PM 講演者 : ひよこ大佐

資料

資料はこちらから 

前回のおさらい

  • Infrastructure as Codeとは
    • コードで柔軟にインフラを管理すること
    • Ansible/Chef/Terraform、Gitなどを使う
  • Ansible とは
    • OSSの構成管理ツール
    • YAML形式でPlaybookを定義している
      • 他の構成管理ツールと比べると設定内容がわりとわかりやすい
    • 冪等性(何回適用しても同じ結果を保つ)を保った変更ができる
    • Ansible Tower, AWX(OSS)ができたりして、実行権限設定とか、大きな組織向けに効力を発揮するオーケストレーションツールもあるので柔軟に対応できる。
    • 冪等性(何度実行しても同じ結果になる)が保った変更管理ができる
      • あくまでAnsible内での構成に関する冪等性を担保するだけなので、自分のプロダクトそのものについては自分で管理しないといけない点は注意
      • 例えば: yum update, Ansibleとしては「常に最新にする」でうごくけど、そのときどきで落ちてくるパッケージのバージョンは違ったりする。それでいいかどうかは作る側が考えないといけない。

便利な Playbook の書き方

  • 検索で山のようにサンプルが出てくる
  • vars (変数) をうまく活用する
    • 変数をひとつのplaybookで使うのは、小規模であればシンプルでわかりやすい。ただ、規模が大きくなるとそれだと上手く回らなくなってくる。playbook間で変数を共有するとかが必要に
    • group_vars,host_varsを使い分ける
      • サーバ「共通」の設定はgroup_vars
      • 「ホスト固有」の設定項目を記載するときはhost_vars
    • Code である以上、プログラミングでのベストプラクティスはansibleでもあてはまる。
  • with_itemsをうまく活用する
  • config ファイルは template を使いましょう
    • config の特定の部分を書き換えたい
    • default の config を replace (正規表現) とかを使って書き換えるというのを割とやりがち。
    • template module を使って、変数情報を埋め込む。if, for, filterなども使える。
    • jinja template の話とかを参考に。

Dynamic Inventory

  • 通常のインベントリ: ホスト名とかを手書きで定義。static inventory
    • AWSインスタンスとか、Auto scale するようなもの、動的に増えたり減ったりするものを手作業で管理しきれない。
  • Dynamic inventory: スクリプトを使用して外部から移動的にインベントリを生成

Dynamic Inventory のデモ

  • EC2用の dynamic inventory ec2.py: 中は python script. 外部から情報を得られる。
  • ec2.ini: どのリージョンで/どのサービスから取ってくるかなどの動作定義がはいっている。(いま regions = ALL にしないと情報取れないとか github issue があがってる)
  • cache_max_age: 実行結果のキャッシュ取得とか
  • IAM credentials は環境変数に置くことになっている。他にも渡し方はある。
  • ec2.py はただの python script なのでコマンド受け付けてくれたりする。./ec2.py --list とか。
    • ホストの情報とかいろろ。
    • 取れた情報を inventory として playbook を実行することができる。例: ansible -i ec2.py all -m ping インスタンス全部に対して ping を撃つ
  • dynamic inventory スクリプトは他にもいろいろある : ansible/contrib/inventory at devel · ansible/ansible 

さいごに

  • Ansible導入 :まずは小さな所からはじめよう
    • 無駄なタスクの自動化とか。小さく初めて、実績を作って、ゆくゆくは本番環境への導入へ。
  • なぜ自動化するのか? : IaCの考え方普及していくと「なんで自動化しないんだっけ?」に変わっていくはず。
    • そちらに発想を切り替えていく。
  • Ansible TowerとかAWXとかもある。全部をansibleでやるのではなく、周辺の便利なツールと組み合わせる。
  • 自動化を進めて、空いた時間でもっとクリエイティブなこと、やりたいことを。
    • 自動化を進める上での弊害もある。自動化による属人化など(YAML書ける人がいないとか)もあるので、そこは解決を考えないと行けない。
    • SIerとか、手作業が偉いみたいな風潮があったりする。自動化もするけど、プラスに捉えられないところなんかもある。工数で考えると自動化すると収入減る、みたいなのが原因か。でもやらないとインフラの大きな流れに取り残されていっちゃう恐れがある。Ansible以外にもTerraFormとかいろいろな便利ツールがあるので、導入を考えましょう。

聴取者の声

  • 自動化してないともう「弱み」の時代に
  • コンピュータに任せられることは任せたい
  • 自動化するとそのぶん別のことができる
  • 自動化を嫌うブラックSIの謎な風潮をなんとかしたい
    • 自動化すると工数減っちゃう、工数減るともらえるお金減っちゃうから、という風潮がある
    • かかる工数をそのまま請求したり、工数をあげる「実態」がおかしい。むしろ、自動化の価値として通常通り請求して、時間を減らしてその時間で他のことをしたらよいだけ
  • 自動化ってお金出す人から見えづらくなっちゃうところもありそうだけど、どうなんだろ
  • 自動化しても、メンテナンスにコストがかかるのは理解しておくべき
  • 「自動化していなければ対外の競争力を失う」と思う。視点を変えて考えないと。
  • バージョン管理システムが現場に浸透していないとansibleも浸透しないのかな?
    • バージョン管理とかのメリットをインフラにも持ち込もうぜ!ってノリがIaCだった気がしないでもないでもない
  • yaml なので取っかかりやすいのが良い点

質問

Q. Dynamic Inventoryは、AWS公式とかからwgetしてくる感じでしょうか?これって自作じゃないですよね・・・? ansibleの実行結果をリアルタイムで追っかけることは出来ますでしょうか?

  • 今回はgithubからもってきたもの。同梱のものもあるはず(使っていないので確証がないけどそういう記述はあった気がする)。
  • 全部コミュニティベースで作られてたはず
  • 自分で作ることも可能

Q. 運用を続けてくると「なにがつらみ」になりますか?

  • 良く聞くのは、yaml 書ける人が属人化してその人しか書けないみたいなの。
  • ansible の枠外での変更を最小限にしないといけない。バージョンコントロールとかの考え方が浸透していないと導入しても上手く使いこなせなくて、結局マクロっぽい使い方になったり。
  • そのものの書き方云々と言うよりは、組織としての考え方が共有できていないとツライ。
  • 後発のツールなので、バージョン変わると書き方が変わったり、一気にモジュールが増えたりとか
  • いま使っている構成管理ツール(chef etc)とかになるとちょっと大変そう。

Q. (Ansibleの話じゃなくなりますが)プロビジョニング後の「確認」って、何でやる感じになりますか?(手動、自動問わず

  • プロビジョニング後のテスト、serverspecとか。一番いいのは ansible だけでやって、ansible deploy が成功していれば問題ないという状況
  • そもそも冪等だからテスト通過していれば良いというのはあるかもだけど、今の状況としてはデプロイ後に手でサービス確認とか。そこまで自動化しているところもあるだろうけど。
  • serverspecとか複数つかうと、ansible 構成変えた後にserverspec側とかを変えないといけないことが。二重管理になって齟齬が生まれたり。面倒なことが起きうる。
  • 正しい結果じゃなかったら誰の責任なのか、とかは、こうした自動化の話の中ではありがち。

Q. ダイナミックインベントリは、EC2のインスタンスが自動で増えたとき そのタイミングをどうやって捕まえているのでしょうか?

  • たたくたびに聴きに行っているはず。増えたら勝手にと言うよりは、実行したときにapi経由でききに行っている。

マクロとかもそうだけど、書いた人が全部責任負わないと行けないみたいな風潮になることが。そうなると書いた人が忙殺されてしまう。

Q. お客様のなかでansibleで幸せになった方はいらっしゃいませんか?!

  • 2日でテストが終わったという事例がある。
  • 工数の話もあるので必ずしも幸せかどうかはさておき。

Q. 失敗時ロールバック?

  • IaC的には、失敗したら消してやり直す・作り直すという考え方だろう
  • イミュータブル・インフラストラクチャな考え方

Q. WindowsだとWinRMでやるんでしたっけ

  • はい、WinRM でやります
  • Windows Server も管理できます
  • 実行許可が要るのと、別途パッケージ入れないと行けなかったはず
  • UserData で WinRM 有効化は結構かんたんです
<script> winrm quickconfig -q winrm set winrm/config/winrs @{MaxMemoryPerShellMB="300"} winrm set winrm/config @{MaxTimeoutms="1800000"} winrm set winrm/config/service @{AllowUnencrypted="true"} winrm set winrm/config/service/auth @{Basic="true"} netsh advfirewall firewall add rule name="WinRM in" protocol=TCP dir=in profile=any localport=5985 remoteip=any localip=any action=allow </script>

Q. Ansibleでスイッチとかも管理できるってみたような。。

  • Cisco, Juniper, Junos等使えたはず
  • 金魚の人(akira6592)が詳しい
  • EdgeRouter対応したのは衝撃だった

Q.Ansibleと連携できるもの、の「主たるもの」ってどんな種類がありますか?

  • Linuxサーバとかは代替
  • 最近はネットワーク機器の話が

Q. Tower/AWX

  • ジョブ定義とかグラフィカルに定義できる

Q. Ansibleを「呼ぶ方」って、なんかありますか?

  • StackStorm
  • Jenkins
  • spinnaker

次回リクエスト

  • Ansible Tower
  • 月1回くらいのペースで? (月刊ひよこくらぶ)
  • Ansible のモジュールを作る