Я бы хотел использовать шеф-повар сеанс на сервере aws opsworks ec2, чтобы я мог протестировать некоторую среду и конкретный код экземпляра, который я хотел бы включить в пользовательский рецепт. Например, я хотел бы увидеть вывод атрибуты экземпляра такие как node [: opsworks] [: instance] [: sizes] или node [: opsworks] [: instance] [: public_dns_name], а также данные, которые я передал в стек opsworks, используя пользовательский json.
Я могу запустить chef-shell, просто не знаю, как использовать его для доступа к атрибутам opsworks.
Если я подключусь к экземпляру opsworks ec2 по ssh, я могу получить доступ к таким атрибутам, как node ['ec2'] ['instance_id'], но не к специфическим для opsworks, как node ['opsworks'] ['instance'] ['sizes']
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 ubuntu@mongodb1.localdomain!
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 >
Пользовательский JSON и состояние стека передаются в экземпляр в структуре JSON, когда происходит событие OpsWorks (установка, настройка, развертывание, удаление, завершение работы). Если вы хотите, чтобы ваш рецепт отображал текущее состояние стека OpsWorks, вам нужно запустить рецепт из пользовательского интерфейса OpsWorks через Развернуть -> Выполнить команду -> Выполнить рецепты форма.
JSON, отправленный OpsWorks, хранится в экземпляре. Если вы хотите использовать потенциально устаревшую информацию о состоянии стека, которая является такой же свежей, как и в последний раз, когда этот экземпляр запускал событие OpsWorks, вы можете найти самую последнюю *.json
файл на экземпляре в /var/lib/aws/opsworks/chef
, и проанализировать его с помощью кода Ruby.
Вы также можете использовать opsworks-agent-cli
на экземпляре для (повторного) запуска рецептов из события OpsWorks непосредственно из командной строки на экземпляре. Эта утилита будет повторно запускать события OpsWorks - она не будет инициировать новые события, и она не вытащить новую копию состояния стека или пользовательского JSON, вместо этого он повторно использует .json
файл, который OpsWorks отправил экземпляру когда это событие было запущено изначально. Например, чтобы перезапустить setup
событие в вашем экземпляре (потому что событие установки определенно уже было запущено):
sudo opsworks-agent-cli run_command setup
Чтобы повторно запустить тот же набор рецептов, который вы выполняли в прошлый раз, когда вы запускали Execute Recipes из пользовательского интерфейса:
sudo opsworks-agent-cli run_command execute_recipes
Это отстой, потому что вам нужно сначала запустить событие через пользовательский интерфейс. Поэтому, если вы хотите запустить собственный рецепт или обновить пользовательские кулинарные книги, вам сначала нужно запустить это событие из пользовательского интерфейса. Но во второй, третий и последующие раз вы можете повторно запустить эти события через opsworks-agent-cli
.
Видеть Вот для получения дополнительной информации о opsworks-agent-cli.
Воспользовавшись советом @schlomoswidler о расположении пользовательского json в файле экземпляра ec2 в его ответе выше, я выполнил следующее, чтобы получить интерактивную оболочку chef, которая включает в себя настраиваемые атрибуты opsworks, которые я искал:
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 ubuntu@mongodb1.localdomain!
chef > node['opsworks']['instance']['layers']
=> ["mongodb"]
chef >
Очевидно, вам необходимо заменить json в папке / var / lib / aws / opsworks / chef на соответствующий файл в вашей системе.
Chef 12 стеки OpsWorks на базе Linux работают иначе, чем стеки Chef 11. Одно отличие в том, что поиск повара теперь это правильный способ доступа к данным, предоставляемым OpsWorks в рецепте. В экземпляре данные атрибутов теперь доступны через пакеты данных (стек миграция & ссылка). Вы можете получить обзор доступных пакетов данных, проверив каталог для одного из запусков Chef. У каждого пакета данных есть собственный подкаталог ниже /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 ~]#
Вы не можете использовать то же самое chef-shell
технику, которую я использовал выше для стеков Chef 11.
Лучший способ поэкспериментировать с поиском - это использовать Прай сессия чтобы получить доступ к среде выполнения второго запуска Chef, предназначенного для клиентов.
В следующем примере я сначала запускаю событие жизненного цикла «Выполнить рецепты» из пользовательского интерфейса и использую «opsworks_cookbook_demo :: foo» в качестве рецепта для запуска. Затем я подключаюсь к своему экземпляру по SSH и редактирую /var/chef/cookbooks/opsworks_cookbook_demo/recipes/foo.rb
, добавив следующие две строки.
require "pry"
binding.pry
Тогда я бегу opsworks-agent-cli run
чтобы повторить последний прогон. Если последний запуск не был типа «Обновить пользовательские кулинарные книги», это оставит локальные изменения на месте.
Рецепт будет запущен снова, но теперь у нас есть интерактивная оболочка для экспериментов. Вот как можно выполнить два поиска:
[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 …
Сообщение в блоге aws Быстро изучить среду Chef в AWS OpsWorks есть другие примеры использования pry на экземпляре OpsWorks.