sexta-feira, 29 de julho de 2011

Cfengine tutorial prático de instalação cliente – servidor.

Introdução

Cfengine é um software utilizado para automatizar tarefas como instalação de programas e configurações de serviços em máquinas clientes de forma centralizada e controlada agilizando e otimizando o trabalho do profissional de TI.

O objetivo deste tutorial é demonstrar de maneira prática a instalação e configuração básica de um servidor Cfengine e de seus clientes, utilizando comunicação segura através de chaves criptografadas.

Para esse tutorial foi utilizado como servidor o Ubuntu server 11.04 e como cliente o Ubuntu desktop 10.10, no entanto o Cfengine pode ser configurado em diversos sistemas operacionais até mesmo no Windows (para utilizá-lo no Windows será preciso a instalação prévia do Cygwin).


Principais componentes do Cfengine:

Cabe aqui uma pequena definição dos componentes principais do Cfengine:

cf-promises – É um verificador e compilador para os arquivos de promises. É usado principalmente para checar as configurações desses arquivos.

cf-agent - Verifica as mudanças no diretório de atualizações do servidor a faz a sincronia no cliente.

cf-serverd – É o componente responsável por receber as requisições dos clientes e executar as políticas de um cliente. Segundo CFENGINE não é possível o envio operações de (push).

cf-execd – É o agendador de tarefas do Cfengine. Ele também coleta e executa saídas do cf-agent. Além de poder ser configurado para enviar emails ao administrador se necessário.

cf-runagent - É um programa auxiliar pode se comunicar com o cf-serverd e solicitar que ele execute o cf-agent.

cf-report - Gera relatórios em uma variedade de formatos para exportação ou
integração com outros sistemas.


Instalação e configuração no servidor


Como administrador execute o comando:

#apt-get install cfengine3

Crie na raiz uma pasta com o nome de cfengine e dentro desta uma pasta inputs.

# mkdir /cfengine
# mkdir /cfengine/inputs

Para configuração do servidor precisaremos criar quatro arquivos.

Arquivo 1: Dentro da pasta /cfengine crie o arquivo cf-serverd.cf com o seguinte conteúdo:

#--Inicio--#

body server control {

trustkeysfrom => { "192.168.1.18", "192.168.1.17" };

allowconnects => { "192.168.1.18", "192.168.1.17" };

maxconnections => "10";

logallconnections => "true";

}

bundle server access_rules {

access: "/cfengine/"

admit => { "192\.168\..*" };

}

#--Fim--#

As linhas

trustkeysfrom => { "192.168.1.18", "192.168.1.17" };
allowconnects => { "192.168.1.18", "192.168.1.17" };

é o lugar onde serão adicionados os ips das máquinas clientes que irão ter acesso ao servidor.


As linhas

access:

"/cfengine/"

admit => { "192\.168\..*" };

representam a pasta que os clientes terão acesso ao servidor, e a faixa de ips dos clientes com acesso autorizado.

Arquivo 2: Dentro da pasta /cfengine crie o arquivo update.cf com o seguinte conteúdo:

#--Inicio--#

body copy_from remote(server, path) {

servers => { "${server}" };

encrypt => "true";

trustkey => "true";

source => "${path}";

compare => "digest";

preserve => "true";

verify => "true";

purge => "true";

}

body depth_search recurse {

depth => "inf";

}

bundle agent update {

vars:

any::

"cfserverd" string =>"192.168.1.1";

"policyfiles" string =>"/cfengine";

"server_inputs" string =>"${policyfiles}/inputs";

"client_inputs" string =>"${sys.workdir}/inputs";

files:

any::

"${client_inputs}"

copy_from => remote("${cfserverd}","${server_inputs}"),

depth_search => recurse;

}

#--Fim--#



Na linha

"cfserverd" string =>"192.168.1.1";

é onde adicionamos o ip do servidor.


Na linha

"policyfiles" string =>"/cfengine";

