詳細検索

Receitas de teste escritas no Chef (especificação do servidor)

Avatar
por komi

Receitas de teste escritas no Chef (especificação do servidor)
Traduzido do 日本語 • Ver original

Olá. Aqui é a Komiya.

Essa é a última vez.
Aqui está como testar as receitas introduzidas da última vez. Especificação do servidor.

Escrevi no link abaixo por que o Serverspec é bom, mas acho que os pontos a seguir são bons.
・Não é uma ferramenta de teste Chef, mas uma ferramenta externa, então não há dependências (também pode ser usada em puppet).
・O conceito de design é simples e fácil de usar, então foi fácil de usar sem muito esforço.

Referência:
Especificação do servidor no hbstudy #45 Solo Introdutório de Chef Pegando o recurso "Introdução a Marionetes" de treinamento para kayac/iniciantes_type manual avançado_tipsncstudy#05 Materiais práticos paralelos_tests

・Configuração
As versões 0.3 e 0.6 mostraram que a forma como os testes eram escritos era um pouco diferente, então recomendo a nova que segue o manual.
[shell]# Instalação de rubygems delícia

Instalação de Gem ServerSpec Rake

especificaçãodo do servidor-init

Selecione um tipo de backend: 

  1) SSH
  2) Executivo (local)

Número de seleção: 1

Instância y/n: y
Nome da instância de entrada: 10.0.0.241
 + especificação/10.0.0.241/ 
 + especificação/10.0.0.241/httpd_spec.rb[/shell]  
  
  
  
  
  
  
<br>Quando o comando terminar de ser executado, ele criará alguns arquivos conforme descrito acima.<br>```

\[shell\]# serverspec-init ~omitido~ Nome do host alvo: 10.0.0.240 + spec/10.0.0.240/ + spec/10.0.0.240/httpd\_spec.rb\[/shell\]  
Após especificar SSH e inserir o host de destino, um diretório para cada host era criado.   
  
Vou escrever um teste.   
  
\[shell\]# vi spec/10.0.0.240/httpd\_spec.rb exige 'spec\_helper' 

Descreva 'httpd' fazer ele { deveria be_installed } ele { deveria be_enabled } ele { deve be_running } fim

Descreva 'porta 80' faça ele { deve be_listening } fim

Descreva '/etc/httpd/conf/httpd.conf' ele { deveria be_file } it { deve conter "ServerName localhost:80" } fim[/shell]
Mudei do DetectOS para o RedHat (porque é o CentOS)
```

[shell]# vi spec/spec_helper.rb incluir Serversdesign::Helper::RedHat[/shell]
Modificar a configuração do ssh para conseguir passar as informações de conexão
[shell]# vi .ssh/config Host 10.0.0.240 Nome do Host 10.0.0.240 User root Port 22 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile "/root/.ssh/komi-test.pem" IdentitiesOnly sim LogLevel FATAL Host 10.0.0.241 Nome do Host 10.0.0.241 User root Port 22 UserKnownHostsFile /dev/null StrictHostKeyChecking sem senhaAutenticação sem IdentityFile "/root/.ssh/komi-test.pem" IdentitiesOnly yes[/shell]
Modifique o nome do arquivo de teste no lado do banco de dados e modifique o conteúdo para corresponder à entidade
[shell]# MV Spec/10.0.0.241/httpD_spec.RB Spec/10.0.0.241/mysqld_spec.rb

vi spec/10.0.0.241/mysqld_spec.rb

exigir 'spec_helper' 

Descreva 'mysql-server' faça
  ele { deveria be_installed }
fim

Descreva o 'mysqld' faça
  ele { deveria be_enabled }
  ele { deve be_running }
fim

Descreva 'porta 3306' faça
  ele { deve be_listening }
fim

Descreva '/etc/my.cnf' faça
  ele { deveria be_file }
  ele { deve conter &quot;server-id = 103&quot; }
fim[/shell]<br>Por enquanto, vou verificar se o teste está como escrito<br>```

\[shell\]# especificação rake (em /root) /root/.rbenv/versions/1.9.2-p290/bin/ruby -S rspec spec/10.0.0.240/httpd\_spec.rb spec/10.0.0.241/mysqld\_spec.rb ............ 

Terminou em 0,74866 segundos 12 exemplos, 0 falhas[/shell]
Parece que o que escrevi foi bem.
Em caso de erro, o comando seguinte que falhou e seu retorno são impressos, tornando muito fácil de entender.
```

[shell]Fracassos:

  1) mysql-server
     Falha/Erro: deve { deve be_enabled }
       chkconfig --list mysql-server | grep 3:on
       Informações de leitura de erros no serviço MySQL-Server: Nenhum arquivo ou diretório desse tipo

  2) mysql-server
     Falha/Erro: deve { deve be_running }
       ps aux | grep -w -- mysql-server | grep -qv grep[/shell]<br>→ esses são ditos serem mysql-server nos comandos chkconfig e ps, então vou corrigir separando os blocos de be_installed, ativado e de execução.<br>
