Ansibleを使ってみた。

K-junです。 一週間に1記事描こうと決めたのに卒論のせいで全然進まないです。 辛いです。週末に珍しく時間ができたので、パパッとまとめて書いてみます。

Ansibleとは...?

こちらビデオが13分程度でまとまっていて分かりやすいです。

What is Ansible? | Ansible Quick Start Video

日本語でのチュートリアルもあるみたいですね。記述が多少古いようなので要注意です。

Ansible チュートリアル | Ansible Tutorial in Japanese

インストールはpipが推奨されているようでした。

pip install ansible

基本的にAnsibleは自動化ツールのよう。学習コストが低いながらもしっかりとした機能を備え、実行環境を選ばないとのこと。 何度も同じ処理を異なる環境に対して行う場合や、セットアップなどには使えそうですね。 あとはコードベースでタスクが記述できるので、変更などの際に非常に管理がしやすいことですね。IaCみたいな。 まあ、実際に試してみるのが一番早いですね 笑

今回は本当に基礎的なものだけをまとめてみます。 登場人物はたったの二つだけ。 対象となるサーバーを記述するInventoryと、対象サーバーにどこような処理を実行するかを記述するPlaybookです。 今回はどちらもYaml形式で記述していきます。

Inventory

Inventoryファイルには接続情報を自由に記述できる他、接続対象のサーバーをグループごとにわけ分割して管理することもできます。 今回は対象サーバーとしてAWSに構築したubuntu: 18.04を用います。 グループ分けなどの書き方は公式Docsにつらつらと書いてあります。

# inventory.yml
all:
  hosts:
    [YOUR_IP_ADDRESS1]:
    [YOUR_IP_ADDRESS2]:
  vars:
    ansible_connection: ssh
    ansible_user: ubuntu
    ansible_ssh_private_key_file: "~/.ssh/YourKeyPath.pem" 

具体的な処理はplaybook.ymlに記述していきますが、まずは疎通確認を行ってみましょう。

ansible all -i inventory.yml -m ping

成功した場合には以下のような出力となります。各サーバーごとの出力が確認できます。

[YOUR_IP_ADDRESS1] | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
[YOUR_IP_ADDRESS2] | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

これでInventoryの準備が整いました。

PlayBook

次にplaybook.ymlを記述していきます。 今回はnginxをinstallして起動するところまでですね。

- hosts: all
  remote_user: root
  become: yes
  become_method: sudo
  tasks:
    - name: "upgrade apt packages"
      apt:
        upgrade: yes
    - name: "install nginx though apt" 
      apt:
        name: nginx
        state: latest
        update_cache: yes
    - name: "start nginx though servicectl and enable it"
      service:
        name: nginx
        enabled: yes

記述しているものはどのグループを対象とするか、どのようなタスクを実行するかの二つです。 独特なものとしてそれぞれのタスクに対してコマンド形式で指定するのではなく、状態を指定していきます。 今回の場合にはlatestがこれに該当します。 stateとして取れる値はタスクの種類ごとに異なるので別途参照していただきたいのですが、 タスクの実行の結果このStateの状態になったらOkという処理のようですね。冪等性を確保している感じでしょうか。

ではでは、実行していきます。

ansible-playbook playbook.yml -i inventory.yml

出力は以下のようになります。

PLAY [all] *****************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************
ok: [YOUR_IP_ADDRESS1]
ok: [YOUR_IP_ADDRESS2]

TASK [upgrade apt packages] ************************************************************************************************************
[WARNING]: The value True (type bool) in a string field was converted to 'True' (type string). If this does not look like what you
expect, quote the entire value to ensure it does not change.

ok: [YOUR_IP_ADDRESS2]
ok: [YOUR_IP_ADDRESS1]

TASK [install nginx though apt] ********************************************************************************************************
changed: [YOUR_IP_ADDRESS1]
changed: [YOUR_IP_ADDRESS2]

TASK [start nginx though servicectl and enable it] *************************************************************************************
ok: [YOUR_IP_ADDRESS2]
ok: [YOUR_IP_ADDRESS1]

PLAY RECAP *****************************************************************************************************************************
YOUR_IP_ADDRESS2              : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
YOUR_IP_ADDRESS1             : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

これにて完了です。AWS側でポートを開ける必要はありますが、サーバーにアクセスするとnginxが起動しているのが分かります。

感想

Hostを入れ替えるだけで同一の処理を何度も実行できるので、 結構いい感じですね。秘伝のタレとか作るときに便利そうです。 これでISUCONのセットアップとかいい感じにできないか挑戦してみます。 何より、今は卒論がめんどくさい。