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

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

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

6-2 Ansibleの導入

この節では環境構築を自動化するために,Ansibleをインストールして利用を開始するところまでを解説しています。

書籍の中ではAnsibleのインストールは以下のようにpipコマンドを使用した手順を紹介しています。他にも,各種Linuxのパッケージ管理(apt,yum等)でもAnsibleはインストール可能で,依存ライブラリも合わせてインストールされるため,pipコマンドよりもこちらのほうがわかりやすいかもしれないとのことです。

pipでのAnsibleインストール

# pythonのヘッダが必要なため,python-devをインストール
$ sudo apt-get install python-dev
# Ansibleをインストール
$ sudo pip install ansible

書籍のコラムで『Ansible 2系ではPython 3系に対応予定です。』と書いてあります。ですが,もうすぐリリースされるAnsible 2は残念ながらPython 3対応していないそうです。Python 3対応の準備は継続して進められており,Pull Requestを受け入れているそうです。我こそはと思わん方はぜひ協力してみてください。

Ansibleで環境構築を行うためには,サーバへのアクセス情報をまとめたInventoryファイルと環境構築手順をまとめたPlaybookファイルの2種類のファイルが必要です。

Inventoryファイルは以下のようにホスト名が並んでおり[web][db]という2種類のグループがあるということを表しています。このように記述することにより,webグループ全体に同じ手順で環境構築を行うといったことが可能になります。

Inventoryファイルの例

mail.example.com

[web]
webn01.example.com
web02.example.com
web03.example.com

[db]
db01.example.com

Playbookファイルには以下のようにYAML形式で環境構築手順を記述します。このPlaybookの例ではwebグループの全サーバに対してappuserユーザの作成,/var/log/appディレクトリの作成とnginx,mysql-clientのインストールを行います。

Playbookの例

- hosts: web # 対象サーバを指定。今回はwebグループ
  sudo: yes # sudoを行う
  vars: # 変数指定
    logdir: /var/log/app
  tasks: # 実行するtaskの指定を開始
    - name: 実行用ユーザの作成 # taskの名前
      user: name=appuser
    - name: ログディレクトリの作成
      file: path="" state=directory
    - name: 依存ライブラリのインストール
      apt: name="" state=installed
      with_items:
        - nginx
        - mysql-client

Playbookについては以下の様な説明がありました。

  • tasks の中に環境構築のタスクを入れる
  • YAMLの中にJinja2のテンプレート{{ }}形式)で変数が入れられる
  • Playbookは基本的にタスクを積み重ねることによって環境を構築する
  • 各タスクには名前nameを日本語で書けるので,日本語で書くのがお勧め
  • なお,執筆時点ではまだ確定ではなかったが,今ではsudo,suという設定はbecomeに統一された

Playbookについて解説中

Playbookについて解説中

上記2つのファイルを用意したらansible-playbookコマンドで環境構築を行います。書籍では実行例が白黒となっていますが,実際にはchanged(環境構築が実行されたタスク)の部分は黄色で,ok(環境構築がすでに行われているタスク)の部分は緑色で表示されるそうです。Ansibleでは同じPlaybookを何度同じサーバに対して実行しても,環境が同じ状態になります。2回ユーザを作成したりインストールしたりはしません。このような特徴をべき等性と呼び,環境構築では非常に重要な概念となります。

Ansibleを使用して実際に環境構築を行う場合は,少しずつPlaybookにタスクなどを継ぎ足しながら実行するそうです。べき等性があるため,何度繰り返しても一度実行したタスクが無駄に実行されることはありません。

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

Q:Playbookにハイフン-が入っていたり,入っていない項目があるがこれは何か?

A:これはYAMLのフォーマットのため。ハイフンがリスト(list)を表し,コロン:で区切っているものが辞書(dict)を表している

Q:nameに日本語を書いているが文字コードはなにか?

A:文字コードはutf-8しか使えない。以前はnameに日本語は使えなかったがPull Requestを送ってutf-8が通るようになった。Ansibleはほとんどの個所はutf-8が通るようになっている。

著者プロフィール

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

一般社団法人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