構成管理:プッシュベースのトポロジとプルベースのトポロジ


22

PuppetやChefなどのより確立された構成管理(CM)システムは、プルベースのアプローチを使用します。クライアントは、更新のために集中マスターを定期的にポーリングします。それらのいくつかは、提供マスターレスのそれは(Saltstack)や「以下スケーラブル」(人形)の生産のためではない」であること(そう、プッシュベース)にもアプローチしますが、状態。私が知っている唯一のシステムは、最初からプッシュベースです。次点のAnsibleです。

プルベースのシステムの特定のスケーラビリティの利点は何ですか?プッシュエージェントよりもプルマスターを追加するほうが簡単なのはなぜですか?

たとえば、agiletesting.blogspot.nlは次のように記述します。

「プル」システムでは、クライアントは互いに独立してサーバーに接続するため、システム全体は「プッシュ」システムよりもスケーラブルです。

一方、Rackspace は、プッシュベースのモデルで15Kシステム処理できることを実証しています。

infastructures.orgの書き込み:

SUP、CVSup、rsyncサーバー、またはcfengineなどのツールを使用して、インフラストラクチャを維持するためのプル方法論を誓います。クライアントに変更をプッシュするのではなく、個々のクライアントマシンは、起動時およびその後定期的にゴールドサーバーをポーリングして、独自の回転レベルを維持する必要があります。この観点を採用する前に、ssh、rsh、rcp、およびrdistに基づいたプッシュベースの広範なスクリプトを開発しました。rコマンド(またはssh)で見つかった問題は次のとおりです:rコマンドベースのスクリプトを実行してターゲットマシンに変更をプッシュすると、30を超えるターゲットホストがある場合、そのうちの1つがいつでもダウンしている。委託されたマ​​シンのリストを維持することは悪夢になります。これを修正するコードを書く過程で、あなたは対処するための精巧なラッパーコードになります:死んだホストからのタイムアウト。デッドホストのロギングと再試行。並列ジョブをフォークして実行し、適切な時間内に多くのホストにヒットしようとします。そして最後に、ソースマシンで使用可能なすべてのTCPソケットをすべてのアウトバウンドrshセッションで使い果たすケースを検出して防止します。その場合、将来インストールするすべての新しいホストのインストールイメージに行ったばかりのことをすべて取得するだけでなく、死んで明日再構築する必要があるすべてのホストに対してそれを繰り返すという問題があります。トラブルを経てrコマンドベースのレプリケーションを実装しましたが、それだけの価値がないことがわかりました。インフラストラクチャをrコマンドで再度管理したり、他のプッシュメカニズムで管理したりする予定はありません。プルベースの方法と同様にスケーリングしません。並列ジョブをフォークして実行し、適切な時間内に多くのホストにヒットしようとします。そして最後に、ソースマシンで使用可能なすべてのTCPソケットをすべてのアウトバウンドrshセッションで使い果たすケースを検出して防止します。その場合、将来インストールするすべての新しいホストのインストールイメージに行ったばかりのことをすべて取得するだけでなく、死んで明日再構築する必要があるすべてのホストに対してそれを繰り返すという問題があります。トラブルを経てrコマンドベースのレプリケーションを実装しましたが、それだけの価値がないことがわかりました。インフラストラクチャをrコマンドで再度管理したり、他のプッシュメカニズムで管理したりする予定はありません。プルベースの方法と同様にスケーリングしません。並列ジョブをフォークして実行し、適切な時間内に多くのホストにヒットしようとします。そして最後に、ソースマシンで利用可能なすべてのTCPソケットをすべてのアウトバウンドrshセッションで使い果たすケースを検出して防止します。その後、将来インストールされるすべての新しいホストのインストールイメージに行ったばかりのことをすべて取得し、死んで明日再構築する必要があるすべてのホストに対してそれを繰り返すという問題がまだあります。トラブルを経てrコマンドベースのレプリケーションを実装しましたが、それだけの価値がないことがわかりました。インフラストラクチャをrコマンドで再度管理したり、他のプッシュメカニズムで管理したりする予定はありません。プルベースの方法と同様にスケーリングしません。そして最後に、ソースマシンで利用可能なすべてのTCPソケットをすべてのアウトバウンドrshセッションで使い果たすケースを検出して防止します。その後、将来インストールされるすべての新しいホストのインストールイメージに行ったばかりのことをすべて取得し、死んで明日再構築する必要があるすべてのホストに対してそれを繰り返すという問題がまだあります。トラブルを経てrコマンドベースのレプリケーションを実装しましたが、それだけの価値がないことがわかりました。インフラストラクチャをrコマンドで再度管理したり、他のプッシュメカニズムで管理したりする予定はありません。プルベースの方法と同様にスケーリングしません。そして最後に、ソースマシンで利用可能なすべてのTCPソケットをすべてのアウトバウンドrshセッションで使い果たすケースを検出して防止します。その後、将来インストールされるすべての新しいホストのインストールイメージに行ったばかりのことをすべて取得し、死んで明日再構築する必要があるすべてのホストに対してそれを繰り返すという問題がまだあります。トラブルを経てrコマンドベースのレプリケーションを実装しましたが、それだけの価値がないことがわかりました。インフラストラクチャをrコマンドで再度管理したり、他のプッシュメカニズムで管理したりする予定はありません。プルベースの方法と同様にスケーリングしません。その後、将来インストールされるすべての新しいホストのインストールイメージに行ったばかりのことをすべて取得し、死んで明日再構築する必要があるすべてのホストに対してそれを繰り返すという問題がまだあります。トラブルを経てrコマンドベースのレプリケーションを実装しましたが、それだけの価値がないことがわかりました。インフラストラクチャをrコマンドで再度管理したり、他のプッシュメカニズムで管理したりする予定はありません。プルベースの方法と同様にスケーリングしません。その後、将来インストールされるすべての新しいホストのインストールイメージに行ったばかりのことをすべて取得し、死んで明日再構築する必要があるすべてのホストに対してそれを繰り返すという問題がまだあります。トラブルを経てrコマンドベースのレプリケーションを実装しましたが、それだけの価値がないことがわかりました。インフラストラクチャをrコマンドで再度管理したり、他のプッシュメカニズムで管理したりする予定はありません。プルベースの方法と同様にスケーリングしません。またはそのことについて他のプッシュメカニズムを使用します。プルベースの方法と同様にスケーリングしません。またはそのことについて他のプッシュメカニズムを使用します。プルベースの方法と同様にスケーリングしません。

