2010-09-02 9 views
3

J'essaie de modéliser ma configuration Apache httpd pour le déploiement dans différents environnements et je voudrais utiliser l'application Cheetah en langage Python pour le faire. Cependant, j'ai de la difficulté avec le programme de ligne de commande cheetah et je crois que c'est une combinaison de mon malentendu Cheetah avec un manque de documentation.Python Cheetah - Spécifier les paires nom/valeur pour les modèles

Mon objectif est d'avoir un seul fichier modèle httpd.conf et de substituer des variables d'un fichier de définition spécifique à l'environnement.

httpd.tmpl:

Listen $HTTP_PORT 
... 
#if $ENABLE_HTTPS == true 
<Virtual Host *:$HTTPS_PORT> 
    ... 
</VirtualHost> 
#end if 

production.env:

HTTP_PORT=34120 
HTTPS_PORT=34121 
ENABLE_HTTPS=true 

Quelle est la ligne de commande nécessaire pour remplir ce modèle Cheetah? Je l'ai utilisé:

cheetah f --oext conf --debug httpd

Mais évidemment prod.env n'est pas lu comme un fichier d'entrée. Ajout d'un #include au sommet de mon fichier modèle:

#include "prod.env" 

Et aucun de mes noms se trouvent:

Cheetah.NameMapper.NotFound: cannot find 'APACHE_PORT' 

Ce n'est pas la situation idéale de toute façon, parce que je veux la possibilité de spécifier le nom/Mappage de valeurs sur la ligne de commande pour chaque invocation de guépard.

Merci! Je suis conscient que je peux écrire un script python pour effectuer la lecture du fichier, puis le remplacer en utilisant l'API Cheetah. Cependant, je cherche un moyen d'utiliser la ligne de commande pour remplir mon modèle.


SOLVED

Merci au lien de la documentation fournie par @pyfunc Je comprends maintenant comment accomplir cela. Le problème principal est de fournir --env sur la ligne de commande guépard qui transmet les variables d'environnement actuelles au guépard. Ces variables d'environnement doivent être exportées en premier.

Répondre

0

Cheetah encapsule chaque morceau de texte #include à l'intérieur d'un objet Modèle imbriqué.

Utilisez

#include raw "prod.env" 

également

#set global $HTTP_PORT="34120" 

Pour inclure différents fichiers env, vous aurez trop que trop créer des modèles à.

Veuillez regarder ce qui suit pour des exemples qui devraient vous aider.

+0

Merci pour l'affichage. Comment aborderiez-vous la substitution du nom de fichier d'environnement ("prod.env") pour différents environnements? Je veux éviter les valeurs de codage en dur dans les modèles. – purecharger

+0

J'ai modifié ma réponse. Le lien ci-dessus démontre et peut vous aider à le faire. – pyfunc

+0

Merci pour le pointeur! Ainsi, le produit suivant la sortie prévue: 'APACHE_PORT = 10240 ENABLE_HTTPS = true guépard f --env --oext httpd' conf Cependant, la définition de ces variables d'environnement dans une étape séparée ne produit pas la sortie désirée: $ source prod.env $ définir | egrep "(APACHE | HTTPS)" APACHE_PORT = 10800 ENABLE_HTTPS = true guépard $ f --env --oext ... httpd conf Cheetah.NameMapper.NotFound: ne peut pas trouver 'APACHE_PORT' Toutes les idées? EDIT: arrg! les commentaires ne permettent pas le formatage complet, désolé! – purecharger