Cfengine

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

ATENCIO Aquest article encara és un copia-pega sense molt de sentit fins que tot siga comprovat i funcione.

Introducció a Cfengine

Cfengine és una eina que permet automatitzar la gestió de sistemes des d'un únic punt utilitzant un llenguatge d'alt nivell basat en polítiques de configuració amb la seva pròpia sintaxi.

És programari lliure (llicència GPL) i des de la versió 3.0 (juny del 2008) hi ha una distribució comercial.

Avantatges d'utilitzar Cfengine

L'automatització aporta valor quan el nombre de servidors a controlar és important (més de 10-20) i tots ells comparteixen una cosa en comú. Si no és així, no té gaire sentit utilitzar aquest tipus d'eines.

Cfengine és una eina pensada per solucionar problemes comuns a la gestió d'un centre de dades, aquestes són algunes de les seves principals avantatges:

  • Centralitzar. Cfengine permet automatitzar la gestió de tota una infraestructura Linux des d'un únic punt i amb una única eina, açò fa que en una solució escalable: l'esforç necessari per a gestionar 1 màquina és el mateix que per 100.000.
  • Reduir errors. L'automatització elimina tasques repetitives i com a conseqüència directa s'eviten errors humans reduint incidències i millorant l'estabilitat dels serveis. El disseny de Cfengine basat en la "Promise Theory" permet propagar canvis de forma fiable i amb garanties.
  • Estalviar temps. En automatitzar tasques amb Cfengine guanyem temps de dues formes: 1) es redueix el temps necessari per a la posada en marxa de nous serveis i aplicar canvis-aquí és on neix el concepte DevOps-i 2) en evitar haver d'entrar via SSH als servidors per "treballar" manualment l'administrador té més temps per a la seva veritable treball: millorar la infraestructura evitant que errors coneguts tornin a passar.
  • Documentació. El treball de l'administrador de sistemes queda "auto-documentat": cada regla en Cfengine defineix una tasca. Generalment la configuració de Cfengine es combina amb un sistema de control de versions (Git, Subversion, etc.), De manera que tindrem un registre complet de tots els canvis realitzats històricament en la infraestructura, informació que podem "reciclar" amb eines tipus " cf-know "i convertir-les en documentació. Quan entra un nou empleat llegint aquest codi tindria una idea actualitzada de la configuració dels sistemes.


cfengine al simarro

Si podem fer que la configuració de servidors o clients puga ser administrada de manera remota fàcilment i per a tots, estalviariem molt de temps. Tal vegada es puga implementar en el servidor zentyal o en el servidor central

Arquitectura

Els components de cfengine són:

  • Un servidor (cfservd): conté el conjunt de normes a aplicar a els clients que controla.
  • Un client (cfagent): a cada client que volem controlar tindrem instal·lat cfagent. El sistema utilitzat és pull, és a dir que és el client el que es connecta al servidor per tal d'obtenir les normes que el client ha d'aplicar.
  • El planificador (cfexecd): Controla l'execució de les tasques.

Cfengine a més proporciona altres eines com:

La connexió entre els clients i els servidors es controla amb claus públiques i privades i s'utilitza un sistema de confiança en les dues direccions.

Instal·lació

$ sudo apt-get install cfengine3 

Fitxers instal·lats

$ dpkg -L cfengine3 
/.
/usr
/usr/sbin
/usr/sbin/cf-know
/usr/sbin/cf-promises
/usr/sbin/cf-agent
/usr/sbin/cf-monitord
/usr/sbin/cf-serverdv
/usr/sbin/cf-execd
/usr/sbin/cf-runagent
/usr/sbin/cf-key
/usr/sbin/cf-report
/usr/share
/usr/share/doc
/usr/share/doc/cfengine3
/usr/share/doc/cfengine3/examples
/usr/share/doc/cfengine3/examples/failsafe.cf
/usr/share/doc/cfengine3/examples/library.cf
/usr/share/doc/cfengine3/examples/promises.cf
/usr/share/doc/cfengine3/examples/site.cf
/usr/share/doc/cfengine3/examples/update.cf
/usr/share/doc/cfengine3/changelog.gz
/usr/share/doc/cfengine3/README.Debian
/usr/share/doc/cfengine3/copyright
/usr/share/doc/cfengine3/changelog.Debian.gz
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/cf-execd.8.gz
/usr/share/man/man8/cf-monitord.8.gz
/usr/share/man/man8/cf-report.8.gz
/usr/share/man/man8/cf-know.8.gz
/usr/share/man/man8/cf-runagent.8.gz
/usr/share/man/man8/cf-promises.8.gz
/usr/share/man/man8/cf-key.8.gz
/usr/share/man/man8/cf-agent.8.gz
/usr/share/man/man8/cf-serverd.8.gz
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/cfengine3
/etc
/etc/cfengine3
/etc/default
/etc/default/cfengine3
/etc/init.d
/etc/init.d/cfengine3
/var
/var/lib
/var/lib/cfengine3
/var/lib/cfengine3/bin
/var/lib/cfengine3/inputs

