0

我是 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.

我对此有几个问题:

  1. Packer 是否使用我的本地机器安装 Chef 并构建映像?
  2. 看起来 shell 脚本sh /Users/bakthak/check.sh没有执行,因为该脚本在打包器构建完成后不存在的目录中创建了一堆文件。

谢谢您的帮助 :)

4

1 回答 1

0

"builders":Packer 将连接并在部分中标识或创建的机器/目标上运行“provisioner” 。根据file构建器上的文档:

Packer 构建器并不是真正的file构建器,它只是从文件创建工件。它可用于调试后处理器,而不会产生高等待时间。

因此,通过使用此构建器,您不会创建到任何地方的连接。但是,有一个称为 builder 的构建器null可用于建立 SSH 会话并运行配置程序。

考虑下面的示例192.168.1.102,我的机器的 IP 地址在哪里(packer正在运行的 localhost),以及可以通过 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"
    }
  ]
}

execute_command也就是说,对于供应商来说,最好坚持使用默认值chef-solo

chef-solo --no-color -c <ConfigPath> -j <.JsonPath>

并从 Chef 资源运行脚本:

my_cookbook/recipes/default.rb

script 'myscript.sh' do
  interpreter 'bash'
  cwd '/home/user1/'
  code <<-EOH
    # Content of the script as
    # some shell commands
  EOH
end
于 2020-09-06T08:06:11.887 回答