Ubuntu 20.04にCFEngine Community Editionをインストールして使用する方法
著者は「オープンインターネット/表現の自由基金」を、Write for DOnationsプログラムの一環として寄付を受け取るために選びました。
紹介
CFEngineは、ITインフラストラクチャ用のスケーラブルな構成管理ツールです。CFEngineを使用すると、Linux、Mac、Windows、BSD、Solaris、IBM AIX、HP-UXなど、インフラストラクチャ内のすべてを管理するために同じツールとポリシー言語を使用できます。管理したい各マシンにエージェント(Cで記述)をインストールします。CFEngineは多くのプラットフォームをサポートしており、大規模なインフラストラクチャや小規模なIoTデバイスのようなリソースに制約のある環境で便利です。
このチュートリアルでは、Ubuntu 20.04上にCFEngine Community Edition 3.21をインストールし、サンプルポリシーファイルを作成し、ポリシーの実行を自動化します。
前提条件
このチュートリアルを完了するためには、次のものが必要です:
- 非ルートの
sudoユーザーを持つ Ubuntu 20.04 サーバーが1台必要です。これを設定するには、私たちのガイド「Ubuntu 20.04 初期サーバー設定」に従ってください。 sudoを含むシェルコマンドを実行する方法、たとえばsshのようなもの。- テキストエディタ。このチュートリアルでは
nanoを使います。
ステップ1 — CFEngineのインストール
このステップでは、aptおよびパッケージリポジトリを使用してCFEngineをインストールします。インストールにaptを使用する主な利点は、後でaptを使用してCFEngineを更新できることです。
CFEngineを異なる使用ケースに応じてインストールする別の方法があります。
cf-remoteは、複数のマシン上でのインストール、異なるバージョンの CFEngine、およびナイトリービルドを処理する柔軟な選択肢です。quick-installシェルスクリプトは、単一のマシンにとって良い選択肢です。ターミナルにコマンドを1つコピーすることでインストールできます。- ウェブサイトから直接パッケージをダウンロードすることもできます。
CFEngine CommunityまたはEnterpriseをインストールするためのこれらの代替手段のいずれかを使用する場合は、ステップ2 - インストール後のCFEngineの開始にスキップするか、ステップ3 - ブートストラップ後の最初のポリシー作成に進んでください。
CFEngineの公開鍵を追加する
CFEngineをaptを使用してインストールするには、aptがリポジトリにアクセスできる必要があります。最初のステップは、CFEngineの公開GPGキーをaptキーコレクションに追加して、aptがリポジトリからのパッケージを信頼できるようにすることです。
このコマンドでキーをダウンロードします:
- wget https://cfengine.com/pub/gpg.key -O ~/cfengine-gpg.key
次に、apt-keyを使用して追加します:
- sudo apt-key add ~/cfengine-gpg.key
CFEngineのパッケージリポジトリを追加する
次に、以下のコマンドを使用してCFEngineリポジトリをaptのソースとして追加する必要があります:
- sudo sh -c "echo 'deb https://cfengine-package-repos.s3.amazonaws.com/pub/apt/packages stable main' > /etc/apt/sources.list.d/cfengine-community.list"
このコマンドは、CFEngineリポジトリをaptソースリストディレクトリ内のファイルに追加します。
このコマンドは、sh引数と-cオプションがないと、出力のリダイレクトがsudoによって行われないため、Permission deniedエラーが発生します。この問題を解決するために、shを使用してsudoを使ったシェルを実行し、-cオプションを使用してコマンドを渡します。
次に、aptがCFEngineリポジトリから新しいパッケージを確認できるように、updateコマンドを実行してください。
- sudo apt update
aptを使用してパッケージをインストールする
CFEngineパッケージがaptに登録されているので、aptを使用してCFEngineをインストールできます:
- sudo apt install cfengine-community
異なる(古い)オペレーティングシステムでパッケージがビルドされているという警告が表示された場合は、無視しても構いません。パッケージは引き続き機能します。
インストールの確認
インストールが完了すると、CFEngineを構成するコンポーネントが/var/cfengine/binに表示されます。この中で、エージェント(cf-agent)が最もよく操作するものです。このバイナリは、あなたが作成したポリシーを評価し、システムに変更を加え、実行した内容を記録します。デフォルトでは、エージェントは5分ごとに起動し、必要に応じて新しいポリシーを取得し、それを実施します。
エージェントが正常にインストールされたことを確認するには、次のコマンドを使用してください:
- sudo cf-agent --version
バージョン番号が画面に表示されます:
CFEngine Core 3.21.0
注: 本執筆時点での最新バージョンは 3.21.0 です。あなたのバージョン番号は異なる場合があります。
cf-agent コマンドが機能しない場合は、/var/cfengine/bin/ が PATH 変数に含まれていることと、cf-agent がそのディレクトリに存在することを確認してください。また、/var/log/CFEngine-Install.log にあるインストールログファイルをチェックして、何が問題であったかのヒントを得ることもできます。
ステップ2 — CFEngineの開始
CFEngineを開始するには、エージェントをブートストラップする必要があります。そのためには、次のコマンドを使用してください:
- sudo cf-agent --bootstrap 127.0.0.1
このコマンドはエージェントにCFEngineコンポーネントを起動し、このマシン127.0.0.1からポリシーを取得するように指示します。
将来的には、複数のマシンが同じサーバーからポリシーを取得したいと思うでしょう。その場合、127.0.0.1 はそのサーバーのIPアドレスに置き換えられます。しかし、CFEngineの学習を開始するためには、このチュートリアルでは1台のマシンと127.0.0.1を使用します。
あなたのサーバーにCFEngineがインストールされて実行されています。次のステップはポリシーの記述を開始することです。
ステップ3 — 最初のポリシーを作成する
CFEngineを使用してシステム管理タスクを自動化するには、CFEngineの独自のドメイン固有言語(DSL)で書かれたポリシーファイルを作成します。ポリシー言語が何をできるか、どのように構成されているかなど、詳しくはCFEngineのリファレンスドキュメントを参照してください。
ポリシーファイルはスクリプトとは異なり、宣言的です:システムの望ましい状態を記述し、CFEngineはそれがすでにその状態であるかを確認し、必要な場合にのみ変更を行います。ポリシーで表現したいことのいくつかの例は次の通りです:
- ユーザー
sammyが存在することを確認してください。 curlパッケージを常に最新の状態に保ち(インストールも),ください。telnetがインストールされていないことを確認してください。- テンプレートといくつかのデータからスクリプトファイルをレンダリングする。
- 実行中の場合は、
httpdのようなプロセスを停止してください。 /usr/binフォルダーに厳格な権限を課す。
これらすべての場合において、ポリシーを書いてサーバーの正しい場所(/var/cfengine/masterfiles)に配置します。その後、CFEngineは次のようになります:
- ポリシーファイルの配布を自動化し、他のブートストラップ済みホストに転送してください。
- 定期的に要件を強制実行します(デフォルトでは5分ごとにポリシーを実行)。たとえば、誰かがユーザー
sammyを削除したり、/usr/binの権限を変更した場合、これらの変更は5分以内に自動的に復元されます。 - 必要な場合(つまり、状態がすでに望ましいものでない場合)にのみ、ファイルに書き込むなどの変更を行ってください。
- 多くのプラットフォームの違いをあなたのために処理します(例えば、パッケージのインストール、ユーザーの作成、その他の操作に使用されるコマンドは、オペレーティングシステムによって異なります)。
このステップでは、「Hello World」ポリシーを作成して、テキスト「Hello!」をターミナルに出力します。
nano またはお気に入りのテキストエディタを使用して、新しいファイル ~/hello_world.cf を作成してください:
- nano ~/hello_world.cf
ファイル内に次の内容を追加してください:
bundle agent main
{
reports:
"Hello!";
}
CFEngineのポリシーは宣言的であり、上から下へと評価されるものではありません。
CFEngineのポリシー言語では、管理している内容に関する各ステートメントは約束と呼ばれます。約束はバンドルに整理されます。バンドルは、ポリシーのどの部分が実行されるか(または実行されないか)や、どの順序で実行されるかを選択できるため、有用です。
このポリシーでは、reportsはターミナルにメッセージを表示する責任を持つ約束タイプです。bundleの後のagentキーワードは、このバンドルがcf-agentコンポーネント用であることを示します。バンドルの名前はmainです。バンドルシーケンスは評価するバンドルを指定します。デフォルトでは、mainバンドルが含まれているため、変更する必要はありません。
ファイルを保存して閉じます。nanoを使用して、CTRL+Xを押して終了し、Yを押して保存し、ENTERを押してファイル名を確認してファイルを閉じます。
CFEngineは通常、rootユーザーとして実行されるため、ポリシーファイルに対して厳格な権限を要求することで、システムへの不正な変更を防ごうとします。(CFEngineが実行されるポリシーを他のユーザーが編集できるようにすると、特権ユーザーとしてシステムに変更を加えることができてしまいます)。chmodを使用してファイルの権限を編集し、他のユーザーがこのファイルを編集できないようにすることができます:
- chmod 600 hello_world.cf
ポリシーを実行するには、次のコマンドを使用してください:
- sudo cf-agent ~/hello_world.cf
CFEngineエージェントは、あなたのバンドルを見つけ(mainという名前のために)、その中の約束を見て、それを評価します。約束を評価する際、エージェントはシステムに変更を加える必要があるかどうかを確認します。この場合、約束は一つだけで、エージェントはそれを満たすために端末にメッセージを表示する必要があると判断しました。
次の出力を受け取ります:
R: Hello!
デフォルトでは、CFEngineは実行された内容を追跡し、最近評価された約束(最後の1分以内)をスキップします。ポリシーを再実行しようとすると、何も表示されません。このロックを無効にするには、--no-lockコマンドラインオプションを使用してください:
- sudo cf-agent --no-lock hello_world.cf
あなたは最初のポリシーを作成して実行しました。コンソールに出力できるのは便利ですが、このポリシーは実際にはシステムを変更しません。次のステップでそれを行います。
ステップ4 — テキストファイルの内容を管理するためのポリシーの作成
前のステップでは、ターミナルにメッセージを印刷するポリシーを作成しました。しかし、より現実的なユースケースは、インフラ内のすべてのホストに特定の内容を持つファイルが存在することを保証することです。このステップでは、内容がHello, CFEngine!のテキストファイル(/tmp/my_file.txt)を作成するポリシーを記述します。
新しいポリシーファイルを開きます、~/file_management.cf:
- nano ~/file_management.cf
次の内容を追加してください:
bundle agent manage_my_file
{
files:
"/tmp/my_file.txt"
content => "Hello, CFEngine!$(const.n)";
}
バンドルの名前はmainの代わりにmanage_my_fileです。さらにポリシーを書くにつれて、各バンドルにユニークで説明的な名前を付けるべきです。mainバンドルは1つだけです。
このポリシーはファイルを管理するため、約束の種類はfilesです。content属性はfilesの約束のために使用され、そのファイルの内容が何であるべきかを示します。文字列の最後の部分$ (const.n)は特別な変数const.nを展開し、ファイルの最後に改行を挿入します。
ファイルを保存して閉じてください。
以前と同様に、ポリシーファイルに厳格な権限を設定します:
- chmod 600 file_management.cf
次に、追加のコマンドラインオプションを使ってファイルを実行します:
- sudo cf-agent --no-lock --info ~/file_management.cf --bundle manage_my_file
--bundle manage_my_fileを指定する必要があります。なぜなら、もはやmainバンドルは存在しないからです。
--infoオプションは、CFEngineがシステムに対して行っている変更に関する情報メッセージを出力させます。
このコマンドの出力には、これらの変更に関する情報が含まれます。
info: Using command line specified bundlesequence
info: Created file '/tmp/my_file.txt', mode 0600
info: Updated file '/tmp/my_file.txt' with content 'Hello, CFEngine!
この出力は、CFEngineが/tmpディレクトリにmy_file.txtという名前のテキストファイルを作成し、その内容がHello, CFEngine!であることを示しています。
同じコマンドを再度実行すると、ファイルの作成と更新に関するメッセージは表示されなくなります。CFEngineはファイルの内容がすでに正しいことを認識しており、変更を加えません。
注意: --no-lock と --info は、ポリシーファイルを書くときやテストする際によく一緒に使われます。入力を少なくするために、使用できるショートカットもあります; -KI は --no-lock --info と同等です。
運用中のシステムポリシーがあるので、自分の監視なしで実行したいかもしれません。それは次のステップで行います。
ステップ5 — ポリシー実行の自動化
おそらく、コマンドラインからポリシーを手動で常に実行したいわけではないでしょう。CFEngineには、それを処理するための自動化機能が含まれています。
このステップでは、ポリシーを自動化するために、ポリシーファイルを指定された場所に置き、JSONファイルを更新します。そのJSONファイルは定期的にCFEngineコンポーネントにバックグラウンドで何をすべきかを指示し、コマンドラインから明示的かつ手動でコマンドを実行する必要がなくなります。
次のコマンドを使用して、前のステップで作成したポリシーファイルを推奨の場所にコピーしてください:
- sudo cp file_management.cf /var/cfengine/masterfiles/services/
すべてのCFEngineポリシーは/var/cfengine/masterfiles/内にあります。これには、あなたが書いたわけではないCFEngineに付属するポリシーも含まれます。カスタムポリシーをデフォルトポリシーから分けておくために、ポリシーファイルをservices/サブディレクトリに置くことをお勧めします。
CFEngineエージェントが新しいポリシーファイルを取得する際、ハブのこのディレクトリからコピーします。たとえ1台のマシンを使用しているだけでも、エージェントは同じように動作します:/var/cfengine/masterfiles内のファイルを探し、それを/var/cfengine/inputsにコピーします。新しいユーザーには、これらのパスを使用するのが最適です。パスをカスタマイズしたり、ポリシーファイルを他の場所に置いたりするには、権限やファイルのコピーおよび検索が正しく機能することを確認しなければならないため、より多くの作業が必要です。
次に、ポリシーファイルの場所と実行すべきバンドルを指定するためのaugments JSONファイルを作成します:
- sudo nano /var/cfengine/masterfiles/def.json
そのファイルに次の内容を追加してください:
{
"inputs": [ "services/file_management.cf" ],
"vars": {
"control_common_bundlesequence_end": [ "manage_my_file" ]
}
}
ポリシーを定期的に実行するためには(5分ごとに)2つのステップが必要です:エージェントがファイルを見つけて読み取り、エージェントがバンドルを実行することを確認してください。
def.jsonのinputsキーは、エージェントにどのポリシーファイルを読み取るかを指示します。この場合、エージェントは前のステップで作成したポリシーfile_management.cfを読み取ります。
varsキーは変数を定義するために使用できます。control_common_bundlesequence_end変数はデフォルトポリシーで使用されるため、そこに記述されたバンドル名はすべてbundlesequenceの最後に追加され、すべてのデフォルトバンドルの後に評価されます。これら2つの情報は、cf-agentがどのポリシーファイルを読み込むか、そしてそれらの中のどのバンドルを評価するかを、コマンドラインで指定することなく知っていることを意味します。
この時点で、あなたは/var/cfengine/masterfiles/の中でポリシーを編集しており、自動化は残りのことを処理します。より具体的には、cf-agentは定期的に起動して、あなたが記述した新しいポリシーファイルを取得します。エージェントはポリシーを読み取り評価し、すべての約束を履行し、必要に応じてマシンに変更を加えます(ファイルの編集やユーザーの作成など)。
このチュートリアルで書かれたポリシーに基づいて、エージェントが実行されるたびに、/tmp/my_file.txtがポリシーファイルに指定した内容で存在することが保証されます。
ファイルを保存して閉じてください。
自動化が機能していることを確認するために、最初にファイル管理ポリシーを実行したときに作成されたテキストファイルを削除してください:
- sudo rm /tmp/my_file.txt
5分後、CFEngineがバックグラウンドでmy_file.txtを再作成したかどうかを確認できます:
- cat /tmp/my_file.txt
Hello, CFEngine.
あるいは、ファイルの作成を早めることもできます:
- sudo rm /tmp/my_file.txt ; sudo cf-agent -Kf update.cf ; sudo cf-agent -KI
rm コマンドはファイルを削除するため、CFEngine は変更が必要であることを確認します。
最初の cf-agent コマンドは、ポリシーファイルを更新し、/var/cfengine/masterfiles から /var/cfengine/inputs にコピーします。
最後の cf-agent コマンドはあなたのポリシーを強制します。これにより、/tmp/my_file.txt ファイルを探し、必要に応じてそれを作成および編集します。
この場合、ファイルを削除した直後にエージェントを実行しているため、cf-agentはファイルを作成したことを出力する必要があります。(これらのコマンドの間にバックグラウンドでエージェントが実行される可能性はほとんどありません。)
注意: コマンド sudo cf-agent -Kf update.cf ; sudo cf-agent -KI は、CFEngineがデフォルトで5分ごとに実行するコマンドと似ています。したがって、このコマンドを実行することは、CFEngineが正常に動作している場合、5分待つのと同じ結果をもたらします。最初のエージェント実行はポリシーを更新し、2回目はポリシーを評価し、システムに変更を加えます。
このステップでは、CFEngineを使用して最初のシステム管理タスクを自動化しました。この例ではファイルの作成と編集に焦点を当てましたが、他のタスクのプロセスは同じです:ポリシーを書き、それを正しいディレクトリに置き、def.jsonファイルをそれに応じて更新します。
結論
あなたは今、単一のサーバーにCFEngineをインストールして起動しました。最初のポリシーを書き、自動的に実行されるように設定しました。
次のステップとして、ファイルの管理に関するこのチュートリアルのようなCFEngineの公式ドキュメントを確認してください:ファイルの作成、変更、削除。
質問がある場合や助けが必要な場合は、CFEngineのGitHubディスカッションのQ&Aセクションに自由に投稿してください。
