これは Ansible 3 Advent Calendar 2019 の20日目の記事です。
はじめに
みなさま、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_items
と loop
はネストの扱いが異なります。同じだと思って安直に 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 まで教えていただけると嬉しいです。
参考
- [Ansible] デフォルトから変更されている設定項目を確認する方法(ansible-config dump --only-changed) - てくなべ (tekunabe)
- [Ansible] 見知らぬ Ansible 環境に入った時に確認したいこと - てくなべ (tekunabe)
■ 第1位: ansible_python_interpreter
変数定義し忘れがち
堂々の第1位です。
ansible_python_interpreter
変数は、Ansible が生成した Python スクリプトを実行する際に利用する Python Interpreter を指定する変数です。
指定がない場合は、(Ansible 2.8 以降)Interpreter Discoveryという機能によって見つけたパスになります。例えば、RHEL/CentOS 7であれば、/usr/bin/python
、RHEL/CentOS 8 であれば、/usr/libexec/platform-python
が見つけられます。
特に指定しなくても正常に実行できることも多いですが、条件によっては以下のことが起こりえます。
- Python 3 で実行してほしいのに Python 2 で実行されてしまう
- 必要な Python パケージをインストールしたはずなのに
hogehoge is not installed
でエラーになってします。
スペルミスにも注意です・・・。
さいごに
来年は、ここにあげたつまづきポイントにつまづかないといいですね(希望)。