Ansibleの基本的な使い方

Tag:

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コマンドで詳細を確認できます。
ansible_howtouse
または、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 %}

スポンサーリンク