くろねこ日記

ソフトウェアに関する技術メモが多いです.

サーバ管理ツールAnsibleを使ってみた

はじめに

raspberrypi上でansibleを試してみました.

実際に試してみたときの設定手順などをメモしておきます.

ansibleとは

Pythonで作られたサーバ構成管理ツールです.他にはRubyで作られたchefが有名です.

このツールの目的はサーバの管理を自動化するところにあります.サーバを管理するときにシェルスクリプトにサーバ設定を記述して実行したという経験をお持ちの方がいらっしゃるかもしれません.またはマニュアルに必要な設定を書いて読みながら設定された方もいらっしゃると思います.ansibleはそれらの内容を自動で行なってくれるものです.

でも,自動で行なうだけではシェルスクリプトを走らせるのと違いがありませんね. シェルスクリプトで管理するのとは決定的に違う良さとしてこれらのツールのには羃等性というのがサポートされています. 羃等性とは何回実行しても一つの結果に収束する性質のことらしいです. 例えばシェルスクリプトを2回実行すると2回分処理をすることになりますが,ansibleでは一度行なった処理を行いません.

さらにシェルスクリプトのようにわざわざマシンにscpで設定のシェルスクリプトファイルを転送してsshでログインして実行ということをしなくてもansibleは自動でsshを利用してセットアップをしてくれます.もちろん複数のサーバに対しても同時に行なうことができて,ansibleで複数台のマシンに同じ内容を実行させるということが可能です.

ansibleはpythonで書かれておりますが,chefのようにrubyを使うということもなく,yamlさえ記述できればすぐに扱えるというのも特徴の一つです.

対象マシンの情報と行なう内容

今回の対象マシンは次のようになっています.

  • マシンはローカルホスト上で繋ったマシンを想定します(SSHでアクセス可能).

  • ユーザ名はpiという名前です

  • パスワードはかけています

実施内容は次のようになっています.

  • Aptを使ってpython3とgitをインストール
  • python3のpipを使って以下のライブラリをインストール(あくまでも例です)
    • pyserial
    • numpy
    • flask

ここまでを行ないます.

Ansibleのセットアップ

ansibleはpython2のpipからインストールができます.

pip install ansible

python3ではansibleは動作しないので注意してください.

次にセットアップ対象マシンのIPアドレスを設定します. ホームディレクトリ上にansible_hostsというファイルを次のように設置します.

touch ~/ansible_hosts

今はansible_hostsというファイル名にしましたが別なファイル名でも可能です. 特に当たり障りがなければこのファイル名で問題ないでしょう. ansible_hostsのなかに対象マシンのIPアドレスを設定します.

[raspi]
192.168.1.3

IPアドレス(192.168.1.3)は今回はローカルホストのものを指定しましたが,各自で値を入れてください. [raspi]と書いたのはansibleで自動実行するときにマシンを選ぶときの識別に使います.ansibleは複数のマシンに対してセットアップを行なえるので,このように任意の名前で管理ができます.名前のつけかたはさまざまあるようですが,ここではシンプルに対象マシンの名前だけをつけておきます.

つぎに設置したファイルの場所をbashrcやzshrcなどのシェル設定ファイルに書き込みます.

このようにexportを追加すれば良いです.ここではzshrcに書き込むものとします

echo 'export ANSIBLE_HOSTS=~/ansible_hosts' >> ~/.zshrc

これだけです.あとは忘れないようにシェルを再度読み込んでください.

対象マシンのセットアップファイル作成

セットアップファイルはyaml形式で書くことができます. yamlの書き方は

Rubyist Magazine - プログラマーのための YAML 入門 (初級編)

このあたりが詳しいと思います.

ここでは例として書き上げたyamlファイルにそって解説していきます.

今回の設定は再掲すると

  • Aptでpython3とgitをインストール
  • pip3でライブラリのインストール

ですね.

yamlで書くとこのようになります

- hosts: raspi
  user: pi
  sudo: yes
  vars:
    pippackages:
      - pyserial
      - numpy
      - flask
  tasks:
  - name: Apt
    apt: name=python3 state=installed
    apt: name=python3-pip state=installed
    apt: name=git state=installed
  - name: pip install
    pip: name={{ item }} executable=pip-3.2
    with_items: pippackages