<br>
<br>Em seguida, vamos adicionar todos os testes necessários e testá-los<br>Para reutilizar receitas e testes como um conjunto, acredita-se que seria melhor dividir o arquivo de teste da mesma forma que a receita.<br>```

    Por enquanto, vou dividir os arquivos de teste em unidades de livro de receitas.   
Talvez você possa criar um arquivo de teste com um nome correspondente à receita de cada diretório host.   
Testes base_setting\ de receitas são duplicados, então eu gostaria de gerenciá-los para cada função, mas isso será um problema no futuro.   
  
  

\[shell\]# vi spec/10.0.0.240/base\_spec.rb exige 'spec\_helper' 

Criar um diretório de backup

descreva o arquivo('/etc/.backup') fazer ele { deveria be_directory } fim

descreva o arquivo('/etc/hosts') ele { deveria conter '10.0.0.240 xxx-web03' } fim

Definindo o gateway padrão

Descreva default_gateway fazer its(:ipaddress) { should equalizar '10.0.0.93' } its(:interface) { deve equalizar 'eth0' } fim

SELINUX está desativado

Descreva o SeLinux Faça ele { deveria be_disabled } fim

Excluir kernel de atualização no yum.conf

descreva o arquivo('/etc/yum.conf') faça ele { deve conter 'exclude=kernel*' } fim

Desativar o ipv6 no modprobe.conf

descreva o ficheiro('/etc/modprobe.conf') faça It { deve conter 'options ipv6 disable=1' } fim

O pacote exigido deve ser incluído

%w{ sendmail ntp }.each do |pkg| descreva o pacote("#{pkg}") faça ele { deveria be_installed } fim fim

Queda desnecessária do serviço

%w{ ip6tables iptables messagebus kudzu }.each do |services| Descrever o serviço("serviços") faça ele { should_not be_enabled } ele { should_not be_running } fim fim

Configurações de corte de tronco

descreve file('/etc/logrotate.d/syslog') fazer ele { deve conter 'compress' } ele { deve conter 'rotação 53' } fim

Permissão cron desnecessária deve ser 0

%w{ makewhatis.cron mlocate.cron prelink }.each do |files| Descreva o File("/etc/cron.daily/#{Files}") faça ele { deve be_mode 0 } fim fim

descreva o arquivo ('/etc/cron.weekly/makewhatis.cron') fazer ele { deve be_mode 0 } fim

cron para ntpdate

Descrever cron do It { deve have_entry '0 * * * * /usr/sbin/ntpdate -bs 10.0.0.93' } fim

fuso horário

#describe arquivo('/etc/localtime') fazem

it { deve be_linked_to '/usr/share/zoneinfo/Japan' }

#end

kernelparams para servidor web

descrever 'parâmetros do kernel Linux' Contexto linux_kernel_parameter('net.ipv4.tcp_syncookies') fazer its(:value) { deve equalizar 1 } fim

Contexto linux_kernel_parameter('vm.swappiness') fazer its(:value) { deve fazer eq 30 } fim

Contexto linux_kernel_parameter('net.ipv4.tcp_tw_reuse') fazer its(:value) { deve equalizar 0 } fim

Contexto linux_kernel_parameter('net.ipv4.tcp_tw_recycle') fazer its(:value) { deve equalizar 0 } fim

Contexto linux_kernel_parameter('net.ipv4.tcp_fin_timeout') fazer its(:value) { should equalizar 60 } fim

Contexto linux_kernel_parameter('net.ipv4.tcp_max_syn_backlog') fazer its(:value) { should equalizar 4096 } fim

Contexto linux_kernel_parameter('net.core.somaxconn') fazer its(:value) { should equalizar 4096 } fim fim

Testando usuários de login

%w{ xxx-op yyy-op dev }.each do |u| Descreva o usuário("#{u}") faça ele { deveria existir } ele { deveria belong_to_group 'roda' } fim fim


# Especificação do Ancinho

Omitido Terminou em 3,13 segundos 40 exemplos, 0 falhas[/shell]
Por enquanto, me mudei até agora.
Se você não atualizar a especificação do servidor para 0.6, alguns linux_kernel_paramater e cron não vão funcionar porque não existe esse método.

```

[shell]# cp -p spec/10.0.0.240/base_spec.rb spec/10.0.0.241/

vi spec/10.0.0.241/base_spec.rb

Diff spec/10.0.0.240/base_spec.rb spec/10.0.0.241/base_spec.rb

