Eu sou um desenvolvedor que recentemente herdou a configuração do nosso chef anterior. Estou executando o servidor Chef 10 e percebi que o livro de receitas do nginx do opscode ainda usa a versão 1.2.6 do nginx. Como há muitos patches de segurança que foram lançados, eu gostaria de passar para o 1.4.1 e achar que o Chef deve facilitar isso. No entanto, provou ser um pesadelo.
Meu primeiro pensamento foi simplesmente tornar o livro de receitas do nginx "custom" e alterar o atributo default['nginx']['version']
para 1.4.1, fazer upload do livro de receitas e convergir um servidor de teste. Eu assisti a busca da nova versão do livro de receitas (lembrei-me de atualizar os metadados) e a ignorei imediatamente, pois ela continuava usando o 1.2.6.
Depois pensei em substituir os atributos na função que estou usando (rails_tier_web é o nome da função). Falando com uma pessoa mais experiente do Chef, ele advertiu contra isso, já que os papéis não podem ser versionados e fixados da mesma forma que os livros de culinária. No entanto, lendo a documentação do livro de receitas, eles dizem para você usar os atributos de substituição em sua função e é isso que eu fiz:
override_attributes(
'nginx' => {
'source' => {
'version' => '1.4.1',
'prefix' => '/opt/nginx-1.4.1'
},
'version' => '1.4.1'
}
)
No entanto, quando eu converjo, ainda vejo traços de 1.2.6 aparecerem na saída do log.
[2013-07-15T18:52:03-04:00] INFO: Processing remote_file[http://nginx.org/download/nginx-1.2.6.tar.gz] action create (nginx::source line 56)
[2013-07-15T18:52:05-04:00] INFO: remote_file[http://nginx.org/download/nginx-1.2.6.tar.gz] updated
e logo depois disso ...
Mixlib::ShellOut::ShellCommandFailed
------------------------------------
Expected process to exit with [0], but received '1'
---- Begin output of "bash" "/tmp/chef-script20130715-4790-1m689ee" ----
STDOUT:
STDERR: /tmp/chef-script20130715-4790-1m689ee: line 2: cd: nginx-1.4.1: No such file or directory
---- End output of "bash" "/tmp/chef-script20130715-4790-1m689ee" ----
Ran "bash" "/tmp/chef-script20130715-4790-1m689ee" returned 1
Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/nginx/recipes/source.rb
84: bash "compile_nginx_source" do
85: cwd ::File.dirname(src_filepath)
86: code <<-EOH
87: tar zxf #{::File.basename(src_filepath)} -C #{::File.dirname(src_filepath)} &&
88: cd nginx-#{node['nginx']['source']['version']} &&
89: ./configure #{node.run_state['nginx_configure_flags'].join(" ")} &&
90: make && make install
91: EOH
92:
93: not_if do
94: nginx_force_recompile == false &&
95: node.automatic_attrs['nginx'] &&
96: node.automatic_attrs['nginx']['version'] == node['nginx']['source']['version'] &&
97: node.automatic_attrs['nginx']['configure_arguments'].sort == configure_flags.sort
98: end
99:
100: notifies :restart, "service[nginx]"
101: end
102:
Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/nginx/recipes/source.rb:84:in 'from_file'
bash("compile_nginx_source") do
action "run"
retries 0
retry_delay 2
command "\"bash\" \"/tmp/chef-script20130715-4790-1m689ee\""
backup 5
cwd "/var/chef/cache"
returns 0
code " tar zxf nginx-1.4.1.tar.gz -C /var/chef/cache &&\n cd nginx-1.4.1 &&\n ./configure --prefix=/opt/nginx-1.2.6 --conf-path=/etc/nginx/nginx.conf --with-http_gzip_static_module --with-http_realip_module --with-http_ssl_module --with-http_stub_status_module &&\n make && make install\n"
interpreter "bash"
cookbook_name "nginx"
recipe_name "source"
not_if { #code block }
end
Estou realmente no final, porque esperava poder substituir um atributo de versão e fazer com que tudo se encaixasse. Obviamente, esse não é o caso até agora e eu realmente não quero ter que fazer o patch manual e / ou a edição de objetos do nó se eu puder ajudar. Qualquer ajuda seria apreciada.