Developing Modulesを参考にansibleのcoreモジュールを弄ってみました。
環境準備
オフシャルドキュメントのチュートリアルにテスト方法とかんたんなモジュールの作り方が書かれています。
下記でテスト環境を準備します。
$ git clone git://github.com/ansible/ansible.git --recursive $ source ansible/hacking/env-setup $ chmod +x ansible/hacking/test-module
pingモジュール
pingモジュールは、lib/ansible/modules/core/system/ping.py
にあります。
普通に使うとこんな感じ
$ ansible -m ping localhost localhost | SUCCESS => { "changed": false, "ping": "pong" } $
戻り値のpong
をpong!!
に修正します。
gitのsubmoduleになっているようです。
$ git diff | cat diff --git a/lib/ansible/modules/core b/lib/ansible/modules/core --- a/lib/ansible/modules/core +++ b/lib/ansible/modules/core @@ -1 +1 @@ -Subproject commit 45367c3d090ccf4d649b103b50b6eec939b6ee14 +Subproject commit 45367c3d090ccf4d649b103b50b6eec939b6ee14-dirty $ cd lib/ansible/modules/core/system $ git --no-pager diff diff --git a/system/ping.py b/system/ping.py index ed93f7d..9f8ddf6 100644 --- a/system/ping.py +++ b/system/ping.py @@ -49,7 +49,7 @@ def main(): ), supports_check_mode = True ) - result = dict(ping='pong') + result = dict(ping='pong!!') if module.params['data']: if module.params['data'] == 'crash': raise exceptions.Exception("boom") $
修正後に実行するとこんな感じ
$ ansible -m ping localhost localhost | SUCCESS => { "changed": false, "ping": "pong!!" } $
command/shellモジュール
command/shellモジュールは、lib/ansible/modules/core/commands
にあります。
実行するとこんな感じ
$ ansible localhost -m shell -a "/bin/ls" localhost | SUCCESS | rc=0 >> __init__.py command.py raw.py script.py shell.py $ ansible localhost -m command -a "/bin/ls" localhost | SUCCESS | rc=0 >> __init__.py command.py raw.py script.py shell.py $
test-module
で実行するには、こんな感じで実行します。
$ $ANSIBLE_HOME/hacking/test-module -m command.py -a "/bin/ls" * including generated source, if any, saving to: /home/vagrant/.ansible_module_generated * this may offset any line numbers in tracebacks/debuggers! *********************************** RAW OUTPUT {"changed": true, "end": "2016-03-03 18:31:12.148437", "stdout": "__init__.py\ncommand.py\nraw.py\nscript.py\nshell.py", "cmd": ["/bin/ls"], "rc": 0, "start": "2016-03-03 18:31:12.145253", "stderr": "", "delta": "0:00:00.003184", "invocation": {"module_args": {"warn": true, "executable": null, "chdir": null, "_raw_params": "/bin/ls", "removes": null, "creates": null, "_uses_shell": false}}, "warnings": []} *********************************** PARSED OUTPUT { "changed": true, "cmd": [ "/bin/ls" ], "delta": "0:00:00.003184", "end": "2016-03-03 18:31:12.148437", "invocation": { "module_args": { "_raw_params": "/bin/ls", "_uses_shell": false, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true } }, "rc": 0, "start": "2016-03-03 18:31:12.145253", "stderr": "", "stdout": "__init__.py\ncommand.py\nraw.py\nscript.py\nshell.py", "warnings": [] } $
デバッガを使うには、下記のようにします。
デバッガは、Python付属のpdbで開発用にクローンしてtest-module
で生成・実行されたソースをデバッグすることができます。
$ pdb $ANSIBLE_HOME/hacking/test-module -m command.py -a "/bin/ls" --debugger /usr/bin/pdb > /home/vagrant/git/module-dev/ansible/hacking/test-module(32)<module>() -> import sys (Pdb) q $ $ANSIBLE_HOME/hacking/test-module -m command.py -a "/bin/ls" --debugger /usr/bin/pdb * including generated source, if any, saving to: /home/vagrant/.ansible_module_generated * this may offset any line numbers in tracebacks/debuggers! > /home/vagrant/.ansible_module_generated(22)<module>() -> import copy (Pdb) list 17 # GNU General Public License for more details. 18 # 19 # You should have received a copy of the GNU General Public License 20 # along with Ansible. If not, see <http://www.gnu.org/licenses/>. 21 22 -> import copy 23 import sys 24 import datetime 25 import glob 26 import traceback 27 import re (Pdb)