【问题标题】:How to run shell command before kitchen converge in chef?如何在厨房汇入厨师之前运行 shell 命令?
【发布时间】:2016-08-02 00:05:36
【问题描述】:

我正在使用 vagrant 驱动程序和 virtualbox 提供程序来测试 serverspec。 在执行厨房收敛之前,我需要执行一些与应用程序相关的脚本。

我尝试过使用 vagrant 配置,但我试图将应用程序配置与 vagrant 配置分开。

有什么方法可以将一些命令传递给厨房中的 .kitchen.yml 文件?在聚合说明书之前执行一些命令。

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    以下 Vagrantfile(放置在我的食谱文件夹的根目录中)在 Chef 的测试厨房中为我工作:

    ###########################################################################################################
    # The in-line script that will be used to grow our disk partition to the size specified in our Vagrantfile.
    ###########################################################################################################
    $script = <<-SCRIPT
    #!/bin/bash
    ROOT_DISK_DEVICE="/dev/sda"
    ROOT_DISK_DEVICE_PART="/dev/sda5"
    LV_PATH=`sudo lvdisplay -c | sed -n 1p | awk -F ":" '{print $1;}'`
    FS_PATH=`df / | sed -n 2p | awk '{print $1;}'`
    ROOT_FS_SIZE=`df -h / | sed -n 2p | awk '{print $2;}'`
    echo "The root file system (/) has a size of $ROOT_FS_SIZE"
    echo "> Increasing disk size of $ROOT_DISK_DEVICE to available maximum"
    sudo parted /dev/sda resizepart 2 100%
    sudo parted /dev/sda resizepart 5 100%
    sudo pvresize $ROOT_DISK_DEVICE_PART
    sudo lvextend -l +100%FREE $LV_PATH
    sudo resize2fs -p $FS_PATH
    ROOT_FS_SIZE=`df -h / | sed -n 2p | awk '{print $2;}'`
    echo "The root file system (/) has a size of $ROOT_FS_SIZE"
    exit 0
    SCRIPT
    
    # Fail if the vagrant-disksize plugin is not installed
    unless Vagrant.has_plugin?("vagrant-disksize")
      raise 'vagrant-disksize is not installed!'
    end
    
    Vagrant.configure("2") do |config|
      config.disksize.size = "150GB"
      config.vm.provision "shell", inline: $script
    end
    

    连同以下小sn-p添加到我的kitchen.yml

      vagrantfiles:
        - Vagrantfile
      provision: True
    

    直接放在下面:

    driver:
      name: vagrant
    

    用你想要的任何东西替换脚本值...这个用于扩展 Ubuntu 20.04 virtualbox 映像的文件系统。

    【讨论】:

      【解决方案2】:

      我喜欢这两个答案,但它们不适合我的情况和你的情况: * 第一次弃用 * 第二不是你需要的,但非常好

      不过,我的解决方案可能会对您有所帮助。

      因为这是 - 我现在猜 - 仅用于测试,然后我建议您创建一个新的食谱(例如 test_kitchen_support),您在运行列表中运行第一个。你可以在那里安装所有你需要的东西。

      这种方式我发现它非常简单,它只是在测试,所以生产将只使用说明书。

      我的问题是我厌倦了创建自己的 vagrant box,而且我发现大多数都不适合我(例如,它们有一些硬编码,或者它们是非常小的操作系统版本,缺少一些默认包)

      我希望这对某人有所帮助。

      【讨论】:

        【解决方案3】:

        @coderanger 的建议可能是最好的方法。

        或者,您可以尝试以下方法之一:

        自定义 Vagrant 框

        如果应用程序脚本始终相同,您可以考虑在脚本已经执行的情况下创建自己的自定义 Vagrant 框。

        滥用 chef_omnibus_url

        .kitchen.yml:

        driver:
          name: vagrant
        
        provisioner:
          name: chef_zero
          chef_omnibus_url: "uri_to_your_script/script.sh"
        ...
        

        script.sh:

        #!/bin/sh
        
        # Your script goes here
        
        curl https://www.chef.io/chef/install.sh | sh
        

        https://www.chef.io/chef/install.shchef_omnibus_url 的默认值)

        【讨论】:

        • 我喜欢这个建议,但它在最新版本中不起作用:chef_omnibus_ulr 已弃用,将被删除
        【解决方案4】:

        如果您尝试在主机系统上运行该命令,则有pre_create_command。如果您的意思是在来宾上运行某些东西,则不支持。您最好制作一个测试夹具配方或食谱并将其添加到来宾节点的运行列表中。

        【讨论】:

          猜你喜欢
          • 2017-05-05
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 2020-09-04
          • 2019-03-06
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          相关资源
          最近更新 更多