てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 今年もよくつまづいたねランキング2019


これは Ansible 3 Advent Calendar 201920日目の記事です。


はじめに

f:id:akira6592:20191219150202p:plain:w300

みなさま、Playbook を書いて一発で意図通り正常に動かすことはできますでしょうか?

私は、そうそうできません。

今年もよくいろいろなところでつまづきました。この記事では、個人的によくつまづいたことをランキング形式で上位5位をご紹介します。どハマリというよりは、ちょっとしたことだしすぐ気がつくけど良くつまづく、といったものです。

つまづいた回数をカウントしていたたわけではなく、完全に感覚です。

なお、タイトルは以下の記事からインスパイヤされました。




■ 第5位: debug のスペル間違えがち

debug モジュールを使用した以下の Playbook、どこが間違えているかわかりますでしょうか。

- hosts: localhost
  gather_facts: no

  tasks:
    - name: debug test
      dbeug:
        msg: Hello, kingyo

debug モジュールのスペルが違いますね。なぜかわからないのですが、良く間違えてしまいます。

ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.

というエラーが表示されるのですぐに気がつくのですが、本当にしょうもないですね・・




■ 第4位: with_items を安直に loop に置き換えがち

with_itemsloop はネストの扱いが異なります。同じだと思って安直に loop に置き換えると、参照エラーになるケースがあります。

詳細は以下の記事を参照して下さい。

Ansible の loop は flatten されない(with_items ではなく with_list と同じ) - てくなべ (tekunabe)

・・と、記事を書いておきながらつまづくわけです。




■ 第3位: register してないのにresult 参照しがち

こういうケースです。

- hosts: iosallatest
  gather_facts: no

  tasks:
    - name: show version
      ios_command:
        commands:
          - show version
      
    - name: debug test
      debug:
        msg: "{{ result }}"

ios_command モジュールのタスクの結果を register で変数に登録してないのに、debug モジュールのタスクで参照しようとしています。

The task includes an option with an undefined variable. The error was: 'result' is undefined

というエラーが表示されるのですぐ気が付きます。

以下のように修正すると動きます。

    - name: show version
      ios_command:
        commands:
          - show version
      register: result    # 追加

手癖のように変数名を result としていますが、本当は任意です。




■ 第2位 --only-changed--changed-only に間違えがち

Playbook ではないですがランクイン。

Ansible 2.4 以上には ansible-configという、設定項目を表示するコマンドがあります。

dump サブコマンドの --only-changed オプションで、デフォルトから変更されている設定項目だけを表示できて便利です。

$ ansible-config dump --only-changed
HOST_KEY_CHECKING(/home/ansible/ansible/ansible.cfg) = False

なのですが、--only-changed だったか --changed-only だったかなかなか覚えられず、しょっちゅう間違えます。 ヘルプを見れば良い話なのですが、できればノールックでシュッとコマンドを打ちたいものです。何かいい覚え方があれば @akira6592 まで教えていただけると嬉しいです。

参考




■ 第1位: ansible_python_interpreter 変数定義し忘れがち

堂々の第1位です。

ansible_python_interpreter 変数は、Ansible が生成した Python スクリプトを実行する際に利用する Python Interpreter を指定する変数です。 指定がない場合は、(Ansible 2.8 以降)Interpreter Discoveryという機能によって見つけたパスになります。例えば、RHEL/CentOS 7であれば、/usr/bin/pythonRHEL/CentOS 8 であれば、/usr/libexec/platform-python が見つけられます。

特に指定しなくても正常に実行できることも多いですが、条件によっては以下のことが起こりえます。

  • Python 3 で実行してほしいのに Python 2 で実行されてしまう
  • 必要な Python パケージをインストールしたはずなのに hogehoge is not installed でエラーになってします。

スペルミスにも注意です・・・。



さいごに

来年は、ここにあげたつまづきポイントにつまづかないといいですね(希望)。