depurar receitas de chefes em instâncias do opsworks - acesso a atributos customizados de json / data bag

7

Gostaria de usar uma sessão chef-shell em um servidor ec2 do awsw para que eu possa testar algum ambiente e exemplo de código específico que gostaria de incluir em uma receita personalizada. Por exemplo, eu gostaria de ver a saída dos atributos da instância como node [: opsworks] [: instance] [: camadas] ou nó [: opsworks] [: instance] [: public_dns_name] bem como dados que passei para a pilha do opsworks usando json personalizado .

Posso iniciar o shell do chef, só não sei como usá-lo para acessar os atributos do opsworks.

Se eu fizer ssh na instância do opsworks ec2, posso acessar atributos como node ['ec2'] ['instance_id'], mas nenhum opsworks, como o node ['opsworks'] ['instance'] ['layers']

root@mongodb1:/opt/aws/opsworks/current/bin# ./chef-shell
loading configuration: none (standalone session)
Session type: standalone
Loading......done.

This is the chef-shell.
 Chef Version: 11.10.4
 http://www.opscode.com/chef
 http://docs.opscode.com/

run 'help' for help, 'exit' or ^D to quit.

Ohai2u [email protected]!
chef > attributes_mode
chef:attributes > node['ec2']['instance_id']
 => "i-c1a98f2c"
