てくなべ (tekunabe)

ansible / network / automation

[Ansible] 「つまずき Ansible 【Part11】トラブルシューティング手法を試す」ふりかえり

はじめに

2020/08/01 に、YouTube Live で「つまずき Ansible 【Part11】トラブルシューティング手法を試す」という配信をしました。 実際に作業しながらエラーと戦って進めるシリーズです。

tekunabe.connpass.com

今回は、July Tech Festa 2020Cloud Operator Days Tokyo 2020@saito_hidekiさんから発表があった、以下の資料を参考にながら、トラブルシューティングの手法をいつくつか試しました。

www.slideshare.net

やったことや、わかったことをふりかえります。

動画

www.youtube.com


■ やったこと

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 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