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 "server-id = 103" }
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
< { deve conter '10.0.0.240 xxx-web03' }
---
> ele { deve conter '10.0.0.241 xxx-db03' }
75c75
< # kernelparams para servidor web
---
> # kernelparams para dbserver
82c82
< its(:value) { should equalizar 30 }
---
> its(:value) { deve equalizar 0 }
86c86
< its(:value) { deve equalizar 0 }
---
> its(:value) { should equalizar 1 }
90c90
< its(:value) { deve equalizar 0 }
---
> its(:value) { should equalizar 1 }
94c94
< its(:value) { should equalizar 60 }
---
> its(:value) { deve equalizar 10 }
98c98
< its(:value) { should equalizar 4096 }
---
> its(:value) { should equalizar 8192 }
102c102
< its(:value) { should equalizar 4096 }
---
> 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 "server-id = 103" }
fim
descreve o arquivo ('/etc/logrotate.d/mysqld') fazer
ele { deveria be_file }
It { deve conter "/usr/bin/mysqladmin flush-logs" }
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("#{pkg}") 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/)