在创建服务之前处理的 Chef 模板

Posted

技术标签:

【中文标题】在创建服务之前处理的 Chef 模板【英文标题】:Chef template processed before service is created 【发布时间】:2016-03-15 16:54:47 【问题描述】:

我在 AWS OpsWorks 中运行 chef 12 时遇到问题。

基本上,我在部署期间的一个部署方法会为每个部署的应用程序创建一个 nginx-App.conf。这个很好用。

但是我想创建并运行这个模板只有当 NGINX 安装在服务器上时,如果我有一个实例而不把 webserver/nginx 放在那里。

我的 run_list 会这样:

    Nginx 包,nginx 服务已启用,已启动。 在部署 Nginx-app 的过程中会创建特定的 conf 文件。

我创建 Nginx-app conf 的方法如下:

  template 'nginx.conf' do
    path "/etc/nginx/conf.d/#params[:something].conf"
    source 'nginxapp.conf.erb'
    cookbook 'nginx'
    owner 'root'
    group 'root'
    mode 0644
    notifies :reload, 'service[nginx]'
    only_if  File.exists?('/usr/sbin/nginx') 
  end

如果我添加“only_if”条件会失败,因为在处理此模板之前似乎没有安装 Nginx。

如果我第二次运行它,它将正常工作,因为已经安装了 nginx。

有人知道这里有什么问题吗?

问候, 安德烈斯

【问题讨论】:

【参考方案1】:

所以显然我是这样工作的:

    将“模板”部分移至原始“nginx”厨师作为定义,并将 only_if 部分留在那里。 在 Deploy 食谱/食谱中,我只是从创建模板的“nginx”食谱中调用此自定义定义。

这种方式文件存在并且条件正常工作,我不知道为什么......

这是否与使用其他食谱中的模板在其他所有操作之前执行有关?

【讨论】:

这与它在哪个食谱中无关,更多的是被移入定义中。我感觉你的 run_list 不是你认为它应该工作的顺序。 好的,谢谢!然后它可能看起来像是 AWS OpsWorks 的新厨师环境中的错误。虽然这很奇怪。如果我的 Deploy 说明书会在 Nginx 设置之前完整运行,那么所有其他命令也会失败。 在这种情况下,OPSworks chef 版本可能对守卫有不同的行为,听起来不太可能。旁注:尝试使用 ::File.exists?(前面加上两个冒号以获取根文件类)以确保使用Ruby类而不是Chef的类,我认为这有问题,但不记得确切的位置。

以上是关于在创建服务之前处理的 Chef 模板的主要内容,如果未能解决你的问题,请参考以下文章

VueJS 在操作之前处理完整的模板

AWS Opsworks 中的 Chef 环境

消息推送之微信模板消息

Elasticsearch之索引模板

web框架之Flask

nginx高并发优化之模板