もりはやメモφ(・ω・ )

インフラなエンジニアからSREへ

Ansible で複数台サーバの結果を順番(Sequential)に取得する

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に以下のように記載することで対応しました。

[defaults]
forks = 1

それに対してAnsible界のスーパー金魚さんから -f <N> を教えてもらいました。

ドキュメントの 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へのアクセスを分散してたりするわけですね