Ansible で、コマンドが存在するかどうかで処理を変える方法
冪等性(べきとうせい)を考えて、
パッケージ(コマンド)を apt で初めてインストールするときだけ処理をしたい。
という要望が自分の中で湧いてきて、さてどうしようと調べるも、なかなか出てこない。
「already installed ansible」とGoogle検索かけたら以下のサイトがヒットして、とても役立ちました。
Ansibleで冪等性を保つためにはfailed_whenとかstatを使うと便利 - 銀色うつ時間
いろいろ試してみたら、もうちょっと直感的な見た目に書けましたので、
それをご紹介。
それにあたりこちらのサイトも役立ちました。
ansibleでの実行結果のsuccess/failedとignore_errors/failed_whenがよくわからなかったので調べてみた
さて、どうなったのか、以下に書きます。
- name: check exist mysql command shell: type mysql register: exist_mysql failed_when: false - set_fact: is_exist_mysql: "{{ exist_mysql | success }}" - debug: msg="{{ is_exist_mysql }}" when: is_exist_mysql == true
これを実行すると、 mysql コマンドがすでに実行できるときはデバッグメッセージとして
ok: [123.456.78.90] => { "changed": false, "msg": true }
と出ますし、逆に存在しなければ
skipping: [123.456.78.90]
と出力されます。
failed_when: false
でなく ignore_errors: true
と書いてもいいのですが、
ignore_errors は処理は続行されるのですが、エラーメッセージが出力されてしまって、
ちょっと心臓に悪いので、エラー扱いにならない failed_when: false
を使用しています。
なお、 shell: type mysql
としていますが、当然 shell: which mysql
でも構いません。好みです。
(参考 : Bashでコマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強 )
ではでは、作業中なので要点だけで失礼…。
ansible で冪等性を保証するの、難しすぎて苦戦中です……。
【追記(2018/09/25): こっちのがいいかも】
上で ignore_errors がエラーメッセージとして表示されるからヤダって書いてるんですが、
でも type mysql
の成功結果がわからないのも困らない? ってのが最近の考えなので、
今書くとしたら以下の書き方をします。シンプルですしね。
- command: which mysql register: result ignore_errors: true - debug: msg="mysql is not exist" when: result is failed