【问题标题】:Can I use cloud-init to install and configure chef, but not actually run it?我可以使用 cloud-init 安装和配置 chef,但不实际运行它吗?
【发布时间】:2013-02-27 19:47:21
【问题描述】:

我有一个可用的 CloudFormation 模板,其中包含用户数据和 cloud-init,成功连接并构建到托管的 Chef 服务器。我在 AWS EC2 库存图像上使用 Ubuntu 12.04。

出于我自己的目的,我想继续这样做,但是

1) 将 Chef 配置为作为服务运行,仅按需运行(“sudo chef-client”)

...替代地,或补充这一点

2) 像以前一样执行整个 Chef 安装/配置,但只运行一次,而不是作为服务运行

我找不到合适的钩子,如果有的话,可以通过 cloud-init 示例来实现这一点。我想知道 Chef 是否有一些设置允许这个用例?我尝试使用 update-rc.d 来禁用 chef-client 但这不起作用,因为它已经在运行。

这是与 EC2 实例关联的 CF 模板中的用户数据片段:

#cloud-config

resize_rootfs: true
apt_update: true
byobu_by_default: disable
manage_etc_hosts: false
disable_root: true
timezone: Europe/London
package_upgrade: true
package_reboot_if_required: true

apt_sources:
  - source: "deb http://apt.opscode.com/ $RELEASE-0.10 main"
    key: |
      -----BEGIN PGP PUBLIC KEY BLOCK-----
      Version: GnuPG v1.4.9 (GNU/Linux)
      xxxx truncated xxxxx
      -----END PGP PUBLIC KEY BLOCK-----

chef:
  install_type: packages
  server_url: xxxxxx
  node_name: xxxxx
  validation_name: xxxxxx
  validation_key: |
    -----BEGIN RSA PRIVATE KEY-----
    xxxx truncated xxxxx
    -----END RSA PRIVATE KEY-----
  run_list:
    - role[my-server]
  environment: production

output: {all: '| tee -a /var/log/cloud-init-output.log'}

【问题讨论】:

  • 您找到解决此问题的方法了吗?可以回答你自己的问题。请不要忘记将答案标记为正确! :)

标签: amazon-web-services chef-infra amazon-cloudformation cloud-init


【解决方案1】:

cloud-init 中执行此操作的最简单方法是编写一个执行 Chef 安装、配置和客户端运行的用户数据脚本(这些脚本默认由 root 运行,因此您不需要 @987654325 @)。

cloud-init 输入由它们的 MIME 类型来区分,而这些类型又由它们的第一行推断出来。正如docs 所示,您所拥有的是text/cloud-config 部分。您还需要一个“用户数据脚本”,它只是一个以 shebang、#! 开头的部分,或者具有特定的 MIME 内容类型。考虑到这一点,您的流程是这样的:

  1. 编写一个脚本来处理 Chef 安装和 chef-client 运行。它可以是bashsh 或任何可执行的脚本语言。

  2. 使用您现有的 cloud-config 脚本,并从中删除 chef 部分。

  3. 使用 cloud-init docs 中引用的 write-mime-multipart 脚本将您的云配置部分和用户脚本部分连接到一个多部分 MIME 有效负载中。

  4. 将整个 MIME 消息拖放到您的云形成模板中,根据代码中的引号,我假设您正在使用该模板。 cloud-init(从技术上讲,还有 cfn-init,AWS 编写的 CloudFormation 处理器)将负责其余的工作。

完成一次之后就很容易了。按照文档中的多部分示例,您会很快看到发生了什么。

【讨论】:

    【解决方案2】:

    根据源代码(但不是文档!),Chef-client 只有在“install_type: gems”时才会运行。在 v.0.7.7 之前你无法控制它。

    对于那些真正想要运行的人,在 cloud-init 0.7.7 中添加了选项 'exec: true',对于 "install_type: gems" 设置为 true,对于其他设置为 false。

    【讨论】:

    • 我在 Ubuntu Xenial 上运行 0.7.7 的 Chef cloud init YAML 中获得了 Jul 8 07:46:47 ubuntu [CLOUDINIT] cc_chef.py[DEBUG]: Skipping unknown chef template key 'exec'exec: true。 ://
    【解决方案3】:

    是的,您可以使用cloud-init 来安装和配置 Chef,但根本不运行它,还可以像以前一样执行整个 Chef 安装/配置,但只运行一次,而不是作为守护进程。

    1. 根据 cloud-init Chef 模块 documentation,您可以使用 exec 配置键来控制是否运行 chef:

    exec:运行或不运行 chef 的布尔值(默认为 false,除非请求安装 gem,然后默认为 true)

    例子:

    chef:
      # [other options]
      exec: false
    
    1. 根据source code,传递给chef-clientdefault arguments['-d', '-i', '1800', '-s', '20'],它将chef-client 作为守护进程运行,间隔为1800 秒,“展开”为20 秒。要仅运行一次,您可以使用 undocumented exec_arguments 配置键指定一组空的 exec 参数,这将导致 chef-client 仅运行一次然后退出,而不会被后台进程作为循环后台进程。

    例子:

    chef:
      # [other options]
      exec_arguments: ''
    

    【讨论】:

      【解决方案4】:

      您可以安装/配置 chef-client 并从 cfn-init 运行一次,这将在 cloud-init 中执行,如下所示。有关 cloudfromation 模板和调用 cfn-init 元数据,请参阅 aws 文档。

      第 1 步:使用元数据中的文件部分将 chef-client 安装程序复制到节点。

      "files" : {
      "c:/chef-client-12.04.exe" : {
      "sorce" : "https://s3:link to file "
      },
      "client.rb" :{
      "content":"..."}
      "validation.pem":{..}
      }
      

      第 2 步:添加代码以执行安装程序以在云中安装 Chef。

      "commands": {
      "1-install-chef": { 
      "command":"msiexec /qn /i d:\\yourFolder\\chef-client-12.04.exe     ADDLOCAL=\"ChefClientFeature,ChefServiceFeature\"",
      "waitAfterCompletion" :"1"
       }
       }
      

      第 3 步:从 cloud-init 运行一次 chef 客户端

      "commands": {
      "run-chef-client": { 
      "command":"chef-client >c:\cheflogfile.log",
      "waitAfterCompletion" :"1"
       }
       }
      

      请注意:如果您不想将 chef-client 配置为服务,请从安装部分中删除 ADDLOCAL=\"ChefClientFeature,ChefServiceFeature\"。

      请参阅 cfn-init 链接了解准确的 json 语法。

      【讨论】:

        猜你喜欢
        • 2020-12-20
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多