順に解説すると先頭にあるhostsというのは~/ansible_hostsで設定したときの名前を指定してます.

yamlでは

- hosts: 値

のように書きます.

次にvarsとtasksと呼ばれる部分がありそれぞれ入れ子として記述してます.

varsとtasksの関係を説明すると,varsはセットアップファイルで実行するときに使う変数を記述する部分です.ここで変数という形で設定などを記しておくことができます.tasksでは実際にサーバ上でどのような操作をするのかを記述する部分です.ですので,varsはtasks上で使用される変数となります.

varsは

  vars:
    pippackages:
      - pyserial
      - numpy
      - flask

と,varsの入れ子としてpippackagesというのがありますね.これは僕が今回つけたpipで導入するライブラリ名を示す変数名です.今回はpyserialとnumpyとflaskをインストールするのでpippackagesに記述しておきました.

tasksは

  tasks:
  - name: Apt
    apt: name=python3 state=installed
    apt: name=python3-pip state=installed
    apt: name=git state=installed
  - name: pip install
    pip: name={{ item }} executable=pip-3.2
    with_items: pip packages

と,tasksの入れ子ではAptを使ってpython3とpip3,gitをインストールし,pipでvarsに記した変数を呼んでインストールしてます.

yamlの書き方として補足しておくと

- name: 実行内容の説明文
   実行内容
- name: 実行内容その2の説明文
   実行内容その2

となっており,「name: 」の後に書くものはコメントを記述し,その下に実行内容を記述してください. 先頭のnameでは「Apt」というコメントを書いておきました.そこでは「apt 」というansibleが用意したモジュールをつかってpython3とpip3,gitをインストールします.

なお,Ansibleではセットアップで使うことが多いモジュールが用意されておりそれらをつかって作業を行ないます.例えばAPTでインストールするときにはansibleが用意しているaptというモジュールを使うことでインストールできますし,pipでインストールするときにはansibleが用意しているpipというモジュールが使えます.もしdebian系ではなくredhat系ならyumをつかってパッケージをインストールしますからyumというモジュールを使えば良いでしょう.その他スクリプトを実行するscriptモジュールやgitを動かすgitモジュールなど非常にたくさんのコマンドが存在しております.

ansibleが用意しているモジュール情報は

Module Index — Ansible Documentation

で調べられたり,具体的な使い方の情報はansibleをインストールするときに付属してきたansible-docsというコマンドで参照できます.

もちろんscriptsやcommandに書くこともできますが,その場合羃等性が崩れる恐れがありますので極力ansible側で用意したモジュールを利用しましょう.

また,pipでインストールする箇所に「with_items: 」というののが見えますね.これはリストを一つ一つ取りだす便利な記法です.ansibleの設定を記述する上で便利な書き方がいくつか用意されておりまして,ここではその一つとして使ってみました.pippackagesに記述した「pyserial」や「numpy」,「flask」という文字列を順に取り出し{{ item }}というところに渡しています.波括弧でitemというのを囲うのはjinja2をつかったことのある方にとっては馴染みがあると思います.

実行

ここまでくればさきほどのyamlファイルのあるディレクトリの上で実行するだけです. 今回のyamlファイル名は「playbook.yml」としておきます. 対象マシンが設定通りのネットワークに繋がっている状況で,以下のコマンドを実行します.

ansible-playbook playbook.yml -v

このときsshにパスワードをかけているのでしたら次のようなオプションをつけてください. パスワードが聞かれるので打てばOKです.

ansible-playbook playbook.yml --ask-pass -v

これでさきほど設定したaptでのインストールやpipをつかったライブラリのインストールが開始されます.

おわりに

今日紹介した内容は

Amazon.co.jp: 入門Ansible eBook: 若山史郎: Kindleストア

を参考にしました.

ここでは紹介していないansibleをつかう上で便利なモジュールが紹介されていたり,yamlを書く上で便利な書き方などが載っております.ansibleは日本語情報が少ないのでこういう書籍は貴重ですね.僕はansibleを使うときにこの本を片手に書くことが多いです.