詳細検索

Qual é a utilidade do data_bags?

Avatar
por komi
6 min de leitura

Qual é a utilidade do data_bags?
Traduzido do 日本語 • Ver original

Olá. Aqui é a Komiya. Preciso explicar dados_bags internamente, então vou escrever aqui também.

O que segue é como usar os dados_bags\ hoje em dia.

  1. Carregar informações do usuário do sistema operacional para uso do sistema que não são gerenciadas pelo LDAP e adicioná-las como receita 2. Armazenar certificados SSL, carregá-los a partir de receitas e defini-los em templates 3. Carregar informações do servidor NTP e defini-las em templates 4. Gerenciar informações de credenciais AWS e incorporá-las em vários scripts 5. Gerenciar informações de contas, como senhas, como MySQL e LDAP 6. Gerenciar informações como nginx e apache vhosts e upstreams que não se encaixam em funções e ambientes 7. Gerenciar informações na cabeça do Ganglia_node e no cluster_name

0. Explicação preliminar

*Como pré-requisito, no caso do chef-solo, você precisa de uma gema chamada "knife-solo_data_bag", para poder colocá-la. (Se não for uma lista de gemas, por favor, coloque no sistema de instalação ou bundler de gemas.)

Como armazenar e verificar

Se você não quiser criptografá-lo, edite em qualquer editor, como vi, OK chef-repository/data_bags/nome arbitrário de diretório/arbitrary filename.json O conteúdo deve seguir as regras do json, então CHK a sintaxe com json_verify.

cat data_bags/dirname/filename.json |json_verify e veja JSON é válido

Ao criptografar, primeiro você precisa definir a variável de ambiente do EDITOR para ~/.bashrc, e criar e definir uma chave para criptografia. (*A chave é uma imagem diferente para cada projeto, e precisa ser escrita em .gitignore.) Vazamento é estritamente proibido, e se você removê-lo, os dados não serão visíveis. )

exportar EDITOR=vi
vi .chef/knife.rb
------ sem comentários--------------------- 
encrypted_data_bag_secret "data_bag_key" 
----------------------------------------- 

*Se você descomentar, mesmo que não especifique a chave, ela sempre será criptografada se você criar com o comando knife, então você precisa criar o arquivo de dados que quer lidar sem criptografia no vi ou comentar antes de criá-lo.

Se precisar de uma chave, crie (*O caminho relativo de .chef/knife.rb significa diretamente abaixo do repositório chef)

openssl rand -base64 512 > data_bag_key

knife solo data bag criar nome do nome do nome do arquivo # Create (*os existentes serão sobrescritos por sobreposição)
knife solo data bag editar nome do dirname nome do arquivo # Editar arquivos no editor
Knife Solo Data Bag mostrar nome do nome do arquivo # JSON conteúdo
Knife Solo Data Bag List # lista de diretórios

・Coisas para ter cuidado→ Você não deve usar bash ou executar recursos o máximo possível. Por favor, use recursos modelo. Quando usado com bash, caracteres especiais colocados nas variáveis a partir de dados_bags\ são expandidos e valores não intencionais são incluídos.


1. Carregar informações do usuário do sistema operacional para aplicações de sistema que não são gerenciadas pelo LDAP e adicioná-las como receitas

Isso não é um grande problema, então me desculpe pelo ponteiro Escrevendo uma receita para um procedimento existente no Chef 2 (criado pelo usuário) | DEVLAB Um padrão que não é criptografado. (Senha criptografada antecipadamente) Usuários individuais gerenciam LDAP, e o chef lida com a distribuição de arquivos de configuração do cliente LDAP, etc.


2. Carregar do armazenamento e receita do certificado SSL e definir no template

Estou fazendo isso com Apache e NGINX, mas vou descrever o caso do NGINX.

Sobre como armazenar certificados SSL, cole o código de nova linha convertido em uma string da seguinte forma. Como é um certificado e uma chave, é claro que ele é criptografado e carregado.