Comandes

CF-promises

El verificador promesa i compilador. Això s'utilitza per preveure una sèrie de promeses de configuració abans d'intentar executar.

cf-agent

Aquest és l'instigador del canvi. L'agent és la part de Cfengine que manipula els recursos del sistema.

CF-serverd

El servidor és capaç de compartir arxius i rebre les sol·licituds per executar la política existent en una màquina individual. No és possible enviar (push) nova informació a Cfengine des de l'exterior.

CF-execd

Aquest és un dimoni de la programació (que pot complementar o substituir cron). També funciona com un contenidor, l'execució i la recol·lecció de la sortida del CF-agent i missatges de correu electrònic si és necessari per un compte de sistema.

CF-RunAgent

Es tracta d'un programa d'ajuda que es pot parlar amb CF-serverd i demanar que s'executi cf-agent amb la seva política actual. Per tant, pot ser utilitzat per simular la pulsació dels canvis en els exèrcits de cfengine, si la seva pòlissa inclou de comprovar si hi ha actualitzacions.

CF-report

Això genera informes de resum i altres en una varietat de formats per a l'exportació o la integració amb altres sistemes.

CF-know

Aquest agent pot generar un mapa de la norma ISO tema estàndard a partir d'una sèrie de promeses sobre el coneixement del sistema. S'utilitza per a la prestació de la documentació com una web semàntica.

Llenguatge cfengine

Cfengine és principalment un llenguatge declaratiu que descriu com les coses han de ser; també s'utilitza però una mica de llenguatge imperatiu per indicar com s'han de fer les coses.

Amb el llenguatge de cfengine s'escriuen policy rules o promises de com el sistema ha de ser configurat.

How to get to the promised state is inherent or built-in to Cfengine.

L'objectiu de cfengine és fer d'administrador de sistema automatitzat i realitzar els canvis necessaris per tal de tenir el sistema en l'estat correcte. Per exemple, podem comprovar amb cfengine si ens falta un tasca cron i si no està afegir-la.

La feina real de l'administrador del sistema és configurar el administrador del sistema automàtic i monitoritzar el seu funcionament.

és una eina poderosa i cal utilitzar-la amb cura

Gramàtica

La gramàtica de cfengine és:

     type:

       classes::

        "promiser" -> { "promisee1", "promisee2", ... }

           attribute_1 => value_1,
           attribute_2 => value_2,
           ...
           attribute_n => value_n;

On type pot ser:

  • commands: executar ordres externes
  • files: gestionar fitxers (permisos, copiar fitxers, etc.)
  • edit_line: gestiona el contingut de fitxers (normalment fitxers de configuració)
  • interfaces: configuració de la xarxa.
  • methods: Els mètodes són conjunts de promeses.
  • packages: gestió de paquets
  • processes: gestió de processos
  • storage: gestió dels discos i dels sistemes de fitxers.
  • vars: definició de variables?

Exemples:

Executar un ordre

   commands:
 
      "/bin/echo hello world";

Un altre exemple:

   files:

      "/tmp/test_plain" -> "John Smith",

           comment => "Make sure John's /tmp/test_plain exists",
           create  => "true";

Exemples

Hola mon!

body common control {
   bundlesequence => { "hello" };
}

bundle agent hello {
reports:
   linux::
   # This is a comment
   "Hello, world.";
}

