Contenu connexe Similaire à Deep Dive into Modules (20) Plus de Hideki Saito (20) Deep Dive into Modules2. whoami
齊藤 秀喜(さいとう ひでき) / TwitterID: @saito_hideki
日本OpenStackユーザ会
株式会社インターネットイニシアティブ
著書
OpenStackクラウドインテグレーション
ISBN: 9784798141251
2
8. Ansibleとは
★ 何をしてくれるのか?
• システムの構成管理を比較的容易に実現できる
• システムの設定やテストなどのオペレーションを自動化できる
★ 利点
• エージェントレス
• 操作対象ノードの増減など環境変化にも柔軟に対応可能
• シンプルな構成ゆえに拡張性が高い
• デフォルトで多くの操作モジュールが付属している(BATTERIES INCLUDED)
• AWSやOpenStackなどのクラウド基盤管理システムとの親和性が高い
• ドキュメントが充実している
★ 欠点
• リリース頻度が高く落ち着かない
• Windows対応が弱い
• スケールさせるには工夫が必要
8
12. 実行に必要な要素は3つ
1. ansibleコマンド
2. インベントリファイル
3. モジュール
[書式]
ansible <ホストパターン> -i <インベントリファイル> -m <モジュール>
[実行例]
$ ansible web -i ansible_hosts -m setup
$ ansible 192.168.0.1 -i ansible_hosts -m hostname -a name=hogehoge -u vagrant -k -s
12
14. 対象ノードの情報を収集する
[例] 対象ホストの情報を収集する
$ ansible localhost -i ansible_hosts -m setup
127.0.0.1 | success >> {
"ansible_facts": {
"ansible_all_ipv4_addresses": [ …(中略)… ],
"ansible_all_ipv6_addresses": [ …(中略)… ],
"ansible_architecture": “x86_64",
…(中略)…
},
"module_setup": true
},
"changed": false
}
収集したホストの情報は、ansible_*変数に代入される。
Playbookでは、この変数を他のモジュールから再利用可能。
14
15. 対象ノードを操作する
[例] ホスト名を変更(web00->foo)する
$ ansible web00 -i ansible_hosts -m hostname
-a name=foo -u vagrant -k -s
SSH password: ********
web00 | success >> {
"changed": true,
"name": "foo"
}
ホスト名が変更された場合はtrue
変更されなかった場合はfalse
現在のホスト名は”foo”
どのような実行結果を返すのかは、モジュール
の作り方しだい。
15
24. 引数はどうなるの?
$ ansible 192.168.0.1 -i ansible_hosts -M . -m timetest2
-a time=072411352015.45 -u saitou -k -K -s
SSH password: ********
SUDO password[defaults to SSH password]: ********
192.168.0.1 | success >> {
"changed": true,
"time": "2015-07-24 11:35:45.001731"
}
モジュールの引数は、実行可能プログラムと同じディレクトリにあ
るargumentsファイルに文字列として格納されます。
$ cd ~/.ansible/tmp/ansible-tmp-1437705347.69-147453231832727
$ ls
arguments timetest2
$ cat arguments
time=072411352015.45
24
27. pingモジュールの
コードを読んでみる
import exceptions
def main():
module = AnsibleModule(
argument_spec = dict(
data=dict(required=False, default=None),
),
supports_check_mode = True
)
result = dict(ping='pong')
if module.params['data']:
if module.params['data'] == 'crash':
raise exceptions.Exception("boom")
result['ping'] = module.params['data']
module.exit_json(**result)
from ansible.module_utils.basic import *
main()
このあたりが
あきらかに怪しい
27
30. 標準モジュールに準拠させる(2/2)
#!/usr/bin/python
import datetime
DOCUMENTATION = '''
module: timetest
version_added: 1.9.2
short_description: Get date and time
description:
- Get date and time on target node
options: {}
author:
- "Hideki Saito"
'''
EXAMPLES = '''
# Get date and time
ansible target -m timetest
'''
def main():
module = AnsibleModule(argument_spec={})
date = dict(now=str(datetime.datetime.now()))
module.exit_json(**date)
from ansible.module_utils.basic import *
main()
本家にPull Requestするなら
このような形式が必須です
30
34. 常に実弾演習?
Ansibleは、モジュールのテストスクリプト(test-module)を提供しています。
モジュールのテストには、test-moduleスクリプトを利用しましょう。
$ git clone git@github.com:ansible/ansible.git --recursive
$ source ansible/v1/hacking/env-setup
$ ansible/v1/hacking/test-module -m ./timetest
* including generated source, if any, saving to: .ansible_module_generated
* this may offset any line numbers in tracebacks/debuggers!
***********************************
RAW OUTPUT
{"now": "2015-07-24 17:31:38.794721", "changed": false}
***********************************
PARSED OUTPUT
{
"changed": false,
}
34