はじめに
2020/08/01 に、YouTube Live で「つまずき Ansible 【Part11】トラブルシューティング手法を試す」という配信をしました。 実際に作業しながらエラーと戦って進めるシリーズです。
今回は、July Tech Festa 2020 や Cloud Operator Days Tokyo 2020 で@saito_hidekiさんから発表があった、以下の資料を参考にながら、トラブルシューティングの手法をいつくつか試しました。
www.slideshare.net
やったことや、わかったことをふりかえります。
動画
■ やったこと
log_path
によるログ保存
設定名は DEFAULT_LOG_PATH
。
ansible.cfg
の場合は以下の設定。相対パスでもOKの模様。
[defaults] log_path=ansible.log
環境変数での設定の場合は ANSIBLE_LOG_PATH
。
コマンド実行時の一時的に有効にする場合は、以下のよいうに指定する。
$ ANSIBLE_LOG_PATH=ansible1.log ansible-playbook -i inventory.ini ios_show.yml
ANSIBLE_DEBUG
によるデバッグ
設定名は DEFAULT_DEBUG
、
環境変数での設定の場合は、ANSIBLE_DEBUG
。大量のログが表紙されるので、一時的な設定にするのが吉。
$ ANSIBLE_DEBUG=True ansible-playbook -i inventory.ini ios_show.yml
前述の log_path
指定したファイルにも出力される。
--step
によるステップ実行
ansible-playbook
コマンドの --step
オプションで、各タスクの実行前に一時停止できる。
n
でスキップ、y
で実行(次のタスクでまた止まる)、c
で継続(この後は止まらない)
# ansible-playbook -i inventory.ini ios_show.yml --step PLAY [ios] *************************************************************************************************************************** Perform task: TASK: 1. show version (N)o/(y)es/(c)ontinue: y Perform task: TASK: 1. show version (N)o/(y)es/(c)ontinue: *************************************************************************** TASK [1. show version] *************************************************************************************************************** ok: [rt01] ok: [rt02] Perform task: TASK: 2. show ip route (N)o/(y)es/(c)ontinue: c Perform task: TASK: 2. show ip route (N)o/(y)es/(c)ontinue: ************************************************************************** TASK [2. show ip route] ************************************************************************************************************** ok: [rt02] ok: [rt01] TASK [3. show ip route] ************************************************************************************************************** ok: [rt01] ok: [rt02] PLAY RECAP *************************************************************************************************************************** rt01 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 rt02 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
--start-at-task
による、開始タスクの指定
ansible-playbook
コマンドの --start-at-task
オプションで、どのタスクから始めるかを指定できる。
ansible-playbook -i inventory.ini ios_show.yml --start-at-task "2. show ip route"
としたときに、以下のように 2. show ip route
という名前のタスク移行が実行される。
- name: 2. show ip route ios_command: commands: - show ip route
新たにわかったこと
試した限り、同じ名前のタスクが合った場合は、上にあるタスクから実行される模様。
また、--start-at-task "2. show ip*"
のようなワイルドカード指定もできた。
"2. show ip"
ではマッチしない。
Playbook Debugger によるデバッグ
以前の配信でも利用した便利な Playbook Debugger。
たとえば、以下のように Play レベルで debugger: always
を指定すると、各タスクの各ホスト実行後にデバッガーが起動する。
--- - hosts: ios gather_facts: false debugger: always tasks: - name: 1. show version ios_command: commands: - show version - name: 2. show ip route ios_command: commands: - show ip route - name: 3. show ip route ios_command: commands: - show ip route
変数の値を途中で確認したり
[rt02] TASK: 1. show version (debug)> p task_vars["ansible_user"] 'admin'
書き換えたりもできる。
[rt02] TASK: 1. show version (debug)> task_vars["ansible_user"]="hogehoge" [rt02] TASK: 1. show version (debug)> u
再実行は r
。
[rt02] TASK: 1. show version (debug)> r
新たにわかったこと
前述の --step
の機能を包含していると思っていがそうではなかった。
--step
- タスクの実行前に止まる
- タスク単位(ホスト単位ではなく)で止まる
- Playbook Debugger
- タスクの実行後に止まる
- ホスト単位で止まる
ANSIBLE_KEEP_REMOTE_FILES
による、Pythonファイルの保存
Ansible がマネージドノードに送って実行する Python ファイルは、通常は実行後に削除されるが、それを残すことに酔ってデバッグの材料になる。
設定名は DEFAULT_KEEP_REMOTE_FILES
。
環境変数での設定の場合は ANSIBLE_KEEP_REMOTE_FILES
。
# ANSIBLE_KEEP_REMOTE_FILES=True ansible -i inventory.ini sv -m shell -a "hostname" awx | CHANGED | rc=0 >> centos7
ターゲットノードでファイルが残る。
[root@centos7 ~]# cd .ansible/tmp/ansible-tmp-1596282623.326226-90936-50539150331503/ [root@centos7 ansible-tmp-1596282623.326226-90936-50539150331503]# ll 合計 124 -rwx------. 1 root root 124866 8月 1 20:50 AnsiballZ_command.py
実行もできる。
[root@centos7 ansible-tmp-1596282623.326226-90936-50539150331503]#./AnsiballZ_command.py {"changed": true, "end": "2020-08-01 20:52:07.803865", "stdout": "centos7", "cmd": ["hostname"], "rc": 0, "start": "2020-08-01 20:52:07.801926", "stderr": "", "delta": "0:00:00.001939", "invocation": {"module_args": {"creates": null, "executable": null, "_uses_shell": false, "strip_empty_ends": true, "_raw_params": "hostname", "removes": null, "argv": null, "warn": true, "chdir": null, "stdin_add_newline": true, "stdin": null}}}
Part3 にむけて
以下のネタを検討中です。気が向いたものをやります。
- connection: local ななにか
- Ansible Toewr / AWX をコマンドがら操作する
- ansible.cfg
- Jinja2、フィルター
- Windows