Components:

  • bundles: Els bundles o promise bundles són conjunts de promeses. Cada bundle té un nom (a l'exemple hello). Aquest nom s'utilitza a l'hora de fer referència al bundle, per exemple al executar-lo (línia bundlesequence => { "hello" };).
  • promises: Una promesa és un declaració d'una política. Per exemple, podem crear una promesa que indiqui que el fitxer /etc/shadow només és llegible per l'usuari root. Cfengine és el responsable de complir les promeses.
  • reports: és un dels tipus de cfengine possibles. S'utilitza per tal de generar informació (en aquest cas un text)
  • classes: A l'exemple linux és una classe. Amb les classes podeu identificar el tipus de sistema operatiu:
ultrix, sun4, sun3, hpux, hpux10, aix, solaris, osf, irix4, irix, irix64, sco, freebsd, netbsd, openbsd, bsd4_3, newsos, 
solarisx86, aos, nextstep, bsdos linux, debian, cray, unix_sv, GnU, NT.

Assegurar-se que existeix un fitxer al sistema

Creeu un fitxer amb el següent contingut:

$ joe test.cf
########################################################
body common control

{
version => "1.0";
bundlesequence  => { "test1"  };
}

######################################################## 

bundle agent test1

{
 

   files:

      "/tmp/test_plain" -> "John Smith",

           comment => "Make sure /tmp/test_plain exists",
           create  => "true";

}

Per executar-lo:

$ cf-agent -f test.cf

Comprovar que un servei està funcionant

body common control

{
version => "1.0";
bundlesequence  => { "check_service_running"  };
}
 
bundle agent check_service_running {

   vars:
       "service" slist => {"ntpd", "portmap"};
       "daemon_path" string => "/etc/init.d";

   processes:

           "$(service)"
               comment => "Check processes running for '$(service)'",
               restart_class => "restart_$(service)";

   commands:

       "${daemon_path}/${service} start"
           comment => "Execute the start command for the service",
           ifvarclass => "restart_${service}";

}


Modificació de fitxers de configuració

TODO

Funcions:

  • LocateLineMatching
  • ReplaceAll
  • InsertLine
  • AppendIfNoSuchLine
  • HashCommentLinesContaining

Hi ha dos formes principals d'editar fitxers de configuració (TODO):

  • Template based configuration: The easiest and safest way is to use templates, along with variables that hold the desired values. The file to configure is replaced by the result of the application of the values into the template. However, it doesn’t always fit well in an existing and heterogeneous environment, for instance if you want to gradually roll out Configuration Management.
  • File editing: The most versatile approach is to edit the file, adding or modifying some lines, and removing the unwanted ones. It does fit well in heterogeneous systems, allowing for fine-grain tuning of what is to be managed and configured. However one has to think of all the potential lines of a file: those to be managed, those of no relative importance, and those which are critical.

Fitxers de configuració controlats per plantilles. Configuració de /etc/resolv.conf

Els fitxer de cfengine:

Cal que canvieu les variables resolvers i searchlist per adaptar-les a la vostra configuració
body common control {
   bundlesequence => { "set_dns_configuration" } ;
}

#######################################################################
# Configure DNS
# Change resolvers ant seachlist to your configuration
#######################################################################
bundle agent set_dns_configuration {
   vars:
       "resolvers" string => "8.8.8.8";
       "searchlist" string => "normation.com";

   files:
       "$(sys.resolv)"
           create => "true",
           edit_defaults => empty,
           edit_line => expand_template("dns.tml"),
           comment => "Configuring the resolv.conf file";
}

#######################################################
# Replace the content of a file by the content of the
# template, with the expanded variables
#######################################################
bundle edit_line expand_template(templatefile) {
   insert_lines:
       "$(templatefile)"
           insert_type => "file",
           expand_scalars => "true";
}

# This body comes from the cfengine_stdlib.cf
body edit_defaults empty {
   empty_file_before_editing => "true";
   edit_backup => "false";
}

I la plantilla:

$ cat dns.tml
#############################################################
### This file is configured by Cfengine.
### Manually editing the file might lead Cfengine
### to reset its content
#############################################################
search $(set_dns_configuration.searchlist)
nameserver $(set_dns_configuration.resolvers)



Instal·lació en Ubuntu

Referència: http://cfengine.com/manuals/cf3-quickstart

Artícul principal instal·lar cfengine en ubuntu

Exemples pràctics

solucions cfengine

Fonts:

http://woop.es/2011/06/introduccion-cfengine/ http://acacha.org/mediawiki/index.php/Cfengine

https://cfengine.com/forum/read.php?6,23125