自作モジュール

Ansible には 200 以上のライブラリが用意されていますが、 用途に合わせて自分でモジュールを作成することも可能です。

また、自作モジュールはどんなスクリプト言語で実装されても構いません。 bash でも python でも ruby でも、好きな言語で実装することができます。

http://docs.ansible.com/ansible/developing_modules.html

自作モジュールの配置先

自作モジュールは以下のパスに配置する必要があります。

  • 実行したディレクトリ直下にある library ディレクトリ
  • ansible.cfg の library に記載したパス
  • 環境変数 ANSIBLE_LIBRARY
  • ansible-playbook 実行時に指定した --module-path (--M) のパス
  • role 内の library ディレクトリ

自作モジュールを作成してみる

今回は、指定したファイルのバックアップファイルを一度だけ作るモジュールを作成してみましょう。

まず、/ansible-tutorial/library ディレクトリを作成します。

[vagrant]$ mkdir library

次に library/backup ファイルを作成し、以下の内容をペーストします。 今回は python で記述しています。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re
import shutil

def main():
    # 引数を取得する
    module = AnsibleModule(
        argument_spec = dict(
            src = dict(required=True)
        )
    )

    src = os.path.expanduser(module.params['src'])
    dest = src + '.bak'

    # 自作モジュールでも冪等性を保つよう、changed を管理する
    changed = False

    # バックアップファイルが存在しない場合のみコピー
    if not os.path.exists(dest):
        shutil.copyfile(src, dest)
        changed = True

    module.exit_json(dest = dest, src = src, changed = changed)

# import module snippets
from ansible.module_utils.basic import *
main()

自作モジュールを使用してみる

playbook.yml で backup モジュールを使用するよう修正します。

- hosts: all
  remote_user: ec2-user
  become: yes
  gather_facts: no
  tasks:
    - backup: src=/etc/hosts
  # roles:
  #   - nginx

次に backup に実行権限を付与します。

[vagrant]$ chmod +x library/backup

playbook を実行してみましょう。 2回目の実行では changed ではなく ok となることを確認してください。 また実際にサーバーにログインし、/etc/hosts.bak が作成されていることも確認してください。

[vagrant]$ ansible-playbook nginx.yml

PLAY ***************************************************************************

TASK [backup] ******************************************************************
changed: [xx.xx.xx.xx]

PLAY RECAP *********************************************************************
xx.xx.xx.xx                : ok=1    changed=1    unreachable=0    failed=0

results matching ""

    No results matching ""