Ubuntu 20.04にCFEngine Community Editionをインストールして使用する方法
作家は、Write for Donationsプログラムの一環として、寄付を受ける団体としてOpen Internet/Free Speech Fundを選びました。
イントロダクション
CFEngineはITインフラストラクチャーのスケーラブルな設定管理ツールです。CFEngineを使用すると、Linux、Mac、Windows、BSD、Solaris、IBM AIX、HP-UXなどのインフラストラクチャー全体を管理するために同じツールとポリシーランゲージを使用できます。管理したい各マシンに(Cで記述された)エージェントをインストールします。CFEngineは多くのプラットフォームをサポートし、大規模なインフラストラクチャーや小さなインターネットオブ・シングス(IoT)デバイスなどのリソース制約のある環境に有用です。
このチュートリアルでは、Ubuntu 20.04にCFEngine Community Edition 3.21をインストールし、サンプルポリシーファイルを作成し、ポリシーの実行を自動化します。
前提条件
このチュートリアルを完了するためには、以下が必要です:
- One Ubuntu 20.04 server with a non-root sudo user. To set this up, follow our guide Initial Server Setup with Ubuntu 20.04.
- A way of running shell commands (including sudo), such as ssh.
- A text editor. This tutorial uses nano.
ステップ1 – CFEngineのインストール
このステップでは、aptとパッケージリポジトリを使用してCFEngineをインストールします。インストールにaptを使用する主な利点は、後でaptを使用してCFEngineをアップデートできることです。
異なる用途に応じてCFEngineをインストールする他の方法があります。
- cf-remote is a flexible choice that handles installing on multiple machines, different versions of CFEngine, and nightly builds.
- The quick-install shell script is a good choice for a single machine. You can install by copying a single command into the terminal.
- You can also download the packages directly from the website.
これらの代替手段のいずれかを使用してCFEngine CommunityまたはEnterpriseをインストールする場合は、インストール後にステップ2- CFEngineの起動に進むか、ステップ3- ブートストラップ後に最初のポリシーを作成することができます。
CFEngineの公開鍵の追加
CFEngineをaptを使用してインストールするには、aptがリポジトリにアクセスできるようにする必要があります。最初のステップは、CFEngineの公開GPGキーをaptのキーコレクションに追加して、aptがリポジトリからのパッケージを信頼できるようにすることです。
このコマンドを使用してキーをダウンロードしてください。 (Please download the key with this command.)
- 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”
このコマンドはaptソースリストディレクトリ内のファイルにCFEngineリポジトリを追加します。
「-c」オプションと「sh」引数がない場合、このコマンドは「Permission denied」エラーが発生します。なぜなら、「sudo」では出力のリダイレクトが実行されていないからです。この問題を解決するために、「sudo」を使用してシェルを実行し、「-c」オプションを使用してコマンドを渡すために「sh」を使用します。
今、アップデートコマンドを実行してaptがCFEngineリポジトリから新しいパッケージを見るようにしてください。
- sudo apt update
「apt」を使用してパッケージをインストールする。
CFEngineパッケージがaptに登録されたので、aptを使用してCFEngineをインストールすることができます。
- sudo apt install cfengine-community
もし異なる(旧い)オペレーティングシステムでパッケージが作成された警告を受け取った場合でも、無視して問題ありません。パッケージはまだ動作します。
インストールの確認を行う。
インストールが完了すると、/var/cfengine/binにCFEngineを構成するコンポーネントが表示されます。その中で、cf-agentと呼ばれるエージェントがほとんどの時間において対話することになります。このバイナリは、あなたが書いたポリシーを評価し、システムに変更を加え、したことについての情報を記録します。デフォルトでは、エージェントは5分ごとに起動し、必要に応じて新しいポリシーを取得し、それを適用します。
次のコマンドを使用して、エージェントが正常にインストールされたかどうかを確認してください。
- sudo cf-agent –version
バージョン番号が画面に表示されます。
CFEngine Core 3.21.0
Note
cf-agentコマンドが動作しない場合は、PATH変数に/var/cfengine/bin/が含まれており、そのディレクトリに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は既にその状態が存在するかどうかを確認し、必要な場合のみ変更を加えます。ポリシーで表現したいことの一部の例は以下の通りです:
- Ensure the user sammy exists.
- Keep the curl package updated (and installed).
- Ensure telnet is not installed.
- Render a script file from a template and some data.
- Stop a process, like httpd, if it’s running.
- Enforce strict permissions on the /usr/bin folder.
これらのケースにおいては、方針を書き、サーバーの適切な場所(/var/cfengine/masterfiles)に配置します。その後、CFEngineが次の操作を行います。
- Automate distribution of the policy file by transferring it to your other bootstrapped hosts.
- Enforce your requirements regularly (running the policy every five minutes by default). For example, if someone deleted the user sammy, or changed the permissions on /usr/bin, these changes would be restored automatically within five minutes.
- Only make changes, such as writing to a file, if it’s necessary (that is, if the state is not already as desired).
- Handle many platform differences for you (for example, the commands used to install packages, create users, and other operations vary depending on the operating system).
このステップでは、「Hello World」というテキストをターミナルに出力する「Hello World」ポリシーを作成します。
好きなテキストエディター、もしくは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のエージェントは、メインの名前によってあなたのバンドルを見つけ、その中の約束を評価します。約束を評価する際、エージェントはシステムに変更を加える必要があるかどうかを確認します。この場合、約束はただ1つあり、エージェントはその約束を満たすためにメッセージを端末に出力する必要があると判断しました。
以下の出力が得られます。
R: Hello!
デフォルトでは、CFEngineは何が行われたかを追跡し、最近評価された約束(直近の1分以内)をスキップします。ポリシーを再実行しようとすると、何も表示されません。–no-lockコマンドラインオプションを使用して、このロックを無効にすることができます。
- sudo cf-agent –no-lock hello_world.cf
最初のポリシーを作成して実行しました。コンソールに出力できることは便利ですが、このポリシーは実際にはシステムを変えません。次のステップでそれを行います。
ステップ4 – テキストファイルの内容を管理するためのポリシーの作成
前のステップで、ターミナルにメッセージを表示するためのポリシーを作成しました。しかし、より現実的な使用例は、インフラストラクチャ内のすべてのホストに特定の内容のファイルが存在することを確認することです。このステップでは、テキストファイル(/tmp/my_file.txt)を作成し、その中に「こんにちは、CFEngine!」という内容を入れるポリシーを作成します。
新しい方針ファイル、~/file_management.cfを開く。
- nano ~/file_management.cf
以下のコンテンツを追加してください。 (Ika no kontentsu wo tsuika shite kudasai.)
bundle agent manage_my_file
{
files:
"/tmp/my_file.txt"
content => "Hello, CFEngine!$(const.n)";
}
バンドルの名前は「manage_my_file」です。一つのメインバンドル以外には、それぞれユニークで具体的な名前を付けるべきです。メインバンドルは一つだけです。
このポリシーはファイルを管理するため、その承諾タイプはファイルです。コンテンツ属性はファイルの承諾に使用され、そのファイルの内容が何であるべきかを示しています。文字列の最後の部分、$(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でバンドルの指定が必要です。
–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がHello、CFEngine!という内容のテキストファイルであるmy_file.txtを/tmpディレクトリに作成したことを示しています。
同じコマンドを再実行した場合、ファイルの作成および更新に関するメッセージは表示されません。CFEngineは、ファイルの内容が既に正しいことを認識し、変更を行いません。
Note
あなたが動作するシステムポリシーを持っているので、監視なしで実行したい場合があるかもしれません。次の手順でそれを行います。
ステップ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 にコピーします。新規ユーザーの場合は、これらのパスを使用することが最適です。パスをカスタマイズしたり、ポリシーファイルを他の場所に配置する場合は、アクセス権限やファイルのコピーと検索が正しく機能するようにするために、もっと作業が必要です。
次に、ポリシーファイルの場所と実行すべきバンドルを指定するために、拡張JSONファイルを作成してください。
- sudo nano /var/cfengine/masterfiles/def.json
そのファイルに次の内容を追加してください。
{
"inputs": [ "services/file_management.cf" ],
"vars": {
"control_common_bundlesequence_end": [ "manage_my_file" ]
}
}
ポリシーを定期的に実行するためには、2つのステップが必要です(5分ごとに):エージェントがファイルを見つけて読み込むことを確認し、エージェントがバンドルを実行することを保証します。
def.jsonのinputsキーは、エージェントにどの方針ファイルを読み込むか指示します。この場合、エージェントは前のステップで作成した方針ファイルであるfile_management.cfを読み込みます。
varsキーは変数を定義するために使用できます。control_common_bundlesequence_end変数はデフォルトのポリシーで使用されるため、そこに追加したバンドル名はbundlesequenceの最後に追加され、デフォルトのバンドル全てが評価された後に評価されます。これらの情報を合わせると、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.
代わりに、ファイルの作成を早めることもできます。 (Kawari ni, fairu no sakusei o hayameru koto mo dekimasu.)
- 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はファイルが作成されたことを表示するべきです。(これらのコマンドの間にバックグラウンドでエージェントの実行が行われる可能性はほぼありません。)
Note
このステップでは、CFEngineを使用して最初のシステム管理タスクを自動化しました。この例ではファイルの作成と編集に焦点を当てましたが、別のタスクのプロセスも同じです。ポリシーを作成し、適切なディレクトリに配置し、def.jsonファイルを適切に更新するだけです。
結論
今、あなたは単一のサーバーにCFEngineをインストールし、起動しました。最初のポリシーを作成し、自動実行するように設定しました。
次のステップとして、CFEngine公式ドキュメンテーションを参照してください。たとえば、ファイルの管理に関するチュートリアル「ファイルの作成、変更、削除」を確認してみてください。
質問がある場合や助けが必要な場合は、CFEngineのGitHubディスカッションのQ&Aセクションに投稿してください。