Ansibleでpipをupgradeするときの書き方

pipを使ってライブラリをインストールしようとしたところ、以下のような文句を言わました。更に、lxmlをインストールするときには、pipのバージョンが古いからupgradeしないとインストールできないと言われました。

You should consider upgrading via the ‘pip install –upgrade pip’ command.

アップグレードするには、以下のコマンドを実行するだけ。

$ pip3.5 install –upgrade pip

でも、Ansibleのpipモジュールのページにはupgradeについて何も記載がありません。

pip – Manages Python library dependencies.
http://docs.ansible.com/ansible/pip_module.html

コマンドでは簡単に叩けるんですけど、単純にcommandモジュールとかで叩くようにすると、changedが常に発生してしまって冪等性を担保できなくなります。まぁchangedは何件か常に発生するものだと決めてしまえばまぁそれで終わったりするんですけど、せっかくの冪等性が破綻してしまうのはもったいないし、なんかちょっと気持ち悪いですよね。少し時間経ったら、常に発生するchangedは何件が適切なのか忘れそうだし。

というわけで、以下のようにchanged_whenを使ってchangedが発生しないようにしました。コマンドの実行結果文字列にRequirement already up-to-dateが含まれていたらok。それ以外は何かしらのアップデートがされたと判断しchangedになります。

– name: upgrade pip
shell: pip3.5 install –upgrade pip
register: result
changed_when: ‘”Requirement already up-to-date” not in result.stdout’

Ansibleのplaybookを書いていると、冪等性を保つのにそれなりの工数が要りますね。やっぱり。ここらへんを割り切って、デプロイシェルスクリプトの高級版みたいな感じで使うこともできるんですけど、それをやるとちと勿体無い気もするんで、頑張ってメンテナンスしていこうと思います。