Não é possível resolver a dependência do livro de receitas externo do chef no modo local

4

Estou fazendo minhas primeiras receitas no chef. Eu criei um livro de receitas que chamei de comum com apenas uma receita (default.rb):

apt_repository "mariadb-repo" do
  uri "http://tedeco.fi.upm.es/mirror/mariadb/repo/10.1/ubuntu"
  distribution "trusty"
  components ["main"]
  arch "amd64"
  keyserver "keyserver.ubuntu.com"
  key "CBCB082A"
end

Eu adicionei "depende de '" no final dos meus metadados.rb. Se eu correr:

Starting Chef Client, version 12.5.1
resolving cookbooks for run list: ["common"]

================================================================================
Error Resolving Cookbooks for Run List:
================================================================================

Missing Cookbooks:
------------------
No such cookbook: apt

Expanded Run List:
------------------
* common


Running handlers:
[2016-01-28T13:07:17+00:00] ERROR: Running exception handlers
Running handlers complete
[2016-01-28T13:07:17+00:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated in 01 seconds
[2016-01-28T13:07:17+00:00] FATAL: Stacktrace dumped to /home/vagrant/.chef/local-mode-cache/cache/chef-stacktrace.out
[2016-01-28T13:07:17+00:00] ERROR: 412 "Precondition Failed"
[2016-01-28T13:07:17+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

Ok, eu adicionei ao meu Berksfile:

source 'https://supermarket.chef.io'

cookbook 'apt'

metadata

Em seguida, tentei instalar o livro de receitas apt em vários locais:

$ berks install # installs to ~/.berkshelf/cookbooks/
$ berks vendor --except=common berks-cookbooks/

A primeira coisa que eu noto é que o segundo comando empacota tanto os livros de receitas, apt como o meu comum, para o diretório que eu especifico (mesmo passando --except = common). Nevermind: Se eu agora tentar executar:

$ sudo chef-client --local-mode --runlist 'recipe[common]'

Do diretório do meu livro de receitas (o que eu chamo comum) E do diretório berks-cookbooks. Nenhum dos dois funcionou, o erro acima persistir. Eu tentei também com o seguinte client.rb no diretório do meu livro de receitas:

cookbook_path = "./berks-cookbooks"
chef_repo_path = "#{cookbook_path}"

E algumas variações destes ...

O que estou perdendo? Qual é o caminho para obter essas dependências corretamente satisfeitas com chef-cliente no modo local?

Qual é a maneira de satisfazer essas dependências?

'' 'EDIT 1' '': A execução sem sudo não funciona.

    
por roirodriguez 28.01.2016 / 15:10

2 respostas

5

O cliente do chef no modo local lê knife.rb como seu arquivo de configuração, não client.rb . Isso faz sentido ao usá-lo em uma estação de trabalho com coisas como provisionamento de chef, mas pode ser bastante inesperado quando você está tentando usar o modo local em produção.

Em geral, no modo local, você deve usar berks vendor para manipular a exportação. Em vez de executar chef-client da pasta de livro (s), crie um /root/local_mode_repo ou similar e execute berks vendor /root/local_mode_repo/cookbooks . Então você pode executar chef-client --local-mode dentro dessa pasta. Os nomes das pastas específicas dentro do repo como roles/ e cookbooks/ geralmente não são configuráveis.

    
por 02.02.2016 / 03:10
0

Para o desenvolvimento local, o modo local chef-cliente procura config.rb ou knife.rb , iniciando na seguinte ordem $KNIFE_HOME , $PWD , .chef/ e finalmente $HOME/.chef/ *.

  • source: lib/chef-config/workstation_config_loader.rb em chef-config-13.8.5 gem chamado do método load_config_file() de client.rb em chef-13.8.5 gem

No seu config.rb ou knife.rb , você quer que seu cookbooks_path inclua a localização dos seus livros de receitas e berks_cookbooks :

cookbook_path = ["./cookbooks", "./berks-cookbooks"]

Um truque que usei para entender todas as dependências é um pequeno script de shell que cria um Berksfile e depois cria o diretório berks-cookbooks .

#!/usr/bin/env bash
cat <<-EOF > Berksfile
source 'https://supermarket.chef.io'
$(grep -Rh 'depends' cookbooks/* | sed 's/depends/cookbook/')
EOF

berks vendor
berks install

Observe que berks install instalará os livros de culinária externos em seu Chef Server para que eles fiquem disponíveis para nós remotos, enquanto berks vendor é o que você pode usar para desenvolvimento local com o berks-cookbooks .

Uma dica, eu mantenho o meu dev local um nível acima, e o meu chef-repo/.chef tem configuração para o servidor do chef:

    .
    ├── .chef
    │   └── knife.rb
    ├── my-chef-repo
    │   ├── berks-cookbooks
    │   ├── .chef
    │   │   └── knife.rb
    │   ├── cookbooks
    │   ├── data_bags
    │   ├── environments
    │   ├── nodes
    │   └── roles
    └── .vagrant
        └── machines
    
por 26.04.2018 / 03:26