代码之家  ›  专栏  ›  技术社区  ›  Fabio Cecaro

厨师:食谱中的加工顺序

  •  0
  • Fabio Cecaro  · 技术社区  · 8 年前

    我的测试是 厨师12.18.31 Ubuntu 16.04-AWS EC2-Opsworks堆栈

    因此,如果我有一个序列如下的食谱:

    Native_Chef_Resource do
    Chef::Log.info("First")
    My_First_Variable
    end
    
    My_Command do
    my script based on My_First_Variable
    end
    
    My_Resource do
    Chef::Log.info("Second")
    My_Second_Variable
    end
    
    My_Other_Command do
    my script based on My_Second_Variable
    end
    

    在这种怀疑之后,我试着用这些食谱和资源“通知”。

    配方

    test 'test notify' do
    par_test 'primo test'
    notifies :run, 'execute[bo]', :immediately
    end
    
    execute 'bo' do
    command 'echo uname -a'
    Chef::Log.info("execute bo")
    end
    

    资源

    resource_name :test
    property :par_test
    default_action :create
    action :create do
    Chef::Log.info("#{par_test}")
    end
    

    我做了两个测试,一个是“立即”,另一个是“之前”。

    结果:

    立即测试 [2017-10-15T12:54:41+02:00]信息:执行bo [2017-10-15T12:54:41+02:00]信息:处理测试[test notify]操作创建(部署::test\u notify line 1) [2017-10-15T12:54:41+02:00]信息:primo测试 [2017-10-15T12:54:41+02:00]信息:处理执行[bo]操作运行(部署::test\u notify line 6) [2017-10-15T12:54:41+02:00]信息:执行[bo]成功运行

    在之前测试

    [2017-10-15T13:16:31+02:00]信息:执行bo [2017-10-15T13:16:31+02:00]信息:测试[测试通知]运行为什么在操作之前运行创建操作以支持 [2017-10-15T13:16:31+02:00]信息:处理测试[test notify]操作创建(部署::test\u notify line 1) [2017-10-15T13:16:31+02:00]信息:primo测试 [2017-10-15T13:16:31+02:00]信息:处理测试[test notify]操作创建(部署::test\u notify line 1) [2017-10-15T13:16:31+02:00]信息:primo测试 [2017-10-15T13:16:31+02:00]信息:处理执行[bo]操作运行(部署::test\u notify line 6) [2017-10-15T13:16:31+02:00]信息:执行[bo]成功运行

    你认为处决的顺序如何? 谢谢

    1 回复  |  直到 8 年前
        1
  •  0
  •   coderanger    8 年前

    我在网站上有更详细的描述 https://coderanger.net/two-pass/ 但基本上:

    当编译配方文件时,配方中的任何基本级别的Ruby代码(包括创建资源的所有调用)都会运行。这包括主目录中的任何代码 do ... end 资源块(与 block 的属性 ruby_block 或者里面的任何东西 lazy{} )就像那个街区一样 instance_eval 在创建资源对象期间。在编译运行列表中的所有配方后,在收敛阶段运行资源的操作方法。对于自定义资源,此过程以递归方式重复,自定义资源的操作方法是它们自己的迷你编译和收敛阶段。

    推荐文章