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