55 votes

Templating with Linux in a Shell Shell ?

Ce que je veux accomplir, c'est.. :

1.) Avoir un fichier de configuration comme modèle, avec des variables comme $version $path (par exemple apache config)

2.) Avoir un Shell Shell qui "remplit" les variables du modèle et écrit le fichier généré sur le disque.

Est-ce possible avec un Shell Shell. Je vous serais très reconnaissant si vous pouviez me citer quelques commandes/outils qui me permettraient d'accomplir cela ou quelques bons liens.

60voto

Lirt Points 590

La façon la plus simple d'effectuer cette opération dans l'interface de programmation de Linux est d'utiliser la commande envsubst et Variables d'environnement.

Exemple de fichier modèle apache.tmpl :

<VirtualHost *:${PORT}>
    ServerName ${SERVER_NAME}
    ServerAlias ${SERVER_ALIAS}
    DocumentRoot "${DOCUMENT_ROOT}"
</VirtualHost>

Exécuter envsubst et de produire le résultat dans un nouveau fichier my_apache_site.conf :

export PORT="443"
export SERVER_NAME="example.com"
export SERVER_ALIAS="www.example.com"
export DOCUMENT_ROOT="/var/www/html/"
envsubst < apache.tmpl > my_apache_site.conf

Sortie :

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot "/var/www/html/"
</VirtualHost>

43voto

mmDonuts Points 131

C'est tout à fait possible. Une façon très simple de mettre cela en œuvre serait que le fichier modèle soit en fait le script et utilise des variables script telles que

#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
cat > /tmp/destfile <<-EOF
here is some config for version $version which should
also reference this path $path
EOF

Il est même possible de configurer cela sur la ligne de commande en spécifiant version=$1 y path=$2 Vous pouvez donc l'exécuter comme suit bash script /foo/bar/baz 1.2.3 . は、その - avant EOF fait que les espaces blancs avant les lignes sont ignorés. <<EOF si vous ne voulez pas de ce comportement.

Une autre façon de procéder serait d'utiliser la fonctionnalité de recherche et de remplacement de sed

#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
sed -e "s/VERSION/$version/g" -e "s/PATH/$path/" /path/to/templatefile > /tmp/destfile

qui remplacerait chaque instance des chaînes VERSION et PATH. S'il y a d'autres raisons pour lesquelles ces chaînes se trouvent dans le fichier modèle, vous pouvez faire en sorte que votre recherche et votre remplacement soient les suivants VERSION ou %VERSION% ou quelque chose de moins susceptible d'être déclenché accidentellement.

5voto

jonathanpeppers Points 103

Si vous souhaitez des modèles légers et réels plutôt que du code Shell qui génère de nouveaux fichiers, les choix habituels sont les suivants sed & awk o perl . Voici un lien : http://savvyadmin.com/generate-text-from-templates-scripts-et-csv-data/

Moi, j'utiliserais un vrai langage comme perl, tcl, Python, ruby ou autre dans cette classe. Quelque chose de construit pour les scripts. Ils ont tous de bons outils de modélisation simples et des tonnes d'exemples dans Google.

4voto

Samat Jain Points 165

Vous devriez probablement vous intéresser à un système de gestion de la configuration tel que Marionnette o Chef cuisinier . Ces derniers peuvent facilement faire ce que vous décrivez ci-dessus et beaucoup plus.

4voto

zstegi Points 41

J'utilise shtpl pour cela. (projet privé de ma part, ce qui signifie qu'il n'est pas largement utilisé. Mais peut-être voulez-vous le tester quand même)

Par exemple, si vous souhaitez générer un fichier /etc/network/interfaces à partir d'un fichier csv, vous pouvez le faire de cette manière :

Contenu du fichier CSV (ici test.csv) :

eth0;10.1.0.10;255.255.0.0;10.1.0.1
eth1;192.168.0.10; 255.255.255.0;192.168.0.1

Modèle (ici interfaces.tpl) :

#% IFS=';'
#% while read "Val1" "Val2" "Val3" "Val4"; do
auto $Val1 
iface $Val1 inet static
  address $Val2 
  netmask $Val3 
  gateway $Val4 

#% done < "$CSVFILE"

Commandement :

$ CSVFILE=test.csv sh -c "$( shtpl interfaces.tpl )"

Résultat :

auto eth0 
iface eth0 inet static
  address 10.1.0.10 
  netmask 255.255.0.0 
  gateway 10.1.0.1 

auto eth1 
iface eth1 inet static
  address 192.168.0.10 
  netmask  255.255.255.0 
  gateway 192.168.0.1

Bonne lecture !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X