cat cert.pem|perl -pe 's/n/n/g' 

knife solo data bag create ssl jenkins
knife solo data bag editar ssl jenkins
Knife Solo Data Bag Show SSL Jenkins
{ 
  "id": "jenkins", 
  "CRT": "-----INICIAR CERTIFICADO-----nMIIDd~omitido~", 
  "chave": "~omitido~", 
  "chave de acesso": "~omitido~", 
  "senha": "Hogehoge" 
}

Como carregar no lado da receita (alguns trechos)

 # site de gatos-livros/nginx/receitas/nginx_ssl_client.rb
--- 
 # Eu coloco o nome do data_type (≒role) e o nome do ambiente nas variáveis para que ele seja o nome do arquivo de dados
#role = ("#{node.roles}"[/[w_-]+/])
ambiente = ("#{node.ambiente}"[/w+/])
data_type = nó['nginx']['data_type']
sslclientconf_type = nó['nginx']['sslclientconf_type']
Datafile = "#{data_type}_#{Ambiente}" 

 # Defina o nome da chave, etc., como uma variável (que é carregada a partir de atributos como função)
sslkeyfile = nó['nginx']['sslkey1']
sslcrtfile = nó['nginx']['sslcrt1']
FileClientCRTF = Nó['nginx']['ClientCRT']
clientcrlfile = nó['nginx']['clientcrl']
sslkeydir = '/etc/nginx' 

 # Carregando data_bags dados criptografados e definindo-os como uma variável
ssl = Chef::EncryptedDataBagItem.load("ssl", "#{datafile}")
SSLCrtData = SSL["CRT"]
sslkeydata = ssl["key"]
ClientCRTdata = SSL["ClientCRT"]
#clientcrldata = ssl["clientcrl"]

 # Esta é uma receita que se ramifica com data_type um se.
se "#{data_type}" == "" 
  #~Omitido~
senão
 # Você pode manter a idempotência usando recursos de modelo
 template "#{sslkeydir}/#{sslcrtfile}" do
   notifica: reiniciar, 'serviço[nginx]' 
   fonte: "sslcrtfile.erb" 
   variables({ 
     :sslcrtdata => sslcrtdata
   })
 fim
 template "#{sslkeydir}/#{sslkeyfile}" do
   notifica: reiniciar, 'serviço[nginx]' 
   fonte: "sslkeyfile.erb" 
   variables({ 
     :sslkeydata => sslkeydata
   })
 fim
 template "#{sslkeydir}/#{clientcrtfile}" do
   notifica: reiniciar, 'serviço[nginx]' 
   fonte: "clientcrtfile.erb" 
   variables({ 
     :clientcrtdata => clientcrtdata
   })
 fim
--- 
O que acontece com o arquivo template é
 # cat site-cookbooks/nginx/templates/default/sslcrtfile.erb
<%= @sslcrtdata %>
 # cat-site-cookbooks/nginx/templates/default/sslkeyfile.erb
<%= @sslkeydata %>
 # cat site-cookbooks/nginx/templates/default/clientcrtfile.erb
<%= @clientcrtdata %>

Você pode carregar a partir de data_bags onde variáveis é @ e definir o valor na variável.


3. Carregar informações no servidor NTP e defini-las no template
5. Gerencie informações da conta, como senhas, como mysql e ldap

Desculpe por apontar isso também. Registro da personalização de receitas solo por chef | DEVLAB Para sua referência.


4. Gerenciar credenciais AWS e incorporá-las em vários scripts

Claro, criptografe-a. No caso dos certificados SSL, o método de carregamento e o método de embedding não são muito diferentes, então vou omitir.

Crie, edite e verifique da seguinte forma.

 # Knife Solo Data Bag Criar AWSKEYS Deploy
 # Knife Solo Data Bag Editar AWSKEYS Deploy
 # Knife Solo Data Bag Show AWSKEYS Deploy

