ansible
コマンドって便利なんですよ
日頃から大量のサーバを管理する中で、Ansible の Adhock な実行はとても便利です。
もちろんサーバの構成管理であったり、Packerから呼び出す初期セットアップとしての Ansible Playbook も愛用していますが、なんだかんだでワンライナーとしての ansible
コマンドも運用に欠かせません。
良くあるケースとして以下などがあります。
- shell モジュールを活用したログの一括...
grep
で設定ファイルのパラメタ確認ps
などでサーバの状態確認ls
などでファイルの作成有無
- fetch モジュールを利用した設定ファイルの一括取得
- service モジュールを利用したアプリの起動/停止
しかし、そんな便利な ansible
コマンドですが少々悩みがありました。
課題: 便利なんですがちょっと使いづらいところ
何が使いづらいかというと、 ansible
コマンドの結果がデフォルトでは順番になりません。サンプルとしては以下のような結果です。
本当は01から09まで順番に出て欲しいのですが、完全にバラバラです。
これは DEFAULT_FORKS で実行時の並列数が5となっており、同時に実行された結果がばらばらに返ってくるためです。
[morihaya@morihaya ~]$ ansible -i inventories/all morihaya0? -m shell -a "date" morihaya04 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 morihaya07 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 morihaya05 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 morihaya06 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 morihaya09 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 morihaya02 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 morihaya03 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 morihaya01 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 morihaya08 | CHANGED | rc=0 >> Sun Aug 23 20:40:09 JST 2020 [morihaya@morihaya ~]$
対策: 並列で順番がバラバラになるなら1つずつやれば良い
当初はansible.cfgに以下のように記載することで対応しました。
ansible.cfgで
— もりはや (@morihaya55) 2020年8月19日
[defaults]
forks = 1
ってやると綺麗に順番で結果が返ってくるのを確認した
アドホック利用だとこれは結構便利かも
[defaults] forks = 1
それに対してAnsible界のスーパー金魚さんから -f <N>
を教えてもらいました。
なるほど -f <N> でさくっとfork数を指定できるわけですね!これは便利だなぁ、ありがとうございます!!
— もりはや (@morihaya55) 2020年8月20日
ドキュメントの Docs » User Guide » Working with command line tools » ansible を参照して以下を確認しました。
- -f
, --forks - specify number of parallel processes to use (default=5)
つまり、コマンドの実行時間が伸びることもありますが、以下のように -f 1
を付与することで、サーバの順番が綺麗に並んだ結果を得られるのです!!
[morihaya@morihaya ~]$ ansible -i inventories/all morihaya0? -m shell -a "date" -f 1 morihaya01 | CHANGED | rc=0 >> Sun Aug 23 21:03:41 JST 2020 morihaya02 | CHANGED | rc=0 >> Sun Aug 23 21:03:43 JST 2020 morihaya03 | CHANGED | rc=0 >> Sun Aug 23 21:03:45 JST 2020 morihaya04 | CHANGED | rc=0 >> Sun Aug 23 21:03:48 JST 2020 morihaya05 | CHANGED | rc=0 >> Sun Aug 23 21:03:50 JST 2020 morihaya06 | CHANGED | rc=0 >> Sun Aug 23 21:03:52 JST 2020 morihaya07 | CHANGED | rc=0 >> Sun Aug 23 21:03:54 JST 2020 morihaya08 | CHANGED | rc=0 >> Sun Aug 23 21:03:56 JST 2020 morihaya09 | CHANGED | rc=0 >> Sun Aug 23 21:03:59 JST 2020 [morihaya@morihaya ~]$
余談: 順番を意識する必要を本当はなくしたい
クラウドネイティブな今の時代、本来であればサーバの順番やホスト名を意識することは良くありません。数年前は "cattle vs pets" という言葉も良く見かけましたが、クラウドでサーバが簡単に使い捨てができ、コンテナがそれをさらに加速し、オンプレミスであってもESXiなどでVMの使い捨てができる現在では、サーバそれぞれに名前をつけて大事に運用するのは良い方法ではないことも認識してます。
...が、そうもなかなかいかないのも事実で今回のようなハックが必要でした。*1
*1:例えば奇数系と偶数系のサーバでDBへのアクセスを分散してたりするわけですね