CFEngine
8870 ワード
この文書はCFEngine Core 3.9.1に基づく
Cfengineは最も歴史のある構成管理ソフトウェアである.多くの後発ショー(puppet,saltstack,Chef...)を受けたがしかし、CFEは生き残ることに成功した.他の構成管理ソフトウェアに比べて、CFEの最も明らかなメリットは次のとおりです.依存が少なく、配置が便利である.現在のバージョンでは、パッケージを1つインストールするだけで、コマンドを1つ実行することで導入を完了できます. の運行オーバーヘッドが小さく、効率が高いCFEはc/c++で作成し、運行効率は疑いの余地がない. アーキテクチャの簡単な最も核心的なコンポーネントはcf-agentの1つだけで、その他のコンポーネントは実はすべてオプションです.cf-serverdは、通常、ポリシーファイルのダウンロードを提供するファイルサーバにすぎない.ポリシーファイルの解析はagent側で行う.したがって、CFEのサーバ側は、他の構成管理ソフトウェアに比べて、より多くのagent側を管理することができる.cf-execdもタイマーにすぎない.したがって、rsyncでポリシーファイルを同期し、crondでcf-agentを定期的に実行すると、cf-agentとcf-serverdを完全に起動することはできません. DSLは特定のプログラミング言語に依存する. 安全外部はcf-agentの実行、およびクラスの定義のみをトリガすることができる.cf-agentでポリシーファイル以外のコマンドを実行できません.
Install
公式文書を参照
ソフトウェアのインストールが完了すると、
COMPONENT
cf-execd
周期的にcf-agent実行をトリガする.デフォルト間隔は5分です.
cf-runagent
cf-runagentは、cf-agentの実行(cf-serverdを介して)をリモートで一括トリガすることができる.このプロセスでは、cf-agent実行時のclassをテストclassを指定することで、ターゲットマシンに任意のポリシーを適用することができる. は、バッチ実行ツール、例えばansibleの一部を代替するように、コマンド実行をリモートで一括トリガすることができる.しかし、このようにトリガコマンドは、ポリシーファイルにおいて予め定義されている必要があり、パラメータを伝達することができないため、柔軟性にやや欠けている.
Modules
使い方は二つあります Set variables and classes based on command output lines which begin with a ^ are protocol extensions ^context=xyz sets the module context to xyz instead of the default ^meta=a,b,c sets the class and variable tags for any following definitions to a, b, and c
lines which begin with a + are treated as classes to be defined (like -D) lines which begin with a - are treated as classes to be undefined (like -N) lines which begin with = are scalar variables to be defined lines which begin with = and include [] are array variables to be defined lines which begin with @ are lists. lines which begin with % are data containers. The value needs to be valid JSON and will be decoded.
usemodule()
Promis
Command
Files
edit_line
edit_lineは、ファイルの内容、特に「行」単位の/簡単なプロファイルを柔軟に制御することができる.しかし、複雑な場合、構造化されたプロファイルは力不足に見える.
もう一つの問題はedit_に基づいてlineはファイルの内容を制御するが、プロファイルの完全な内容を制御することは困難であり、配置が収束しにくい.だからeditは強くお勧めしませんline.
edit template template_method => "cfengine", native-CFEngine template format, default. v3.3.0 template_method => "mustache". v3.6.0
edit_templateは長年にわたって追加したい機能です.しかし、テンプレートをサポートしていないcfengine 2時代でも実現できないわけではなく、少し面倒なだけです.
edit_xml
テンプレートがあればこれは必要ありませんedit_lineの問題と同様に、配置の完全な内容を制御ことができず、配置が収束しにくい.
Q&A
policy_の決定方法server.
/var/cfengine/policy_server.datにはpolicy_が保存されていますserverのアドレス
これらの変数の値はpolicy_server.datの内容が決まる.
デフォルトではpolicy fileはどのように更新されますか?
controls/cf_serverd.cf
controls/cf_execd.cf
cf_からserverd.cfとcf_execd.cfではcfを通過してもserverdかcf_かexecd実行cf_Agentはまずsysを実行する.update_policy_pathのポリシーは、ポリシーファイルを更新する.じゃあupdate_policy_パスは誰ですか?次のコマンドで確認できます.
/var/cfengine/inputs/update.cfは関連ポリシーファイルの大量更新を導入した
主な更新ロジックはcfe_に含まれます.internal/update/update_policy.cf中
この段落はpolicyをチェックします.servers上のcf_promises_validatedが更新されたかどうか、policy_を決定します.servers上のポリシーファイルに変化があるかどうか.
policy_サーバ上のポリシーファイルが変化すると、ローカルのポリシーファイルが更新される.クライアントとpolicyを見てみましょうサーバ自体の更新ロジックは同じである.
cfengine_internal_disable_cf_promises_validatedが設定されている場合、サーバ側のcf_にかかわらずpromises_validatedファイルに変化があるかどうか、validated_updates_readyというクラスはいずれも設定、すなわちクライアントに更新をトリガーする.
しかしcontrols/update_def.cfではcfengineが見えますinternal_disable_cf_promises_validatedのデフォルトは設定されていません.つまりデフォルトではcf_を通過する必要があります.promises_validatedファイルの状態で更新か否かを判断する.
copy_from u_rcpの定義では、クライアント更新時にserversプロパティ(policy_server)が入力パラメータに設定されているが、policy_が指定されていないことがわかる.server更新時のservers.実際、copy_fromのデフォルトserversはlocalhost,policy_サーバ更新時はネイティブからファイルを同期するので指定する必要はありません.
Link Hard and Soft Classes common attributes
Cfengineは最も歴史のある構成管理ソフトウェアである.多くの後発ショー(puppet,saltstack,Chef...)を受けたがしかし、CFEは生き残ることに成功した.他の構成管理ソフトウェアに比べて、CFEの最も明らかなメリットは次のとおりです.
Install
公式文書を参照
ソフトウェアのインストールが完了すると、
/var/cfengine/bin/cf-agent --bootstrap
を実行して初期化する必要がある.COMPONENT
cf-execd
周期的にcf-agent実行をトリガする.デフォルト間隔は5分です.
cf-runagent
cf-runagentは、cf-agentの実行(cf-serverdを介して)をリモートで一括トリガすることができる.このプロセスでは、cf-agent実行時のclassを
--define-class, -D value
オプションで定義することができる.トリガを必要とするcf-agentは、--select-class, -s value
によりスクリーニングすることができる.実際に使用する場合、これらのメカニズムには2つの側面があります.Modules
使い方は二つあります
Promis
Command
Files
edit_line
edit_lineは、ファイルの内容、特に「行」単位の/簡単なプロファイルを柔軟に制御することができる.しかし、複雑な場合、構造化されたプロファイルは力不足に見える.
もう一つの問題はedit_に基づいてlineはファイルの内容を制御するが、プロファイルの完全な内容を制御することは困難であり、配置が収束しにくい.だからeditは強くお勧めしませんline.
edit template
edit_templateは長年にわたって追加したい機能です.しかし、テンプレートをサポートしていないcfengine 2時代でも実現できないわけではなく、少し面倒なだけです.
edit_xml
テンプレートがあればこれは必要ありませんedit_lineの問題と同様に、配置の完全な内容を制御ことができず、配置が収束しにくい.
Q&A
policy_の決定方法server.
/var/cfengine/policy_server.datにはpolicy_が保存されていますserverのアドレス
default:cfe_autorun_inventory_cmdb.sys#policy_hub 192.168.80.136 source=agent
default:def.policy_servers {"192.168.80.136"} source=promise
default:def.sys#policy_hub 192.168.80.136 source=agent
default:sys.policy_hub 192.168.80.136 source=bootstrap
これらの変数の値はpolicy_server.datの内容が決まる.
デフォルトではpolicy fileはどのように更新されますか?
controls/cf_serverd.cf
!windows::
# last single quote in cfruncommand is left open, so that
# arguments (like -K and --remote-bundles) are properly appended.
cfruncommand => "$(def.cf_runagent_shell) -c \'
$(sys.cf_agent) -I -D cfruncommand -f $(sys.update_policy_path) ;
$(sys.cf_agent) -I -D cfruncommand";
controls/cf_execd.cf
!windows::
exec_command => "$(sys.cf_agent) -Dfrom_cfexecd,cf_execd_initiated -f \"$(sys.update_policy_path)\" ; $(sys.cf_agent) -Dfrom_cfexecd,cf_execd_initiated";
cf_からserverd.cfとcf_execd.cfではcfを通過してもserverdかcf_かexecd実行cf_Agentはまずsysを実行する.update_policy_pathのポリシーは、ポリシーファイルを更新する.じゃあupdate_policy_パスは誰ですか?次のコマンドで確認できます.
$ cf-promises --show-vars |grep update.cf
default:sys.update_policy_path /var/cfengine/inputs/update.cf source=agent
/var/cfengine/inputs/update.cfは関連ポリシーファイルの大量更新を導入した
body common control
{
bundlesequence => {
"update_def",
"u_cfengine_enterprise",
@(u_cfengine_enterprise.def),
"cfe_internal_dc_workflow",
"cfe_internal_bins",
"cfe_internal_update_policy",
"cfe_internal_update_bins",
"cfe_internal_update_processes",
};
version => "update.cf $(update_def.current_version)";
inputs => {
@(cfengine_update_controls.update_def_inputs),
"cfe_internal/update/update_bins.cf",
"cfe_internal/update/cfe_internal_dc_workflow.cf",
"cfe_internal/update/cfe_internal_local_git_remote.cf",
"cfe_internal/update/cfe_internal_update_from_repository.cf",
"cfe_internal/update/update_policy.cf",
"cfe_internal/update/update_processes.cf"
};
}
主な更新ロジックはcfe_に含まれます.internal/update/update_policy.cf中
!am_policy_hub:: # policy hub should not alter inputs/ uneccessary
"$(inputs_dir)/cf_promises_validated"
comment => "Check whether a validation stamp is available for a new policy update to reduce the distributed load",
handle => "cfe_internal_update_policy_check_valid_update",
copy_from => u_rcp("$(master_location)/cf_promises_validated", @(update_def.policy_servers)),
action => u_immediate,
classes => u_if_repaired("validated_updates_ready");
この段落はpolicyをチェックします.servers上のcf_promises_validatedが更新されたかどうか、policy_を決定します.servers上のポリシーファイルに変化があるかどうか.
am_policy_hub|validated_updates_ready:: # policy hub should always put masterfiles in inputs in order to check new policy
"$(inputs_dir)"
comment => "Copy policy updates from master source on policy server if a new validation was acquired",
handle => "cfe_internal_update_policy_files_inputs_dir",
copy_from => u_rcp("$(master_location)", @(update_def.policy_servers)),
depth_search => u_recurse("inf"),
file_select => u_input_files,
action => u_immediate;
policy_サーバ上のポリシーファイルが変化すると、ローカルのポリシーファイルが更新される.クライアントとpolicyを見てみましょうサーバ自体の更新ロジックは同じである.
"validated_updates_ready"
expression => "cfengine_internal_disable_cf_promises_validated",
comment => "If cf_promises_validated is disabled, then updates are
always considered validated.";
cfengine_internal_disable_cf_promises_validatedが設定されている場合、サーバ側のcf_にかかわらずpromises_validatedファイルに変化があるかどうか、validated_updates_readyというクラスはいずれも設定、すなわちクライアントに更新をトリガーする.
"cfengine_internal_disable_cf_promises_validated"
expression => "!any",
comment => "When cf_promises_validated is disabled remote agents will
always scan all of masterfiles for changes. Disabling this
is not recomended as it will increase the load on the policy
server and increases the possibility for remote agents to
recieve broken policy.";
しかしcontrols/update_def.cfではcfengineが見えますinternal_disable_cf_promises_validatedのデフォルトは設定されていません.つまりデフォルトではcf_を通過する必要があります.promises_validatedファイルの状態で更新か否かを判断する.
body copy_from u_rcp(from,server)
{
source => "$(from)";
compare => "digest";
trustkey => "false";
!am_policy_hub::
servers => { "$(server)" };
cfengine_internal_encrypt_transfers::
encrypt => "true";
cfengine_internal_purge_policies::
purge => "true";
cfengine_internal_preserve_permissions::
preserve => "true";
}
copy_from u_rcpの定義では、クライアント更新時にserversプロパティ(policy_server)が入力パラメータに設定されているが、policy_が指定されていないことがわかる.server更新時のservers.実際、copy_fromのデフォルトserversはlocalhost,policy_サーバ更新時はネイティブからファイルを同期するので指定する必要はありません.
Link