{ 
  "id": "implantar", 
  "aws_access_key_id": "Axxxxxxxxxxxxxxxxxx", 
  "aws_secret_access_key": "oxxxxxxxxxxxxxxxxxx", 
  "Região": "US-XXXX-2" 
}

Por exemplo, o método de carregamento é o seguinte. (Eu passo variáveis para o script sem instalá-lo)

cookbook_file "/usr/local/sbin/renamehost" faz
  fonte "renamehost" 
  dono 'root' 
  grupo 'raiz' 
  Modo 0750
fim

Ohai "reload" faz
  plugin "Nome do Host" 
fim

# Obtenha a conta AWS correspondente no seu ambiente
env_rank = data_bag_item("master_data", "env_rank")
rank_awsaccount = data_bag_item("master_data", "rank_awsaccount")
Ambiente = node.chef_environment
Posto = env_rank[Ambiente]
awsaccount = rank_awsaccount[rank]

# Obtenha as credenciais correspondentes para sua conta
awscredential = Chef::EncryptedDataBagItem.load("awskeys", "deploy_#{awsaccount}")
aws_access_key_id = awscredential["aws_access_key_id"]
aws_secret_access_key = awscredential["aws_secret_access_key"]
aws_region = awscredential["região"] 

role = ("#{node.roles}"[/[\w_-]+/])
bash "exec-renamehost" fazer
  not_if { node[:hostname] =~ /^#{role}/ }
  notifica :reload, "ohai[reload]", :imediatamente
  notifica :reiniciar, "service[rsyslog]", :imediatamente
  Código <-EOC
    /usr/local/sbin/renamehost `echo #{aws_access_key_id} #{aws_secret_access_key} #{aws_region}`
  EOC
end

include_recipe "base_setting::hosts"

6. Gerenciar informações como vhost e upstream em nginx e apache que não se encaixam em funções e ambientes

A receita é a seguinte

ngxdata = data_bag_item('nginx',"#{datafile}")
Nome do servidor = ngxdata['nomedo do servidor1']
upstream = ngxdata['upstream1']
upstreamport = ngxdata['upstreamport']

 template "/etc/nginx/conf.d/ssl.conf" fazer
  Fonte "#{role}/SSL.conf.erb" 
  caminho '/etc/nginx/conf.d/ssl.conf' 
  Backup 5
  dono 'root' 
  grupo 'raiz' 
  modo '0644' 
  Ação :Criar
  notifica: reiniciar, 'serviço[nginx]' 
  variables({ 
        :nomedo do servidor1 =>nome do servidor, 
        :upstream1 => upstream, 
        :upstreamport => upstreamport
  })
 fim

O arquivo json não é particularmente criptografado (é difícil de ver no git)

# gato data_bags/nginx/nginx-hoge_test1.json
---- 
{ 
  "id": "nginx-hoge_test1", 
  "nomedo do servidor1": "exsample.hoge.net", 
  "upstream1": "internal-ELB-int-hoge-test1-xxxxxxx.us-xxxx-2.elb.amazonaws.com", 
  "Upport Upstream": "80" 
}
---- 

**Existem muitos papéis e ambientes, e se você não consegue se encaixar em um ou outro, não tem escolha a não ser colocar isso nos dados_bags.


7. Gerencie Informações da Cabeça dos Gânglios_node e do Cluster_name

Isso não é muito diferente do 6, então vou omitir

Referência:

Toda a história do uso de databags (1) - Yohei no Nichiri Seishin [[chef] Como usar data bag | Infraestrutura de TI notebook diverso] (http://tech.blog.piyo.org/2012/06/19/chef-data-bag%E6%B4%BB%E7%94%A8%E6%B3%95/) Registro do uso de Databags para criptografar dados JSON que você não quer publicar no Chef - Adeus Internet Para sua referência. Obrigado por ler. **

Related Articles