それは、アーキテクチャの問題ではなく、実装の問題ではありませんか?スレッドプルサーバーよりもスレッドプッシュクライアントを記述する方が難しいのはなぜですか?


4
Ansibleはを介してプルすることもできますansible-pull
ceejayoz

1
1つの大きな利点は、NATとファイアウォールを通過することです。これはしばしば障害ではありませんが、時にはゲームチェンジャーです。
ダンガースウェイト14年

SALTはpub / sub ZeroMQを使用します。違います。
ダンガースウェイト14年

1
これについては、[devops-toolchain] [1]メーリングリストのアプリケーション展開とシステム構成のスレッドで広範な議論がありました。[1]:code.google.com/p/devops-toolchain
sciurus

1
btw-HP Server Automationはプッシュモデルであり、数万台のデバイスを管理できます{開示-私はHPパートナーのオートメーションアーキテクトです}
ウォーレン14年

回答:


8

プッシュベースのシステムの問題は、中央のプッシュノードにアーキテクチャ全体の完全なモデルが必要になることです。知らないマシンにプッシュすることはできません。

それは明らかに機能しますが、同期を保つには多くの作業が必要です。

Mcollectiveなどを使用して、Puppetおよび他のCMをプッシュベースのシステムに変換できます。一般的に、プルシステムをプッシュベースのシステムに変換するのは簡単ですが、逆の方法を採用することは必ずしも簡単ではありません。

また、組織政治の問題もあります。プッシュベースのシステムでは、中央管理者のすべての制御が行われます。そのように複雑さを管理することは非常に困難です。スケーリングの問題は赤いニシンだと思います。クライアントの数だけを見ると、どちらのアプローチもスケーリングします。多くの点で、プッシュは簡単に拡張できます。ただし、動的構成では、少なくともプルバージョンのクライアント登録があることを意味します。

最終的には、組織内のワークフローと所有権に一致するシステムについてです。原則として、プルシステムはより柔軟です。


2
ありがとう!しかし、なぜ動的構成はプルを意味するのでしょうか?Ansibleは、たとえば、動的プッシュを使用します。Puppetが動的プッシュを実行できないという事実は、アーキテクチャの制限ではなく、実装の制限であるようです。
ウィレム14年

4
@Willem真に「動的」な環境とは、新しいマシンがいつでもどこでも表示され、構成が必要なことを意味します。プッシュベースのシステムでは、セントラルノードでそのシステムを構成する必要があります。プルベースのシステムは、環境管理者が構成サーバーに対して何もする必要なく、(汎用)構成をプルできます。
voretaq7 14年

1
Zabbixはホストを検出し、Ansibleは動的インベントリを使用してプル構成を新しく検出されたホストにプッシュできます。
-bbaassssiiee

