The following standalone promise installs rudder-agent
on a currently managed cfengine
host.
The container
class is here only for me to identify OpenVZ
guests.
Use at your own risk and modify it at your convenience.
bundle agent rudder_agent_install {
vars:
container::
"repo_content" string => "[Rudder]
name=Rudder 2.7 Repository
baseurl=http://repos/rudder/test/RHEL_6/
gpgcheck=0
";
files:
container::
"/etc/yum.repos.d/rudder.repo"
create => "true",
edit_line => append_to_repo_file("$(repo_content)");
packages:
container::
"rudder-agent"
package_policy => "add",
package_method => yum_rpm_sta,
classes => repaired_("kick_inventory");
methods:
kick_inventory::
"any" usebundle => rudder_config;
}
bundle agent rudder_config {
files:
"/var/rudder/cfengine-community/policy_server.dat"
create => "true",
edit_line => append_to_repo_file("rudder");
commands:
"/opt/rudder/bin/cf-agent -KI -D force_inventory";
"/etc/init.d/cf-serverd stop";
"/etc/init.d/cf-execd stop";
}
bundle edit_line append_to_repo_file(list) {
insert_lines:
"$(list)";
}
body delete tidyfiles_ {
rmdirs => "true";
dirlinks => "delete";
}
body classes repaired_(new_class) {
promise_repaired => { "$(new_class)"};
}
body package_method yum_rpm_sta {
package_changes => "bulk";
package_list_command => "/bin/rpm -qa --qf '%{name} %{version}-%{release} %{arch}\n'";
package_patch_list_command => "/usr/bin/yum --quiet check-update";
package_list_name_regex => "^(\S+?)\s\S+?\s\S+$";
package_list_version_regex => "^\S+?\s(\S+?)\s\S+$";
package_list_arch_regex => "^\S+?\s\S+?\s(\S+)$";
package_installed_regex => ".*";
package_name_convention => "$(name)";
# set it to "0" to avoid caching of list during upgrade
package_list_update_command => "/usr/bin/yum --quiet check-update";
package_list_update_ifelapsed => "240";
package_patch_installed_regex => "^\s.*";
package_patch_name_regex => "([^.]+).*";
package_patch_version_regex => "[^\s]\s+([^\s]+).*";
package_patch_arch_regex => "[^.]+\.([^\s]+).*";
package_add_command => "/usr/bin/yum -y install";
package_update_command => "/usr/bin/yum -y update";
package_patch_command => "/usr/bin/yum -y update";
package_delete_command => "/bin/rpm -e --nodeps --allmatches";
package_verify_command => "/bin/rpm -V";
}
Let's see the code in details.
First install the repo file and install rudder-agent
package:
vars:
container::
"repo_content" string => "[Rudder]
name=Rudder 2.7 Repository
baseurl=http://repos/rudder/test/RHEL_6/
gpgcheck=0
";
files:
container::
"/etc/yum.repos.d/rudder.repo"
create => "true",
edit_line => append_to_repo_file("$(repo_content)");
packages:
container::
"rudder-agent"
package_policy => "add",
package_method => yum_rpm_sta,
classes => repaired_("kick_inventory");
Then if package has been installed, call the bundle rudder_config
:
methods:
kick_inventory::
"any" usebundle => rudder_config;
Populate /var/rudder/cfengine-community/policy_server.dat
with your Rudder server name rudder
then run the Rudder agent with force_inventory
class to force node to send its inventory to the server, then stop running cfengine
processes.
bundle agent rudder_config {
files:
"/var/rudder/cfengine-community/policy_server.dat"
create => "true",
edit_line => append_to_repo_file("rudder");
commands:
"/opt/rudder/bin/cf-agent -KI -D force_inventory";
"/etc/init.d/cf-serverd stop";
"/etc/init.d/cf-execd stop";
}
Everything else is cfengine
functions to make all that work.
Finally use cf-agent -b rudder_install -D container -f /path/to/the/promise.cf
to actually run this promise.
Rudder agent sets a cron job in /etc/cron.d/rudder-agent
which should take care of starting itself in the following 5 minutes.