Adicionamos a política de acesso a pasta cfengine (a mesma definida nas linhas access:

"/cfengine/" do arquivo cf-serverd.cf


Arquivo 3: Dentro da pasta /cfengine crie o arquivo promises.cf com o seguinte conteúdo:

#--Inicio--#

body common control {

bundlesequence => {

"update" };

inputs => { "update.cf","cf-serverd.cf" };

}

bundle agent hello {

commands:

any::

"/bin/date";

reports:

linux::

"Ola Mundo.";

}

#--Fim--#


Arquivo 4: Dentro da pasta /cfengine crie o arquivo failsafe.cf com o seguinte conteúdo:

#--Inicio--#

body common control{

bundlesequence => { "update" };

inputs => { "update.cf" };

}

#--Fim--#

Obs: Quando utilizarmos posteriormente o cf-agent ele sempre irá ler o arquivo promises.cf durante sua execução. Sendo assim todos os comandos a serem executados devem estar neste arquivo ou referenciado nele. Sendo assim o arquivo failsafe.cf não é realmente obrigatório, mas no entanto caso exista algum problema no arquivo promises.cf o cf-agent irá ler o arquivo failsafe.cf, que por sua vez chama o arquivo update.cf e busca atualizações ou correções no servidor.

Com os quatro arquivo prontos precisamos copiá-los para a pasta /etc/cfengine3 e move-los para /cfengine/inputs:

# cp promises.cf failsafe.cf update.cf cf-serverd.cf /etc/cfengine3
# mv promises.cf failsafe.cf update.cf cf-serverd.cf inputs

Agora geramos as chaves no servidor:

#cf-key

Afim de o servidor ler as configurações execute o comando:

#cf-serverd --verbose --no-fork

Quando a mensagem:

No new promises found
Waiting at incoming select...

finalize o processo CTRL+C.


Agora com o servidor configurado ele já pode ser iniciado:

#cf-serverd

Obs: A porta default do Cfengine é a 5308 sendo necessário ela estar liberada no servidor afim de permitir as conexões dos clientes.


Configuração do cliente:

Para configurar os clientes iniciamos com a instalação do pacote:

# apt-get install cfengine3

Geramos as chaves com o comando:

# cf-key

Precisamos agora copiar manualmente os arquivos failsafe.cf e update.cf criados anteriormente no servidor para a pasta /etc/cfengine3 do cliente.

Como root entre na pasta /etc/cfengine3 e execute o comando abaixo:

# cd /etc/cfengine3
#cf-agent –K --verbose –bootstrap

Se tudo estiver certo na pasta /var/lib/cfengine3/ppkeys do cliente irá aparacer a chave root-192.168.1.1.pub e no servidor root-192.168.1.18.pub (ou root-“ip que você configurou para o cliente”.pub).


Execute agora o comando:

# cf-agent

Com esse comando os arquivos da pasta /var/lib/cfengine3/inputs do cliente serão sempre sincronizados com conteúdo da pasta /cfengine/inputs no servidor.

Configurando cliente para atualizar automaticamente.

Claro que na prática o cf-agent não é executado manualmente no cliente afim de executarmos sincronização com o servidor, para isso utilizamos um outro componente do Cfengine o cf-execd que irá ficar ativo no cliente e de tempos em tempos executando o cf-agent a procura de atualizações.

Obs: Muitos utilizam para esse fim o próprio cron, no entanto não é recomendável uma vez que o cf-execd trás diversos recursos incorporados como o criação de logs para cada execução, além disso o cf-execd foi criado exclusivamente para tarefa de agendamento do Cfengine.

Crie o arquivo cf-execd.cf na pasta /etc/cfengine3

#--Inicio--#

body executor control {

splaytime => "1";

mailto => "root@192.168.1.1";

smtpserver => "192.168.1.1";

mailmaxlines => "1000";

schedule => { "Min00_05", "Min30_35" };

executorfacility => "LOG_DAEMON";

}

bundle agent executor {

processes:

any::

"cf-execd"

restart_class => "start_cfexecd";

commands:

start_cfexecd::

"/usr/local/sbin/cf-execd";

}

#--Fim--#

Execute o comando:

# cf-execd

Como teste final você pode criar algum arquivo no diretório /cfengine/inputs no servidor, aguardar o tempo programado no arquivo cf-execd.cf para atualização e verificar se o diretório /var/lib/cfengine3/inputs do cliente foi sincronizado.

Conclusão

Devido à falta de material em português que mostrassem de maneira prática e direta a configuração do Cfengine resolvi escrever esse tutorial. O objetivo não era ensinar a utilização prática, mas como configurar a comunicação entre o servidor e os clientes.

Agora com o servidor e os clientes comunicando-se, será preciso estudar sínteses de comandos e criação de configurações para o arquivo “promises.cf” afim de realmente automatizar as tarefas poder aplicar o Cfegine de maneira produtiva.

Referências

CFENGINE. Disponível em: <http:// www. cfengine. org> Acesso em: 28 jul. 2011.

CFENGINE 3, concept guide. Mark Burges.





Nenhum comentário:

Postar um comentário