9c9
&lt; { deve conter '10.0.0.240 xxx-web03' }
--- 
&gt; ele { deve conter '10.0.0.241 xxx-db03' }
75c75
&lt; # kernelparams para servidor web
--- 
&gt; # kernelparams para dbserver
82c82
&lt; its(:value) { should equalizar 30 }
--- 
&gt; its(:value) { deve equalizar 0 }
86c86
&lt; its(:value) { deve equalizar 0 }
--- 
&gt; its(:value) { should equalizar 1 }
90c90
&lt; its(:value) { deve equalizar 0 }
--- 
&gt; its(:value) { should equalizar 1 }
94c94
&lt; its(:value) { should equalizar 60 }
--- 
&gt; its(:value) { deve equalizar 10 }
98c98
&lt; its(:value) { should equalizar 4096 }
--- 
&gt; its(:value) { should equalizar 8192 }
102c102
&lt; its(:value) { should equalizar 4096 }
--- 
&gt; its(:value) { should equalizar 8192 }[/shell]<br>```

・Escrevi um pouco do teste do livro de receitas httpd  
\[shell\]requer 'spec\_helper' 

%w{ httpd php php-pecl-ssh2 php-mysql php-common php-devel php-pear php-pdo php-mbstring php-pecl-apc php-mcrypt php-cli mysql-libs }.each do |pkg| descreva o pacote("#{pkg}") faça ele { deveria be_installed } fim fim

Descrever Service('httpd') Fazer ele { deveria be_enabled } ele { deve be_running } fim

descrever porta(80) fazer ele { deve be_listening } fim

descreve o ficheiro ('/etc/httpd/conf/httpd.conf') fazer ele { deveria be_file } it { deve conter "ServerName localhost:80" } fim

Teste básico de autenticação

descreve o ficheiro ('/etc/httpd/conf.d/basic_auth.conf') ele { deveria be_file } it { deve conter "Exigir usuário válido" } fim

Descreva o arquivo ('/etc/httpd/conf/.htpasswd') ele { deveria be_file } ele { deve conter "dev" } fim

WP conteúdo existe teste

descreve o ficheiro ('/var/www/html/wp-config.php') ele { deveria be_file } fim

Teste de montagem do fusível

#describe arquivo ('/var/www/html/assets')

it { deve be_mounted.with(:type => 'fuse') }

it { should be_mounted.with(:options => { :rw => true } ) }

#end[/shell]
```

  • Adicionaram alguns testes para mysqld
    [shell]requer 'spec_helper'
Descreva o pacote('mysql-server') fazer
  ele { deveria be_installed }
fim

Descrever o serviço('mysqld') fazer
  ele { deveria be_enabled }
  ele { deve be_running }
fim

Descrever Port(3306) Fazer
  ele { deve be_listening }
fim

descreva o arquivo('/etc/my.cnf') faça
  ele { deveria be_file }
  ele { deve conter &quot;server-id = 103&quot; }
fim

descreve o arquivo ('/etc/logrotate.d/mysqld') fazer
  ele { deveria be_file }
  It { deve conter &quot;/usr/bin/mysqladmin flush-logs&quot; }
fim

descreve o ficheiro ('/opt/bin/mysql-back.sh') fazer
  ele { deveria be_file }
  ele { deveria be_executable }
fim[/shell]<br>・Escreva um teste para munin<br>```

\[shell\]# vi spec/10.0.0.240/munin\_spec.rb exigem 'spec\_helper' 

%w{ munin-node perl-DBI }.each do |pkg| descreva o pacote("#{pkg}") faça ele { deveria be_installed } fim fim

Descrever o serviço('munin-nó') fazer ele { deveria be_enabled } ele { deve be_running } fim

Descrever o porto(4949) fazer ele { deve be_listening } fim

Plugins de munin

%w{ CPU memória df load tcp iostat if_eth0 if_err_eth0 }.each do |plg| Descreva o File("/etc/Munn/Plugins/#{plg}") Faça ele { deveria be_file } fim fim

Plugins munin para httpd

%w{ apache_accesses apache_processes }.each do |plg| Descreva o File("/etc/Munn/Plugins/#{plg}") Faça ele { deveria be_file } fim fim

Plugins munin para mysql

#%w{ mysql_slowqueries mysql_queries mysql_threads }.each do |plg|

descreve o arquivo("/etc/munin/plugins/#{plg}") faça

deve { be_file }

fim

#end


# CP -P Spec/10.0.0.240/munin\_spec.rb spec/10.0.0.241/munin\_spec.rb

# vi spec/10.0.0.241/munin\_spec.rb

# Diff Spec/10.0.0.240/munin\_spec.rb spec/10.0.0.241/munin\_spec.rb

26,33c26 < %w{ apache_accesses apache_processes }.each do |plg| < descrever file("/etc/munin/plugins/#{plg}") faz < isso { deve be_file } < fim < fim < < ## Plugins de munin para mysql < #%w{ mysql_slowqueries mysql_queries mysql_threads }.each do |plg|

> #%w{ apache_accesses apache_processes }.each do |plg| 38a32,38 > # Plugins munin para mysql > %w{ mysql_slowqueries mysql_queries mysql_threads }.each do |plg| > descrever o arquivo("/etc/munin/plugins/#{plg}") faça > isso { deveria be_file } > fim > fim >[/shell]
Escreva um teste Zabbix
```

