Ansibleの基本的な使い方

ansibleの実行方法、インベントリファイルやPlaybookの書き方、ベストプラクティスについて取り上げます。

実行方法

1つのモジュールを実行

ansibleコマンド でモジュールを指定して実行します。

ansible 192.168.33.11 -m ping

192.168.33.11サーバーに対して pingモジュール を実行しています。

ansibleコマンドの主なオプション

オプション 概要
-i INVENTORY インベントリファイルのパスを指定。デフォルトは /etc/ansible/hosts
--help ansibleコマンドのヘルプを表示
-m MODULE_NAME モジュールを指定

モジュールについては、ansible-docコマンド で詳細を確認できます。
483-tool-ansible_howtouse.png

または、 https://docs.ansible.com/ansible/modules_by_category.html で確認します。

複数モジュールを実行

Playbookに複数のモジュールを記述して ansible-playbookコマンド で実行します。

ansible-playbook playbook.yml

主なオプションです。

# -iでインベントリファイルを指定
# -uでSSH接続するリモートユーザー名を指定
# -tで指定したタグが付けられたタスクのみを実行
# --private-keyでSSHの秘密鍵を指定
# SSHは公開鍵認証でも、一般ユーザーがsudoを実行するには-k(--ask-pass)オプションもつける
ansible-playbook -i hosts playbook.yml -u wkuser -t mysql-after --private-key=~/.ssh/id_rsa -k

Playbookをデバックする方法です。

# 構文チェック
ansible-playbook playbook.yml --syntax-check
 
# 処理対象task一覧チェック
ansible-playbook playbook.yml --list-tasks
 
# 処理対象ホスト一覧チェック
ansible-playbook playbook.yml --list-hosts
# ステップ実行
ansible-playbook playbook.yml --step
 
# 実行内容詳細表示(-v or -vvv)
ansible-playbook playbook.yml -v

イベントリファイルの書き方

操作対象のサーバー情報を記述します。イベントリファイルに記述されたサーバーのみ操作することができます。

ansibleコマンド ansible-playbookコマンド の「-iオプション」でイベントリファイルを指定することができます。指定しなかった場合 /etc/ansible/hosts が利用されます。

以下、記述例です。

[web]
192.168.33.11
192.168.33.12:40022
aws_web
 
[db]
aws_db

webグループとdbグループを定義しています。

Playbookの書き方

Playbookは、YAML形式でタスクを記述するファイルです。

以下、記述例です。

---
- hosts: all
  become: true
  tasks:
    - name: ローカルのファイルをリモートにコピー
      copy: 
        src={{ playbook_dir }}/tmp/test.txt
        dest=/tmp
        owner=root
        group=root
        mode=0700
      tags: upload
 
    - name: Apacheをインストール
      yum: name=httpd state=latest
  • 1行目
    • YAMLファイルであることを宣言。
  • 2行目
    • 対象サーバーを指定。
    • allの場合、インベントリファイル内の全てのサーバーが対象となる。
    • グループ名、ホスト名での指定も可能。
  • 3行目
    • sudo権限を指定。
  • 4行目以降
    • タスクを指定。
    • このPlaybookでは、copyモジュールとyumモジュールが実行される。

YAMLファイル上でコメントを記述するには、 # を利用します。

ベストプラクティス

http://docs.ansible.com/ansible/playbooks_best_practices.html でAnsibleの実践的な使い方について紹介されています。

ベストプラクティスでは、Playbookの再利用性を高めるために、ロールによる分割を行っています。

以下は、ベストプラクティスを参考にしたディレクトリ構造例です。

production                # 商用環境用のインベントリファイル
staging                   # 開発環境用のインベントリファイル
 
group_vars/               # グループに対する変数
   all.yml
   group1.yml             
   group2.yml             
host_vars/                # ホストに対する変数
   hostname1              
   hostname2              
 
site.yml                  # webservers.ymlとdbservers.ymlをインクルード
webservers.yml            # 必要なRoleを指定して実行
dbservers.yml             # 必要なRoleを指定して実行
 
ansible.cfg               # 設定ファイル
 
roles/
    common/               #
        tasks/            # タスク用
            main.yml      #
        handlers/         # ハンドラ用
            main.yml      #
        templates/        # テンプレートファイル
            ntp.conf.j2   #
        files/            # 転送するファイル
            bar.txt       #
            foo.sh        #
        defaults/         # デフォルト変数(最も優先度が低い)
            main.yml      #
 
    nginx/                
    mysql/ 

ansible.cfg

ansibleの設定ファイルです。以下の順でansible.cfgが探されます。

1. カレントディレクトリ
2. 環境変数の ANSIBLE_CONFIG or ~/ansible.cfg
3. /etc/ansible/ansible.cfg

テンプレートファイル

テンプレートエンジンとしてJinja2が使われます。変数には{{ }}が使われ、制御文には{% %}が使われるようです。

部分的に無効にするには以下のようにします。

{% raw %}
;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
{% endraw %}