我是Chef/Packer的新手,如果这是一个新手问题,我很抱歉,基本上我是想让Packer使用我的本地机器来构建图像并执行shell脚本。以下是我的packer-build.json
{
"builders": [
{
"type": "file",
"name": "example",
"target": "./test_artifact.txt",
"content": "example content"
}
],
"provisioners": [
{
"type": "chef-solo",
"cookbook_paths": ["/Users/bakthak/code/nc_deployment/chef-repo/cookbooks"],
"staging_directory": "/Users/bakthak",
"execute_command": "sh /Users/bakthak/check.sh"
}
]
}
使用此文件运行构建生成输出
==> example: Provisioning with chef-solo
example: Installing Chef...
example: Creating directory: /Users/bakthak
example: Creating directory: /Users/bakthak/cookbooks-0
example: Creating configuration file 'solo.rb'
example: Creating JSON attribute file
example: Executing Chef: sh /Users/bakthak/check.sh
Build 'example' finished.
我对此有几个问题:
- packer是否正在使用我的本地机器安装chef并构建映像
- 外壳脚本
sh /Users/bakthak/check.sh
似乎没有执行,因为该脚本在打包器构建完成后不存在的目录中创建了一堆文件
感谢您的帮助:(
Packer将连接并运行";提供者";在CCD_ 2中识别或创建的机器/目标上。根据file
构建器上的文件:
file
Packer构建器并不是真正的构建器,它只是从文件中创建一个工件。它可以用于调试后处理器,而不会导致很长的等待时间。
因此,通过使用此生成器,您不会创建到任何位置的连接。然而,有一个名为null
的构建器,可以用来建立SSH会话并运行provisioner。
考虑下面的示例,其中192.168.1.102
是我的机器(运行packer
的本地主机(的IP地址,并且具有可以通过SSH连接到它的凭据:
{
"builders": [
{
"type": "null",
"ssh_host": "192.168.1.102",
"ssh_username": "user1",
"ssh_password": "changeit"
}
],
"provisioners": [
{
"type": "chef-solo",
"cookbook_paths": ["/home/user1/.chef/cookbooks"],
"run_list": "my_cookbook",
"execute_command": "sh /home/user1/myscript.sh"
}
]
}
也就是说,对于chef-solo
提供者来说,最好坚持默认的execute_command
:
chef-solo --no-color -c <ConfigPath> -j <.JsonPath>
并从Chef资源运行脚本:
my_cookbook/precipes/default.rb:
script 'myscript.sh' do
interpreter 'bash'
cwd '/home/user1/'
code <<-EOH
# Content of the script as
# some shell commands
EOH
end