[shell]# vi spec/10.0.0.240/zabbix_spec.rb exigem 'spec_helper'

%w{ zabbix-agent zabbix zabbix-jp-release }.each do |pkg|
  descreva o pacote(&quot;#{pkg}&quot;) faça
    ele { deveria be_installed }
  fim
fim

Descrever o serviço('Zabbix-agent') fazer
  ele { deveria be_enabled }
  ele { deve be_running }
fim

Descreva a porta(10050) faça
  ele { deve be_listening }
fim

descreve o ficheiro ('/opt/bin/mem_monitor.sh')
  ele { deveria be_executable }
fim

CP -P Spec/10.0.0.240/Zabbix_spec.RB Spec/10.0.0.241/Zabbix_spec.RB

Especificação do Ancinho

~Omitido~
Terminou em 5,09 segundos
152 exemplos, 0 falhas[/shell]<br>Testei sem problemas.<br>É questionável se o teste é suficiente.<br>```

  
Não testei o usuário nem a replicação, mas parece que só consigo verificar a saída padrão com o tipo de recurso de comando.   
O comando é este ↓,   
mysql -u raiz -p'cat /path_to_file' -s -e "mostrar concessões para repl@'10.0.0.%';"   
Só consigo pensar em escrever um teste que diga que o valor de retorno é este ↓  
CONCEDER ESCRAVO DE REPLICAÇÃO, CLIENTE DE REPLICAÇÃO EM _._ PARA 'repl'@'10.0.0.%' IDENTIFICADO POR SENHA '\*43E209EED080057E35C2630AC06D3296\*\*\*\**\*'   
Fico pensando se os mais complexos parecem criar um comando de verificação com um valor de retorno simples.   
  

Essas informações também são  
・Você pode exportar HTML com o rake spec SPEC\_OPTS="--format html". Se não for um erro, apenas OK será retornado, então é bom verificar se você quer um relatório.   
・ Instale CI\_reporter e adicione 'CI/Reporter/Rake/RSPEC' ao Rakefile.  
 Pode ser convertido para XML no formato JUnit (disponível em Jenkins)  
・Se você usar [paralelo_tests\](https://github.com/grosser/parallel_tests) pode rodar em paralelo e é rápido. Fica bom quando há muitas unidades.   
・Se você quiser usar um papel ou atributo, os seguintes sites podem ser úteis.   
 [advanced\_tips](http://serverspec.org/advanced_tips.html)[Como Lidar com Valores de Atributos Específicos do Host no Serverspec](http://mizzy.org/blog/2013/05/12/2/) [Leitura chef json no Serverspec](http://blog.kenjiskywalker.org/blog/2013/07/31/serverspec-attribute/) Vamos [escrever testes para um ambiente de servidor com serverspec](http://www.slideshare.net/ikedai/serverspec)  
  
  
Este é o fim da série de longa-metragem Chef.   
Obrigado por dedicar tanto tempo.   
  
  
Clique aqui para o número de trás↓  
 [Introdução do Chef-Solo e Vagrant (Ambiente VPC)](https://blog.colorkrew.com/chef-solo_vagrant_install/) [Ambiente antes de escrever receitas no Chef-Solo (Vagrantfile, função, nó, dados_bags)](https://blog.colorkrew.com/vagrantfile_role_data_bags/) [Escrevendo receitas para procedimentos existentes no Chef 1 (configuração padrão)](https://blog.colorkrew.com/chef-solo_base_setting-recipe/) [Escrevendo receitas para procedimentos existentes no Chef 2 (criação de usuário)](https://blog.colorkrew.com/chef-solo_user_manage/) [Escrevendo receitas para procedimentos existentes no Chef 3 (servidor WEB)](https://blog.colorkrew.com/chef-solo_webservers_recipe/) [Escrevendo receitas para procedimentos existentes no Chef4 (servidor de base de dados)](https://blog.colorkrew.com/chef-solo_dbservers_recipe/) [Escrevendo receitas para procedimentos existentes no Chef 5 (munin, zabbix)](https://blog.colorkrew.com/chef-solo_munin_zabbix_recipe/) [Testando receitas escritas no Chef (serverspec)](https://blog.colorkrew.com/chef_serverspec/)  
   
   
   
   
   
   
   
   
   
 

Related Articles