chef:attributes > node['opsworks']['instance']['layers']
NoMethodError: undefined method '[]' for nil:NilClass
        from (irb#1):4
chef:attributes >
    
por Peter M 24.10.2014 / 17:25

2 respostas

9

O JSON personalizado e o estado da pilha são enviados para a instância em uma estrutura JSON quando ocorre um evento OpsWorks (configuração, configuração, implantação, remoção de implementação, desligamento). Se você quiser que sua receita veja o estado atualizado do OpsWorks Stack, será necessário executar sua receita na interface do usuário do OpsWorks por meio do Deploy - > Comando Executar - > Formulário Executar Receitas .

O JSON enviado pelo OpsWorks é armazenado na instância. Se você estiver disposto a usar informações de estado de Pilha potencialmente obsoletas, que são tão recentes quanto a última vez que essa instância executou um evento do OpsWorks, você pode procurar o arquivo *.json mais recente na instância em /var/lib/aws/opsworks/chef e analisar via código Ruby.

Você também pode usar o utilitário opsworks-agent-cli na instância para (re) executar as receitas de um evento do OpsWorks diretamente da linha de comando da instância. Esse utilitário executará novamente os eventos OpsWorks - ele não iniciará novos eventos e não extrairá uma cópia nova do estado da pilha ou do Custom JSON, em vez de reutilizar o arquivo .json que o OpsWorks enviou para a instância quando esse evento foi executado originalmente . Por exemplo, para reexecutar o evento setup em sua instância (porque o evento de configuração já foi executado com certeza):

sudo opsworks-agent-cli run_command setup

Para reexecutar o mesmo conjunto de receitas que você executou da última vez que executou Execute Recipes na interface do usuário:

sudo opsworks-agent-cli run_command execute_recipes

Isso é uma droga, porque você precisa executar o evento pela interface do usuário primeiro. Portanto, se você deseja executar uma receita personalizada ou atualizar os livros de receitas personalizados, primeiro é necessário executar esse evento na interface do usuário. Mas, na segunda, terceira e subseqüentes, você pode executar novamente esses eventos via opsworks-agent-cli .

Veja aqui para mais sobre o opsworks-agent-cli.

    
por 26.10.2014 / 20:24
8

Usando o conselho de @schlomoswidler sobre a localização do json personalizado no arquivo de instância ec2 em sua resposta acima, executei o seguinte para obter um shell de chef interativo que inclui os atributos de opsworks personalizados que estava procurando:

root@mongodb1:/opt/aws/opsworks/current/bin# /opt/aws/opsworks/current/bin/chef-shell -j /var/lib/aws/opsworks/chef/2014-10-27-13-46-53-01.json
loading configuration: none (standalone session)
Session type: standalone
Loading.....done.

This is the chef-shell.
 Chef Version: 11.10.4
 http://www.opscode.com/chef
 http://docs.opscode.com/

run 'help' for help, 'exit' or ^D to quit.

Ohai2u [email protected]!
chef > node['opsworks']['instance']['layers']
 => ["mongodb"]
chef >

Você obviamente precisa substituir o json na pasta / var / lib / aws / opsworks / chef por um arquivo apropriado em seu sistema.

Atualização para as pilhas Linux OpsWorks do Chef 12 (2016)

As pilhas OpsWorks baseadas no Linux do Chef 12 funcionam de forma diferente do Chef 11 pilhas. Uma diferença é que a pesquisa do chef agora é a maneira correta de acessar os dados fornecidos pelo OpsWorks dentro de uma receita. Na instância, os dados de atributo agora são expostos por meio de sacos de dados (pilha migração & referência ). Você pode obter uma visão geral dos sacos de dados disponíveis, inspecionando o diretório de uma das suas execuções Chef. Cada pacote de dados tem seu próprio subdiretório abaixo de /var/chef/runs/<ID>/data_bags/ .

[root@asd1 ~]# ll /var/chef/runs/c7f67e3e-c15d-4159-bb14-5bde07751543/data_bags/
total 36
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_app
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_command
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_ecs_cluster
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_elastic_load_balancer
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_instance
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_layer
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_rds_db_instance
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_stack
drwxr-xr-x 2 root root 4096 Nov 23 21:19 aws_opsworks_user
[root@asd1 ~]#

Você não pode usar a mesma técnica chef-shell que usei acima para as pilhas do Chef 11.

A melhor maneira que eu conheço para experimentar a pesquisa é usar uma sessão Pry para obter acesso ao ambiente de tempo de execução de o segundo chef que é dedicado aos clientes.

Sessão de Prova de Pesquisa

No exemplo a seguir, primeiro disparo o evento de ciclo de vida "Execute Recipes" na interface do usuário e uso "opsworks_cookbook_demo :: foo" como a receita a ser executada. Então eu SSH na minha instância e edite /var/chef/cookbooks/opsworks_cookbook_demo/recipes/foo.rb , adicionando as duas linhas seguintes.

require "pry"
binding.pry

Em seguida, corro opsworks-agent-cli run para repetir a última execução. A menos que a execução mais recente tenha sido do tipo "Atualizar livros de receitas personalizados", isso deixará as alterações locais em vigor.

A receita será executada novamente, mas agora temos um shell interativo para experimentar. Veja como você pode realizar duas pesquisas:

[root@asd1 ~]# opsworks-agent-cli run
[2015-11-23 21:46:35]  INFO [opsworks-agent(3396)]: About to re-run 'execute_recipes' from 2015-11-23T21:43:15
... lots more output ...
From: /var/chef/runs/76ff2d58-ab8f-4cf6-8744-9562025321fd/local-mode-cache/cache/cookbooks/opsworks_cookbook_demo/recipes/foo.rb @ line 4 Chef::Mixin::FromFile#from_file:

    1: Chef::Log.info "foo"
    2:
    3: require "pry"
 => 4: binding.pry

search(:aws_opsworks_stack)
=> [{"data_bag_item('aws_opsworks_stack', 'f24bd5ea-3ff2-4a1a-a4e4-9298495ae263')"=>
   {"arn"=>"arn:aws:opsworks:us-west-2:153700967203:stack/f24bd5ea-3ff2-4a1a-a4e4-9298495ae263/",
    "custom_cookbooks_source"=>{"type"=>"s3", "url"=>"redacted", "username"=>nil, "password"=>nil, "ssh_key"=>nil, "revision"=>nil},
    "name"=>"susan",
    "region"=>"us-west-2",
    "stack_id"=>"f24bd5ea-3ff2-4a1a-a4e4-9298495ae263",
    "use_custom_cookbooks"=>true,
    "vpc_id"=>nil,
    "id"=>"f24bd5ea-3ff2-4a1a-a4e4-9298495ae263",
    "chef_type"=>"data_bag_item",
    "data_bag"=>"aws_opsworks_stack"}}]

search(:aws_opsworks_instance, "self:true")
=> [{"data_bag_item('aws_opsworks_instance', 'asd1')"=>
   {"ami_id"=>"ami-d93622b8",
    "architecture"=>"x86_64",
    "auto_scaling_type"=>nil,
    "availability_zone"=>"us-west-2a",
    "created_at"=>"2015-11-20T12:48:29+00:00",
    "ebs_optimized"=>false,
    "ec2_instance_id"=>"i-be823867",
    "elastic_ip"=>nil,
    "hostname"=>"asd1",
    "instance_id"=>"42d28e39-29a8-4fdf-a327-afdc23668ff1",
    "instance_type"=>"c3.large",
    "layer_ids"=>["f08fb7e2-9278-498a-8c0d-7d1c1bae22aa"],
… lots more data …

A postagem no blog da aws Rapidamente Explore o Ambiente do Chef no AWS OpsWorks tem outros exemplos de como usar a alavanca em uma instância do OpsWorks.

    
por 27.10.2014 / 15:43