Ansibleの使い方 — SSHでホストに接続する Hello world !

2019.10.19 (土)

Ansibleをまだ使ったことがない人が基本的な使い方ができるようになるまで解説します。

SSHでホストに接続できるようにしておく

Ansibleの実行ユーザーとSSHの実行ユーザーを同じにしておくことを前提に、対象hostにSSHで接続できるようにしておきます。いつものように.ssh/configに接続情報を書いておきます。その接続情報をAnsibleで使うことになります。
接続先のホスト情報はインベントリ(在庫リスト)と呼ばれていますが、これは、Ansibleが複数のhostに対して実行できるため、こういった呼び名になっています。Ansibleが各hostへ接続するためには常にこのインベントリを使います。
対象ホストが複数台あるときは複数のHost情報をconfigに設定しておいてください。

# ~/.ssh/config

Host ansible.example.com
HostName ansible.example.com
User myansible
Port 22
IdentityFile /SSHKEY/

とりあえず動かしてみる

とりあえず動かしてみることが大切です。大まかな動きとして、1.inventoryでホストへ接続 2.モジュールを使ってタスクの設定 3.ansible-play-bookで実行、というような流れになります。モジュールはあらかじめ必要なものは揃っているので特に自作する必要なし。よく使うのは、file,copy,template,service,lineinfile,yum。これだけあれば十分。playbookはymlで設定して実行するAnsibleの中核機能です。
こんな構成でディレクトリとファイルを作成しておきます。おそらくこれが最もミニマムなかたちになると思います。

./ansible-sample/
├── inventory
│   └── hosts
└── main.yml

Ansibleの実行環境はansible-sampleになります。

$ cd ansible-sample
$ ansible --version
ansible 2.8.5

これで、実行環境は整っていることがわかりました。

1. inventoryファイルの設定

inventory/hostsに、以下のように書きます。

; target server machine
[targets]
ansible.example.com

;はコメントアウトです。#も使えます。[targets]は中括弧を使えば中の文言は何でもよいです。ホストマシーンのリストを作成するような感じで名前をつければよいです。今回はSampleなので一個だけホストを指定しておきます。
確認コマンドは以下のような感じです。

$ ansible all -i inventory/hosts -m ping
ansible.example.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

SUCCESSが返ってきたらホストにAnsibleで接続ができたということになります。

playbookの作成

プレイブックの作成ではサーバー上で実行するコマンド(タスク)を設定ます。以下の例では、”Hello world”を出力します。(実際は何もしません。)

- hosts: targets
  remote_user: myansible
  become: yes
  become_user: root
  become_method: sudo
  tasks:
    - name: output message.
      debug: msg="Hello world."

実行してみます。

$ ansible-playbook -i inventory/hosts main.yml

結果として、

TASK [output message.] *******
ok: [main.nowhite.site] => {
    "msg": "Hello world."
}

こんな感じのリターンがあればOKです。
さていくつかのコマンドを実行してみます。実際SSHでコマンド送信しればいいんじゃないかということを考えますがAnsibleの特徴は冪等性というやつですかね。同じ状態のものに同じコマンドを実行しても何もしない(元の状態が保たれる)というやつです。(しかしAnsibleの冪等性は結構中途半端です。うっかりやられる場合があります。)

シェルコマンドの実行

次にコマンドを実行してみます。lsコマンドの結果を返す単純なものです。

- hosts: targets
  remote_user: aonuma.mori
  become: yes
  become_user: root
  become_method: sudo
  tasks:
  - command: ls -al /etc/cron.daily/
    register: ls_result
    changed_when: False
  - debug: var=ls_result.stdout_lines # stdout => stdout_lines
    when: ls_result | success

実行するとjsonみたいな形式で、ディレクトリの一覧が取得できます。

ok: [main.nowhite.site] => {
    "ls_result.stdout_lines": [
        "合計 24",
        "drwxr-xr-x.  2 root root   65 10月  2 09:12 .",
        "drwxr-xr-x. 76 root root 8192 10月 10 01:17 ..",
        "-rwxr-xr-x.  1 root root  332  8月  8 20:57 0yum-daily.cron",
        "-rwx------.  1 root root  219 10月 31  2018 logrotate",
        "-rwxr-xr-x.  1 root root  618 10月 30  2018 man-db.cron"
    ]
}

こんなような感じで実行してゆきます。