ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

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