Rudder: Migrate from cfengine

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.