回答:
次のexec
ようなタイプを使用できます。
exec { "upgrade_packages":
command => "apt-get upgrade -q=2",
path => "/usr/local/bin/:/bin/:/usr/bin/",
# path => [ "/usr/local/bin/", "/bin/" ], # alternative syntax
}
正直に言うと、私はそれを自分で試しませんでしたが、そのようなexec定義を含む新しいモジュールを作成する必要があると思います。
このapt-get upgrade
コマンドはインタラクティブです。静かに実行するために、-q=2
上記のオプションを追加できます。
touch
、そのファイルをパペットマスターに保存します。
すべてのホストがdebianである場合は、無人アップグレードパッケージを試すことができます。
http://packages.debian.org/sid/unattended-upgrades
ここでは、puppetを使用してdebian仮想マシンを管理していますが、puppetを使用すると、すべてのサーバーで未アップグレードの設定を有効化および管理できます。
最近、私たちのチームはすべてのサーバーでコマンドを実行するためにmcollectiveツールをテストしていますが、mcollective rubyスキルを使用する必要があります。
[s]グート
Puppet、Facter、mCollectiveに行くことをお勧めします。
mCollectiveは、Facterをフィルターとして使用して一連のホスト上でコマンドを(並行して)実行できる非常に優れたフレームワークです。
それにローカルプロキシ/キャッシュを追加すると、サーバー管理の準備が整います。
複数のサーバーで単一のコマンドを実行するために作成されたツールを使用します。それによって、TerminatorまたはClusterSSHで1億個のターミナルを開くことを意味するのではなく、代わりに、ジョブに適したツールを実行する管理サーバーへの単一のターミナルを持つことになります。
このコンテキストでは、func、Salt、またはmCollectiveをお勧めします。すでにPuppetをお持ちの場合は、mCollectiveを選択してください(Puppetにうまく統合されます)。そうでなく、マシンに古いPythonがあれば、funcを楽しむことができます。Pythonを初めて使用する場合は、Saltを試してください。これらのすべてのツールは、コマンドラインで指定されたコマンドを非同期で実行します。これは、シーケンシャルsshループや、数十個のターミネーターウィンドウで数十個のサーバーに対して同じaptitudeコマンドを実行するよりもはるかに楽しいです。
あなたは間違いなく塩を愛する でしょう。
だから私は良い解決に貢献する多くのものがあると思います:
帯域幅:基本的に、帯域幅を節約するための2つの選択肢が思い浮かびます。
管理:以前にサンプルマシンでコマンドをテストした場合、PDSH、PSSH、GNU Parallelなどのパラレルシェルを構成し、すべてのクライアントでコマンドを発行します。その後、他のすべてで失敗する可能性はほとんどありません。別の方法として、すべてのクライアントでcronジョブを検討することもできますが、自動的に失敗する可能性があるため、最初のソリューションをお勧めします。
アップグレードの同時性について懸念がある場合は、コマンドをスケジュールすることができます at
ロギング:並列シェルの場合と同様に、出力をリダイレクトする可能性があり、stderrとstdoutを組み合わせてログファイルに書き込みます。
私自身の並列sshラッパー:classhは、さまざまな並列およびクラスターsshツールの代替です。
あなたはそれを好むかもしれませんし、嫌うかもしれません。ここで言及している理由は3つだけです。
subprocess.communicate()
メソッドの制限に関連する唯一の制限---たとえば、約64Kのstdoutと、個別に最大64Kのstderrのキャプチャのみを取得できます。また、stdinから読み取ろうとするリモートプロセスは、すべて停止します)classhのタイムアウト処理により、ローカルsshサブプロセスが強制終了されるまで)classh.pyをモジュールとして使用するために、Pythonでカスタムスクリプトを記述するのは非常に簡単です。したがって、次のようなものを書くのは非常に簡単です。
!#/bin/env python
import classh
job = classh.SSHJobMan(cmd, targets)
job.start()
while not job.done():
completed = job.poll()
for i in completed:
# do something with the classh.JobRecord object referenced by i
# done
# You can optionally do post-processing on the dictionary of JobRecords here
# keyed off the target strings (hostnames)
</code></pre>
これですべてです。たとえば、ネストされた完了ループでは、特定の終了ステータスを返したすべてのリストを収集したり、特定のエラーメッセージをスキャンしたり、それらを処理するフォローアップジョブを設定したりできます。(ジョブは、それぞれが完了するまで、常に100ジョブのデフォルトで同時に実行されます。したがって、通常、数百のホストでの単純なコマンドは数秒で完了し、非常に複雑なシェルスクリプトは1つの長いコマンド文字列で完了します.. 50行程度と言うと...数千台のホストを約10分で完了することができます...私の環境では1時間あたり約1万台のホストがあり、それらの多くは大陸間にあります)。
したがって、これは、パペット構成を実装して十分にテストするまで、アドホックな手段として使用できるものである可能性があります...また、ホストの少しアドホックな調査を実行して、どの標準が標準から逸脱しているかを確認するのにも非常に役立ちますさまざまな小さな方法。
execを使用した答えは非常に役立ちます。
ただし、apt-getマニュアルによると、この方法で-q = 2を使用することはお勧めできません(ただし、何年も問題なく使用しています)
-q, --quiet
Quiet; produces output suitable for logging, omitting progress indicators. More q's will produce more quiet up to a maximum of 2. You can also use -q=# to set the
quiet level, overriding the configuration file. Note that quiet level 2 implies -y, you should never use -qq without a no-action modifier such as -d, --print-uris or
-s as APT may decided to do something you did not expect. Configuration Item: quiet.
私は長年自分でスクリプトを使用し、次のようにapt-getを実行しました。
ssh example.org "apt-get update && apt-get -y upgrade && apt-get -y dist-upgrade && apt-get clean"
人形や人々が言及した他のツールのようなものは確かに機能するかもしれませんが、基本的には人間が入力したいくつかのコマンドを模倣しているだけではやり過ぎのようです。特定のジョブに最も単純なツールを使用することを信じています。この場合、bashスクリプトは機能を失うことなく取得するのと同じくらい簡単です。
すべてのホストがDebian(または派生物)を実行している場合の別の解決策は、cron-aptパッケージを使用することです。しかし、ドキュメントごとに提案されているように、少し注意が必要です。
現在、すべてのセキュリティ更新プログラムを自動的に無人で実行するために、多数のサーバーでcron-aptを使用しています。不要なアップグレードを避けるため、Debian安定版ディストリビューションを実行するサーバーでのみcron-aptを使用し、aptソースを設定して、エイリアス(安定版)ではなくディストリビューション名wheezyを使用するようにします。
私が使用する特定のcron-apt構成は、1つのアクションファイルにまとめられています。 /etc/cron-apt/action.d/5-install
dist-upgrade -y -o APT::Get::Show-Upgraded=true -o Dir::Etc::SourceList=/etc/apt/sources.list.d/security.list -o Dir::Etc::SourceParts="/dev/null"
その他のアップグレードは、アップグレード中に手動での介入が必要になる可能性があるため、画面または最も適切なものを使用して、手動で実行されます。