はい、ansibleはその動的インベントリに多くのソースを使用できます。たとえば、ESX APIです。そうすれば、VMが作成されるとすぐに知り、パターンマッチで再生を実行できます。
JMベッカー

11

誰もが興味がある場合は、少なくとも、ミッションクリティカルなシステムのマルチホストセットアップのパッチ管理のコンテキストで、Ansibleのすぐに使えるプッシュ機能を初めて使用したユーザーエクスペリエンスレポートを提供できると思います。 Amazonクラウドで。私の先入観やバイアスを理解するために、自動化スクリプトレベルでRubyを優先し、過去にプロジェクトごとのマスターエージェントパペット構成を使用するようにプロジェクトを設定したことを説明する必要があります。ですから、私の経験は、もしあれば、過去の偏見に反しています。

私の最近の経験は、数十から数百のサーバーへの動的なプッシュに非常に有利でした。これらのサーバーは、スケールアップまたはダウン、終了、更新が可能です。私の状況では、パッチを作成するために必要なのは、単純なAnsible 1.7アドホックコマンドだけでした。ただし、目的のためにVpcごとにAnsibleController(t2.micro上)を設定する有効性を考慮して、将来、より複雑な要件に合わせてこの手法を拡張する予定です。

したがって、このスレッドで尋ねられた質問に戻りましょう:動的に変化する不動産の長所と短所。

私がターゲットにしたサーバーエステートの仮定は次のとおりでした。

  • IPアドレスまたはAmazonが生成したローカルホスト名が長持ちするという仮定はありません-両方とも行き来できます
  • すべてのインスタンスは、単一の特権管理ユーザーからsshアクセスを可能にするマシンイメージから作成されました。
  • サーバーを個別化し、機能または開発の段階(テストや製品など)に応じてグループに分割することは、合意された従来の名前の特定のAmazonタグを起動することで行われます。
  • LinuxサーバーとWindowsサーバーを別々にアドホックコマンドで別々に管理するパッチを適用するため、Windowsサーバーへの接続時にLinux固有のログインが失敗することを許可することは完全に受け入れられます。

これらの条件を念頭に置いて、AnsibleControllerのマシンイメージを作成して多数のVpcsにドロップし、既存のサーバーアカウント内でその場で(資格情報を使用して)構成するのは非常に簡単です。画像から作成された各インスタンス内で自動化されます

  1. 定期的に実行中のサーバーにパッチをプッシュして、必要な資産が一定の間隔で継続的にアクセスされるようにするcronジョブ
  2. このような間隔でAnsibleインベントリを計算する方法。

2番目のアイテムは、必要に応じて(AnsibleインベントリのInfo構造を介して)比較的洗練されたものにすることができます。ただし、高度な処理が必要ない場合は、cron間隔ごとにすべてのAmazon EC2インスタンスを計算し、結果を適切なインベントリファイル(/ etc / ansible / hostsなど)に転送するスクリプトの非常に簡単な例を示します。

#!/bin/bash
# Assumes aws-cli/1.3.4 Python/2.6.9 Linux/3.4.73-64.112.amzn1.x86_64 or greater
# http://aws.amazon.com/releasenotes/8906204440930658
# To check yum list aws-cli
# Assumes that server is equipped with AWS keys and is able to access some or all
# instances in the account within it is running.
# Provide a list of host IPs each on a separate line
# If an argument is passed then treat it as the filename, whether local or absolute 
# path, to which the list is written

function list-of-ips {
    /usr/bin/aws ec2 describe-instances --filters '[ {"Name": "instance-state-code", "Values": [ "16" ] } ]' | grep -w PrivateIpAddress | awk  '{x=$2; gsub("\"","", x); gsub(",","", x); if(x && FNR!=1){print x;}}' | uniq
 }

if [ -n "$1" ]; then
   list-of-ips > "$1"
else
   list-of-ips
fi

ユースケースの唯一の注意点は、パッチコマンドがべき等でなければならないということです。パッチが意図したとおりに動作することを確認する一環として、これが満たされていることを完全に確認するために事前テストすることが望ましいです。

要約すると、動的プッシュが設定した目標に対して効果的であるユースケースを示しました。これは反復可能なソリューションです(複数のアカウントとリージョンに展開できるイメージにカプセル化されるという意味で)。これまでの私の経験では、ダイナミックプッシュテクニックは、現在利用可能なツールセットから利用可能な代替手段よりもはるかに簡単に提供でき、実行できます。


2
//、@ jonz、これは一種の議論であり、経験豊富な開発者はStack Exchangeモデルを愛するようになったと思います。私は特にあなたが選んだ用語が好きであり、この答えは最初に仮定をリストしている。
ネイサンバサネーゼ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.