Olá. Aqui é a Komiya.
Graças a você, tive a oportunidade de personalizá-lo, então gostaria de citar alguns deles e apresentá-los.
Coisas básicas, etc.,
Acho que você também deveria dar uma olhada no link abaixo e no "Solo-chef introdutório" e suas gotas.
Construindo um Servidor Nico Nico com Chef Solo e Solo de Faca (2) - Introdução - :d Engenheiro Wango Bromaga
chef-solo - Todo o conhecimento para ler e administrar Chef - Qiita
Técnicas de Chef para DevOps // Apresentador de Alto-Falantes
Além disso, estou muito ansioso para saber que um livro introdutório sobre práticas de chef será publicado na GW pela pessoa da Engine Yard (uma empresa que usa o serviço há cerca de 8 anos antes do lançamento do chef).
Esta é uma explicação do nó do Chef, papel, ambiente, atributo, dados_bags.
Acho que este artigo vai fornecer uma explicação básica e informações simples para personalização.
O único ambiente que realmente usou a receita descrita abaixo é o CentOS 6.4, e infelizmente, não podemos garantir que funcionará em um ambiente diferente.
Parece que receitas de uso geral (complexas) que garantem o funcionamento entre diferentes sistemas operacionais podem ser usadas em livros de receitas cheios de ☆ na comunidade opscode.
(Acho que não é adequado para a demanda adicionar o mínimo possível de coisas supérfluas ou criar receitas para ambientes ou procedimentos existentes.) )
A seguir está uma descrição do diretório diretamente no repositório chef.
Livros de receitas: armazenamento de livros de receitas de terceiros
Data_bags :d ata_bags armazenamento de dados
ambientes: Preferências de armazenamento de arquivos
nós: Armazenamento de arquivos de configuração de nós (host/servidor)
Funções: Configuração de papéis de armazenamento de arquivos
site-cookbooks: Um lugar para guardar seus próprios livros de receitas (livros incluem receitas, folhetos, etc.)
Cada termo é brevemente explicado abaixo.
・ohai
Esse comando recupera as informações do host que aplica a receita que está incluída com o chef.
É possível definir um atributo com base no valor obtido por ohai.
Por exemplo, se você quiser alterar o valor de configuração de acordo com a memória instalada do sistema operacional e o número de núcleos de CPU, ou o nome do host ou
É útil usá-lo quando você quer colocar informações únicas, como endereços IP, em um arquivo de configuração.
・node
e coloque um arquivo chamado hostname.json ou ipaddress.json diretamente sob o
Defina o atributo específico do servidor e o papel a ser atribuído.
・papel
Uma receita que combina servidores com o mesmo papel, como banco de dados e web, em um papel e os aplica a um grupo de servidores com a mesma função.
e parâmetros juntos.
・ambiental
Defina os atributos que precisam ser alterados para cada ambiente, como o ambiente de teste, ambiente de produção e ambiente de desenvolvimento.
(Parece que é possível corrigir a versão do livro de receitas no Chef-Server, mas não com o Chef-Solo)
・atributo
Esse é o parâmetro que você quer mudar para cada nó, função e ambiente.
Defina variáveis como <%= %> no arquivo que você chama do recurso template.
Isso é usado quando você quer alterar o valor do arquivo de configuração para cada função individual.
Você também pode definir um valor padrão em attributes/default.rb em cada livro de receitas, e
Você também pode definir com variáveis do recurso template. Você também pode definir o valor ohai como está.
・data_bags
Livros de receitas contêm dados globais que você não quer incluir.
Isso inclui informações do usuário.
Não são dados que mudam por função como o atributo, então eu escrevo em apenas um lugar.
Parece ser um bom lugar para colocar os dados que você quer carregar.
・Como aplicar a receita
Se quiser aplicar uma receita para algo em um host, pode especificar a receita após o host no comando faca, ou
Você precisa especificar a receita ou papel na execução_list do nó ou função.
Como apresentar isso como argumento diretamente para um comando faca, sem definir um papel ou nó:
Cozinheiro Solo da faca -O
*Este método não será capaz de gerenciar quais receitas foram aplicadas a qual host naquele repositório.
Não posso recomendar, mas acho que pode ser usado se você não quiser afetar o ambiente que já está rodando.
Exemplo de especificar que ela executa_list em nó:
[shell]vi
Exemplo de especificar um papel a ser executado_list: [shell]$ vi roles/API-ext.json ---------------- { "name":"API-ext", "chef_type": "role", "json_class":"Chef::Role", "default_attributes":{ "base_setting": { "swappiness": "0", "tcp_tw_reuse": "0", "tcp_tw_recycle": "0", "tcp_fin_timeout": "10", "tcp_max_syn_backlog": "8192", "somaxconn": "8192" } }, "override_attributes":" {}, "description":"função da API", "run_list": [ "receita[roles::API-ext]" ] } ---------------- $ cat site-books/roles/recipes/API-ext.rb ---------------- inclui_recipe "base_setting::common-pkgs" incluem_recipe "base_setting::sysctl" incluem_recipe "base_setting::ntpd" incluem_recipe "base_setting::rps_cpus" incluem_recipe "login-users::create_user" incluem_recipe "login-users::login-users:" incluem\ "login-users::chave_copy" inclui_recipe "usuários-login::" inclui\ "usuários-login::" api_user" inclui_recipe "java::java" inclui_recipe "nginx::nginx" inclui_recipe "nginx::nginx_virtual" inclui_recipe "reproduz::p LEI_recipe "mysqld::mysql-client" inclu_recipe em\ "git::git" inclui_recipe "Flydata::Flydata" inclui_recipe "munin::munin-node" inclui_recipe "munin::munin-node-API-PVP-robi" inclui_recipe "zabbix::zabbix-agent" ----------------[/shell] *Na seção acima, a receita necessária para API-ext.rb no livro de funções está incluída sem listar a receita no arquivo de funções.
*Na execução_list\ do arquivo JSON de node e role, é possível escrever receita e função com separação de vírgulas.
[[Tradução japonesa] Chef Iniciante Anti-Padrão por Julian Dunn #opschef_ja] (http://www.creationline.com/lab/3080)
Agora, recomenda-se gerenciar papéis em um livro de receitas.
Funções, as configurações do nó são feitas corretamente, você pode especificar o nome do host sem especificar um livro de receitas ou receita com -o, e
Execute o Knife Solo Cook e a receita será aplicada conforme você estiver definindo.
A ordem em que as receitas são aplicadas é basicamente especificada, mas o reinício dos serviços especificado nas notificações é
Depois que todas as receitas foram aplicadas (convergidas). Por favor, dê uma olhada no seguinte para facilitar a compreensão.
O equívoco de que as receitas do Chef são executadas de cima a baixo
・Sobre o método de teste
Como posso acrescentar mais adiante, você pode conferir a sintaxe do livro de receitas com o seguinte comando:
[shell] teste de livro de receitas com faca
・Exemplos de uso e procedimentos de implementação para atributos e _bags dados<br> Vamos listar exemplos, mas por favor, consulte também o link abaixo.
Entendendo o atributo [[chef] | Infraestrutura de TI Cadernos Diversos] (http://tech.blog.piyo.org/2012/05/23/chef-attribute%E3%81%AE%E7%90%86%E8%A7%A3/)
・Use os dados ohai para configurar de acordo com o número de memórias do sistema operacional e núcleos de CPU.
Ao usar ohai, você só precisa definir o recurso template na receita e definir as variáveis no arquivo de configuração.
Você não precisa definir um papel ou atributo de nó.
Se você digitar o comando ohai diretamente, pode ver que tipo de valor pode obter.
[shell]$ endereço de endereço ohai [ "192.168.1.133" ][/shell]
Defina 75% da memória interna do sistema operacional para innodb_buffer_pool_size [shell]$ vi site-cookbooks/mysqld/recipes/mysqld-server.rb template '/etc/my.cnf' do owner 'root' group 'root' source 'etc/my.cnf.erb' notifica :restart, 'service[mysql]' end $ vi site-cookbooks/mysqld/templates/default/etc/my.cnf.erb innodb_buffer_pool_size = <%= ("#{node[:memory][:total]}"[/\d+/].to_f * 1024 * 0,75 ).to_i %>[/shell]
Defina um valor equivalente ao número de núcleos de CPU instalados no sistema operacional para worker_processes. [shell]$ vi site-cookbooks/nginx/recipes/nginx.rb template "nginx.conf" do path "/etc/nginx/nginx.conf" source "etc/nginx/nginx.conf.erb" proprietário "root" group "root" modo 0644 notifica :reload, 'service[nginx]' end $ vi site-cookbooks/nginx/templates/default/etc/nginx/nginx.conf.erb worker_processes <%= nó[:cpu][:total] %>;[/shell]
・Defina nome do host e endereço IP usando os dados ohai [shell]$ vi site-cookbooks/zabbix/recipes/zabbix-agent.rb template '/etc/zabbix/zabbix_agentd.conf' do owner 'root' group 'root' source 'etc/zabbix/zabbix_agentd.conf' fim
$ vi site-cookbooks/zabbix/templates/default/etc/zabbix/zabbix_agentd.conf Nome do Host=<%= nó['nome do host'] %> $ cat site-cookbooks/mysqld/templates/default/etc/my.cnf.erb|grep endereço ip server-id = <%= nó[:ipaddress].split("."). last %> host-host de reporte = <%= nó[:ipaddress] %>[/shell]
Como diferentes valores podem ser definidos automaticamente para cada nó,
Acho muito conveniente porque você não precisa se preparar ou modificar com antecedência após fazer login e recarregar um por um.
- Chamar diferentes atributos para cada função no recurso template e refleti-los no arquivo de configuração.
A receita para sysctl no livro base_setting faz isso.
[shell]$ cat site-cookbooks/base_setting/recipes/sysctl.rb template "/etc/sysctl.conf" do owner 'root' group 'root' source 'etc/sysctl.conf.erb' mode 0644 end $ cat site-cookbooks/base_setting/templates/default/etc/sysctl.conf.erb vm.swappiness = <%= node['base_setting']['swappiness'] %> net.ipv4.tcp_tw_reuse = <%= node['base_setting']['tcp_tw_reuse'] %> net.ipv4.tcp_tw_recycle = <%= node['base_setting']['tcp_tw_recycle'] %> net.ipv4.tcp_fin_timeout = <%= node['base_setting']['tcp_fin_timeout'] %> net.ipv4.tcp_max_syn_backlog = <%= node['base_setting']['tcp_max_syn_backlog'] %> net.core.somaxconn = <%= node['base_setting']['somaxconn'] %> $ cat roles/db.json ~略~ "base_setting": { "swappiness": "0", "tcp_tw_reuse": "1", #バックエンドのdbはtcp接続をリサイクルする "tcp_tw_recycle": "1", #バックエンドのdbはtcp接続をリサイクルする "tcp_fin_timeout": "10", "tcp_max_syn_backlog": "8192", "somaxconn": "8192", "ntpserver1": "ntp.nict.jp" } ~略~ $ cat roles/API.json ~略~ "base_setting": { "swappiness": "0", "tcp_tw_reuse": "0", #フロントエンドのAPIはtcp接続をリサイクルしない "tcp_tw_recycle": "0", #フロントエンドのAPIはtcp接続をリサイクルしない "tcp_fin_timeout": "10", "tcp_max_syn_backlog": "8192", "somaxconn": "8192", "ntpserver1": "ntp.nict.jp" } ~略~[/shell] ※role毎に変えてる意味合い的にはスマホからwifi接続の接続元IPが同じになってる
Se vários terminais acessarem ao mesmo tempo, se você reciclar a conexão TCP, um pacote será
Como é descartado, ele deve ser reciclado no backend que tem conexão de um IP diferente
É para habilitá-lo e reduzir a carga.
No caso do MHA Manager, introduza RPM para Manager, caso contrário não introduza, etc.
[shell]$ cat site-cookbooks/mysqld/recipes/mysql-mha.rb if node[:mysqld][:mha] == 'manager' %W{perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Params-Validate perl-Time-HiRes}.each do |pkg| Pacote PKG não_if "rpm -qa|grep #{pkg}" Ação :install end end cookbook_file "/usr/local/src/#{mhamanager}" não_if "ls /usr/local/src/#{mhamanager}" fonte "usr/local/src/#{mhamanager}" fim omitido fim $ funções/mhamanager.json omitido "default_attributes":{ "mysqld": { "mha":"manager" }, omitido[/shell]
- Chamar um atributo diferente para cada nó com if para executar o recurso
Isso inclui trocar o conteúdo do arquivo de configuração e registrar o cron.
O escravo que deveria mudar para o mestre do banco de dados não habilita a leitura_only no arquivo de configuração,
O segundo escravo que não troca permite a leitura_only
[shell]$ site de gato-receitas/mysqld/receitas/mysqld-server.rb omitido se nó[:mysqld][:mha_nomaster] == template 'true' '/etc/my.cnf' o proprietário do grupo 'root' 'root' source 'etc/my.cnf_ro.erb' notifica :reiniciar, 'service[mysql]' end else template '/etc/my.cnf' do owner 'root' group 'root' source 'etc/my.cnf.erb' notifica :reiniciar, 'service[mysql]' end omitido $ cat nodes/db3.hoge.jp.json { "mysqld" : { "master" : "false", "only_mysql" : "true", "only_innodb":"true", "mha_nomaster" : "true" }, omitido[/shell]
cron resource para registrar e executar apenas em slave
[shell]omitido if node[:mysqld][:master] == 'false' cron "mysql_replication_check" não_if "crontab -l|grep rep_fail_mail.sh" minuto "0-59/15" hora "*" dia "*" mês "*" dia de semana "*" comando "/opt/bin/rep_fail_mail.sh > /dev/null 2>&1" ação :criar fim fim omitido $ nós cat/db1.hoge.jp.json { "mysqld" : { "master" : "true", omitido $ nós cat/db2.hoge.jp.json { "mysqld" : { "master" : "false", omitido[/shell]
- Executar recursos chamando um arquivo de configuração diferente com if para cada ambiente.
Ele é usado para distribuir o arquivo de configuração nginx da API. [shell]$ cat site-cookbooks/nginx/recipes/nginx_virtual.rb if node[:environment] == template 'huka' "/etc/nginx/conf.d/virtual.conf" do source "etc/nginx/conf.d/huka/virtual.conf.erb" proprietário "root" grupo "root" modo 0644 notifica :reload, 'service[nginx]' end elsif node[:environment] == template 'prd' "/etc/nginx/conf.d/virtual.conf" do source "etc/nginx/conf.d/prd/virtual.conf.erb" owner "root" group "root" mode 0644 notifies :reload, 'service[nginx]' end elsif node[:environment] == template 'stg' "/etc/nginx/conf.d/virtual.conf" do source "etc/nginx/conf.d/stg/virtual.conf.erb" proprietário "root" group "root" mode 0644 notifies :reload, 'service[nginx]' end end[/shell] Parece comum alterar o valor de atributos como a URL do conteúdo com o mesmo arquivo de configuração, mas isso porque eu não conheço os parâmetros antecipadamente.
Referência: Ambientes do Chef Solo - Diário de Hatena de Naoya
Carregue os dados de versão a partir de data_bags e defina o nome do pacote
Eu uso a maioria dos meus livros de receitas.
[shell]$ cat site-cookbooks/nginx/recipes/nginx.rb versão = data_bag_item('pkg_versions','nginx')['versão'] nginx_pkg="nginx-#{versão}.ngx.x86_64.rpm" omitido
$ knife solo data bag criar pkg_versions nginx $ knife solo data bag editar pkg_versions nginx $ knife solo data bag mostrar pkg_versions nginx id: nginx versão: 1.4.4-1.el6[/shell]
・Carregue dados do usuário _bags a partir dos dados\ e crie um usuário
login_users livros de receitas criar_user receitas [shell]$ site de gato-livros/login-usuários/receitas/criar_user.rb data_ids = dados_bag('usuários') dados_ids.cada do |id| u = data_bag_item('usuários', ID) nome = u['nome de usuário'] usuário u['nome de usuário'] não_if "id #{nome}" casa u['casa'] shell u['shell'] uid u['uid'] guid u['gid'] senha u[''password'] fim fim[/shell]
Uma receita usada carregando e usando dados criptografados com uma chave de criptografia na receita mysqld-server do livro de receitas mysqld.
[shell]$ cat site-cookbooks/mysqld/recipes/mysqld-server.rb omitido ## carregar dados_bag dados. root = Chef::EncryptedDataBagItem.load("mysqlusers","root") repl = Chef::EncryptedDataBagItem.load("mysqlusers","repl") suuser = root["user"] supass = root["pass"] repluser = repl["user"] replpass = repl["pass"] ### instalação segura, etc. mysqlconn = "/usr/bin/mysql -u root" if #{version} == '5.6' package 'expect' do :install not_if "rpm -qa|grep expect" template de fim "/tmp/setpass.sh" do only_if 'ls /root/.' mysql_secret' fonte "setpass.sh" fim bash "set_password" faz apenas_if "ls /root/.mysql_secret" código <<-EOC chmod +x /tmp/setpass.sh && /tmp/setpass.sh && rm -f /tmp/setpass.sh EOC end end bash "secure_installation" do ignore_failure true only_if "#{mysqlconn} -e 'mostrar bancos de dados;'" código <<-EOC #{mysqlconn} << EOF conceder tudo em *.* para #{suuser}@'%' identificado por "#{supass}"; conceder tudo em *.* para #{suuser}@'localhost' identificado por "#{supass}"; conceder tudo em *.* para #{suuser}@'::1' identificado por "#{supass}"; conceder tudo em *.* para #{suuser}@'127.0.0.1' identificado por "#{supass}"; conceder escravo de replicação, cliente de replicação em *.* para #{repluser}@'%' identificado por "#{replpass}"; abandonar teste de banco de dados; excluir do mysql.user onde a senha=''; esvaziar privilégios; EOF EOC end pfile="/root/.my.my." cnf" bash "create-pfile" não_if "ls #{pfile}" código <<-EOC eco '[mysqladmin]' >> #{pfile} echo "user= #{suuser}" >> #{pfile} echo "password = #{supass}" >> #{pfile} echo "" >> #{pfile} echo '[mysql]' >> #{pfile} echo "user= #{suuser}" >> #{pfile} echo "password = #{supass}" >> #{pfile} chmod 400 #{pfile} echo "#{supass}" >> /root/.} root mysql_pwd chmod 400 /root/.mysql_pwd fim EOC abreviação[/shell] Redefina a senha inicial da série 5.6 com expectativa com bash, conecte-se ao mysql e conceda isso.
Itens desnecessários são deletados e arquivos de senha são gerados por outros scripts.
Usei o MySQL para criar com o Chef - Qiita como referência.
*Para a chave de criptografia, você precisa gerar dados_bag_key e definir os dados_bag_path em .chef/knife.rb diretamente no repositório chef.
Gerar dados_bag_key
[shell]$ openssl rand -base64 512 |tr -d '\r\n' > ~/.chef/encrypted_data_bag_secret $ chmod 400 ~/.chef/encrypted_data_bag_secret $ vi .chef/knife.rb[/shell]
- Carregar dados de array a partir de dados_bags e refleti-los em múltiplas linhas
Isso é carregar dados_setting dados do recurso template da receita NTPD no livro base_bags receitas. [shell]$ cat site-cookbooks/base_setting/recipes/ntpd.rb ntpservers = data_bag_item('base_setting','ntpserver')['ntpservers'] template "/etc/ntp.conf" do path "/etc/ntp.conf" fonte "etc/ntp.erb" proprietário "root" grupo "root" modo 0644 notifica :restart, variáveis 'service[ntpd]' ({ :ntpservers => ntpservers }) fim
$ cat site-cookbooks/base_setting/templates/default/etc/ntp.conf.erb driftfile /var/lib/ntp/drift #server -4 <%= nó['base_setting']['ntpserver1'] %> iburst <% para ntpserver em @ntpservers %> servidor -4 <%= ntpserver["server"] %> iburst <% end %>
Definição de dados_bags $ knife solo data bag create base_setting ntpserver $ knife solo data bag edit base_setting ntpserver { "id": "ntpserver", "ntpservers": [ { "server": "ntp.nict.jp" }, { "server": "ntp.nict.jp" }, { "server" : "ntp.nict.jp" } } } } [/shell] O motivo pelo qual os três são ntp.nict.jp é porque o dig é adequado para múltiplos servidores no sistema DNS.
Para mais informações sobre como recuperar dados de array _bags a partir de dados, consulte a URL a seguir para uma explicação fácil de entender.
Toda a história do uso de databags (1)
Além disso, o que segue pode ser útil para personalização.
Personalizando seu ambiente com receitas de chef: Centro de Desenvolvedores
Desculpe se você acha que o ponto importante é um ponteiro.
Obrigado por ler o que foi acima por tanto tempo.