サーバーで使用されなくなった役割からのものをクリーンアップする方法は?


15

とりわけ、関連するAnsibleロールがインストールされnginx、いくつかの重要な構成を実行/etc/nginxし、ファイアウォールでポート80および443を開くWebサーバーであるホストがあるとします。

ある時点で、その特定のホストがWebサーバーにならないようにします。何らかの理由でそのサービスを他の場所に移動したからです。[webservers]インベントリからサーバーを削除するだけで、サーバーにゴミが残ります。理想的には、アンインストールnginxして、/etc/nginxディレクトリ(およびその他のディレクトリ)を削除し、ファイアウォールのポート80と443を閉じます。

Puppetではこれを行うことができます。Webサーバーであるホストの構成には、次のようなものがあります。

class { 'nginx':
  ensure => present,
}

そして、私がしなければならないことは、「現在」を「不在」に置き換えることです。nginxクラスが適切に記述されている場合、変更は元に戻されます。(通常、管理者は「現在」を「不在」に置き換えます。その後、影響を受けるすべてのホストが構成を元に戻したことを確認したら、マニフェストからアイテムを削除します。)

さらに、Puppetファイアウォールモジュールは、マニフェストに見つからないファイアウォールルールを自動的に削除すると思います。ファイアウォールの場合、上記の「不在の」ことをする必要さえないと思います。とにかくファイアウォールは自動的に閉じます。

Ansibleでこれらのことを達成するにはどうすればよいですか?


1
あなたの質問自体にはメリットがないわけではありませんが、ここでは仮説的な質問は話題になりません。代わりに「聞かせてのは...ふり」言い換えをし、インスタンスの言う「人形で私は、サーバーの役割を変更して、アンインストールnginxの変更により、以前にインストールされていたことができますensure => present ensure => absentも...どのansibleと同じことを行うためになる」などの理想をすでに試したものの例を示します。
HBruijn 14

2
私は、Ansibleはこの種のもののために実際に設計されていないと主張します。再現可能な使い捨てサーバーを対象としています。マシンをWebサーバーにしたくない場合は、目的を変更するのではなく、単にそれを消去(または、クラウドインスタンスの場合は終了)します。
ceejayoz 14

私はAnsiblesについて読んだほとんどはオーソン・スコット・カードのカードの中にある@ceejayoz エンダーのゲーム&sequalsいますが、クラウドオーケストレーションに多くの意味を作る言う
HBruijn

@ceejayoz:現在、マルチサーバーのセットアップにAnsibleを使用していませんが、小規模な自律サーバーを構成するために使用しています。これは有効な使い方だと思います。そのため、サーバーはnginx + django + PostgreSQLを持つことができます。後でnginxまたはnginx + djangoを別の場所に配置することにした場合、サーバー全体を消去し、PostgreSQLをバックアップから戻す必要があると思われます(ダウンタイムは言うまでもありません)。
アントニ

回答:


10

Ansibleを使用すれば、Puppetを使用して行う方法と実際にこれを変更することはありません。

設定する場所の例では

class { 'nginx':
  ensure => absent,
}

すべてを削除するために必要なコードを記述したパペットモジュールの作成者に依存しています。すべてのパペットモジュールにこれがあるわけではありません。

同様に、Ansibleを使用すると、インストールと削除の両方に必要な手順を持つ役割があります。違いは、2つの呼び出し方法のみです。

1つのアプローチは、問題のロールが動作を切り替える変数を公開するものです。たとえば、そのnginxロールnginx_stateは、値installedとを受け取る変数を取る場合がありabsentます。

ロールtasks/main.ymlでは、ロールの作成者は次のようなものを持っている可能性があります。

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

..これらの2つの条件付きインクルードファイルに分割されるそれぞれのインストール/アンインストールロジックを使用します。

Ansibleロールはネストすることもできます。同じことを行う別の方法として、ロールの作成者は、たとえば、nginxロール内に別のロールを持つロールを提供できuninstalledます。その後、次のことができます。

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

Ansibleは、Puppetと比較した場合、おそらく物事の実行方法に関するルールとガイドラインが少ないため、実際にはプラクティスが多少異なりますが、同じ概念が適用されます。


1
技術的には引数をロールに直接渡すこともできますが、ネストされたロールを使用することをお勧めします。プレイブックで何らかの役割を見ているのは本当に奇妙だと思います。変数で定義されているため、プレイブックの実行時に実際にアンインストールされます。ネストされたロールを介して明示的にすることは、非常にクリーンに思えます。技術的にはロール(- { role: nginx, state: absent })に引数を渡すことは可能ですが、私には非常に冗長なようです。ネストされたロールの唯一の欠点は、親からデフォルト変数をリンクする必要があることです。
bogdan.mustiata

roles: -nginx/uninstalled仕事のようなもののために何をする必要がありますか?私はあちこちを見回しましたが、それを可能にするような方法での役割のネストに関するドキュメントを見つけることができません。
aggregate116​​6877

1

Ansibleで構成/プロビジョニングを行っているので、サーバー全体を吹き飛ばし、新しいサーバーを再インストール/プロビジョニングして、正常に動作するきれいな状態にすることができます。

他の目的で実際に「再構成」したい場合は、必要なクリーンアップタスクを実行する新しいプレイブックを作成する必要があります。

私の知る限り、すべてのAnsible パッケージングモジュールstate=absentは、特定のパッケージがサーバーにインストールされないようにするためにサポートしています。さらに、aptモジュールには、purge=yesカスタマイズされた残りの構成ファイルをクリーンアップするパラメーターがあります。

ポート80がファイアウォールで保護されていることを確認するタスクを作成することもできます。ただし、そのポートで実行されているプロセスはないため、ファイアウォールを使用してもサーバーのセキュリティに影響はありません。


これに追加するために、私はその役割のほとんどの演劇がstate=absent追加できたに違いないと思っています。行った設定変更の大部分を削除または元に戻す可能性が十分にあります。役割の大きさに応じて、これはテストする本当のPITAかもしれません。
クリストファーカレル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.