Je travaille avec plusieurs projets, donc la solution de cjc ne fonctionnera pas pour moi. Il y a aussi un problème de configuration commune vs personnalisée (les adresses, etc. sont communes à l'entreprise, il y a aussi un peu de magie dans les configurations). Le schéma sur lequel j'ai finalement opté est un peu un hack, mais il est pratique à utiliser.
Au lieu de global ~/.chef
, j'utilise le sous-répertoire '.chef' dans chef-repo, qui n'est pas stocké dans git (il est ajouté à .gitignore
). J'ai également un config/knife.rb
fichier qui est archivé dans Git et contient une configuration partagée. Cela commence par cet extrait:
root_dir = File.join(File.dirname(__FILE__), '..')
%w(knife-secrets.rb knife-local.rb).each do |conf_name|
conf = File.join(root_dir, ".chef", conf_name)
Kernel::load(conf) if File.exists? conf
end
Cela charge les fichiers .chef/knife-local.rb
contenant une configuration personnalisée (dans la version de base, c'est juste OPSCODE_USER='username'
constant qui est utilisé plus tard, mais il peut contenir n'importe quelle configuration de couteau), et.chef/knife-secrets.rb
qui contient des secrets partagés (clés AWS, etc.).
En dessous, il y a une configuration de couteau régulière qui utilise des constantes définies dans ces fichiers, par exemple:
client_key "#{root_dir}/.chef/#{OPSCODE_USER}.pem"
De cette façon, j'obtiens la standardisation de la configuration des couteaux dans toute l'entreprise, ce qui signifie que tout extrait de code ou invocation de couteau partagé dans un wiki fonctionnera pour tout le monde. Il y a suffisamment de confusion et de magie dans le couteau lui-même - différentes configurations ne feraient qu'empirer les choses. De plus, tout le monde profite de petits extraits magiques, comme celui-ci pour faireknife ssh
utiliser la connexion configurée dans l'utilisateur~/.ssh/config
Il y a aussi un problème de secrets partagés: clé de validation du serveur chef, clés AWS stockées dans knife-secrets.rb
, clé privée SSH d'EC2, clés de sac de données chiffrées, etc. Nous ne voulons certainement pas qu'ils soient stockés dans le référentiel - ou, en fait, partout où ils ne sont pas cryptés en toute sécurité. Nous distribuons donc ces fichiers sous forme de .tar.gz
fichier, qui est chiffré par GPG pour tout le monde dans l'entreprise, et partagé sur Dropbox.
La configuration de tout cela devient compliquée, et je veux que les gens de l'équipe utilisent réellement la chose, donc il y a le dernier élément: rake init
tâche qui crée le .chef
répertoire, les liens symboliques config/knife.rb
là, décrypte et décompresse le chef-secrets.tgz
fichier, s'assure que la clé privée de la plateforme Opscode de l'utilisateur est là et.chef/knife-local.rb
est correctement configurés, les liens symboliques des plugins et définissent les autorisations appropriées sur le répertoire et les fichiers à l'intérieur. Cette tâche est configurée de façon à pouvoir être exécutée plusieurs fois en toute sécurité sur un référentiel déjà initialisé (par exemple pour mettre à jour des secrets ou des plugins de couteau).
Il existe également une tâche d'assistance qui reconditionne tous les secrets, chiffre l'archive tar pour tout le monde et la copie dans la boîte de dépôt, pour faciliter l'ajout de nouveaux employés ou la modification de secrets.
Concernant plusieurs environnements: Chef a une fonctionnalité appelée environnements . Je ne l'ai pas encore utilisé, mais il devrait faire ce dont vous avez besoin. Vous pouvez également séparer strictement l'environnement de production (pour éviter que les développeurs ne disposent de clés liées à l'environnement de production) en disposant de deux organisations Hosted Chef ou serveurs Chef distincts. Cet extrait de couteau.rb montre comment configurer le couteau d'une manière différente en fonction de la branche actuellement extraite - vous pouvez l'utiliser pour définir l'environnement ainsi que l'URL du serveur chef. Il existe également un plugin couteau appelé couteau-flux , offrant un flux de travail plus complet à deux organisations.
.chef
dossier pour utiliser des variables d'environnement ou quelque chose?