『Pythonエンジニア養成読本』読書会便り ~基礎やTipsから質疑応答の内容まで~

第5回 環境構築の自動化,活躍の場が広がるPython

この記事を読むのに必要な時間:およそ 7 分

6-3 少し高度な使い方

この節ではPlaybookで複雑な動作を記述するための機能について解説しています。

with_items

with_items はシンプルなループ処理を行います。以下のPlaybookは複数のディレクトリを作成します。

with_itemsの例

tasks:
- name: /opt/foo以下にbin, conf, logディレクトリ作成
  file: path=/opt/foo/ state=directory
  with_items:
    - bin
    - conf
    - log

条件分岐などを含んだ複雑なループをPlaybook上で実現したい場合は,PluginをPythonで書く必要があるそうで す。

Pluginの書き方は「入門Ansible」に書いてあるよ!! という宣伝がここで入りました。

when

whenは条件分岐を行います。以下のPlaybookはサーバの役割によってインストールするアプリケーションを切り替えています。

whenの例

tasks:
  - name: 役割がwebだったらnginxを入れる
    apt: name=nginx state=present
    when: server == "web"
  - name: 役割がdbだったらmysql-clientを入れる
    apt: name=mysql-client state=present
    when: server == "db"

Ansibleを実行すると,対象のサーバに入ってさまざまな情報を収集します。OSのディストリビューションとバージョン,カーネルのバージョン,IPアドレスなど多岐にわたります。この情報をそのまま条件分岐に利用できるため,⁠CentOS 6ならこれを実行する」といった書き方も可能とのことです。

roles

rolesは大事な機能で,うまく使いこなせるとAnsibleが上手に使えるとのことです。しかし書籍ではページの都合もありあまり触れていません。書籍ではAnsible Galaxyというroleの共有サービスから取得したroleを使用しています。

以下のコードはroleを使用してサーバーにredisの環境を構築する例です。

ansible-galaxyでRedisのroleをインストール

$ mkdir -p roles # rolesというディレクトリを作成する
$ ansible-galaxy install DavidWittman.redis -p roles

roleの使用例

- hosts: web
  sudo: yes
  vars:
    - redis_bind: 127.0.0.1
  roles:
    - DavidWittman.redis

運用の現場でもAnsible Galaxyで適切なroleを探して使用しているそうです。対応しているplatformで絞られるため,だいたい使えるものは決まってくるそうです。また,良いroleがあったがLinuxのディストリビューションが異なる場合は,githubでforkして修正して使用したりしているそうです。

roleについて図を使って解説

roleについて図を使って解説

ここで書籍に載っていない機能についての紹介がありました

register

registerは,実行した結果を変数に保存します。実行結果によって次の処理を分岐させたりできます。

local_action

local_actionはAnsibleを実行している管理サーバ側でタスクを実行する機能です。Amazon EC2のインスタンスを立ち上げたりなど,管理サーバー側で行うべきタスクに使用します。

Ansibleではさまざまなクラウドの操作ができます。Cloud Modulesのページを見ると,Amazon以外にCloudstack,Google,Rackspaceなどのモジュールがあることがわかります。

AWSの環境構築をChefで行うにはCloudFormationOpsWorksを使用するのがAWS側の提案ですが,同様のことがAnsibleだけで実現できるとのことです。

ここでは以下の様な質疑応答がありました。

Q:AWS使う時の管理サーバはローカルでか,それともAWS上か?

A:どちらもありえる。関係者がログインできるAnsible実行ホストをAWS上に用意するというパターンもある

Q:roleの切り方や変数の置き方に悩まないか?

A:あまり悩まない。roleの切り方をミスると悩むと思う。roleはアプリとかミドルウェアごとに作り,roleの中だけで完結するようにする。role dependency(依存関係)は使っておらず,使わない方が良い。AロールはBロールに依存しているという風に書け,勝手に実行されるのは便利だが,なにが実行されているか見えなくなるのであまりおすすめしない。Ansibleはタスクの実行順序を指定できる(上から順番に実行される)ので,自分で明示して実行する方が良い

Q:開発環境,ステージング環境など環境ごとの切り替えはどのようにしているか?

A:変数で切り替えるのが良い。条件付き実行を使用してproductionなら本番環境用の変数を読み込むという指定をする。modeでproduction/stagingを切り替えている

Q:クラウド用のコマンドを抽象化したようなものはないか?

A:今のところはない。それぞれのクラウドサービスが提供する機能が違うため。共通化すると設定できることが少なくなりそう。余談だが,Ansibleではインストールはyum,aptとディストリビューションごとに分かれている。packageに統一してはどうか? という話も出ているが,現状は統一されていない。インストールするパッケージ名もapache2,httpd2のように異なるため分かれているほうが無難だと考えている

著者プロフィール

鈴木たかのり(すずきたかのり)

一般社団法人PyCon JP,副代表理事,株式会社ビープラウド所属。

部内のサイトを作るためにZope/Ploneと出会い,その後必要にかられてPythonを使い始める。PyCon JPでは2011年1月のPyCon mini JPからスタッフとして活動し,2014年-2016年のPyCon JP座長。他の主な活動は,Pythonボルダリング部(#kabepy)部長,Python mini Hack-a-thon(#pyhack)主催など。

共著書に『Pythonによるあたらしいデータ分析の教科書(2018 翔泳社刊)』『Pythonプロフェッショナルプログラミング 第3版(2018 秀和システム刊)』『Pythonエンジニア ファーストブック(2017 技術評論社刊)』『いちばんやさしいPythonの教本(2017 インプレス刊)』などがある。

最近の楽しみはPython Boot Campの講師で訪れた土地で,現地のクラフトビールを飲むこと。2019年は世界各国のPyConでの発表に挑戦している。趣味は吹奏楽とボルダリングとレゴとペンシルパズル。

Facebook:takanory.net

Twitter:@takanory

Github:takanory