2016-10-06 1 views
-1

J'ai créé des fichiers yaml pour chaque type d'environnement dev, qa, intégration. Cependant, il existe plusieurs environnements de développement et je souhaite remplacer certaines modifications via des fichiers yaml spécifiques à l'hôte.Utilisation de hiera_hash pour les changements d'augeas dans la marionnette hiera

Hiera 
|--host 
| |-dev1.internet.com 
| |-dev2.intranet.com 
|--servertype 
| |-dev 
| |-qa 

dev.yaml 
augeas_xml: 
    - 'set /root/node/servername/#text 'dev' 
    - 'set /root/node/serverlocation/#text 'London' 
    - 'set /root/node/ntp/#text '123.123.123.123' 

dev1.internet.com.yaml 
augeas_xml: 
    - 'set /root/node/serverlocation/#text 'New York' 
    - 'set /root/node/ntp/#text '123.123.123.125' 

dev2.intranet.com.yaml 
augeas_xml: 
    - 'set /root/node/serverlocation/#text 'Accrington' 

je besoin d'un moyen d'obtenir la configuration de dev1.internet.com.yaml avoir les éléments suivants

augeas_xml: 
    - 'set /root/node/servername/#text 'dev' 
    - 'set /root/node/serverlocation/#text 'New York' 
    - 'set /root/node/ntp/#text '123.123.123.125' 

hiera_array ne me donne pas le résultat souhaité et hiera_hash me donne l'erreur suivante : Incompatibilité de type Hiera pour la clé 'augeas_xml': attendue Hash and got Array

Les paramètres spécifiques à l'hôte n'ont pas priorité sur les paramètres spécifiques à l'environnement. L'exemple que j'ai donné est pour un petit ensemble de serveurs. J'utilise des marionnettes pour gérer des centaines de serveurs. Je pourrais utiliser hiera et créer un fichier yaml pour chaque hôte. Cependant, je veux avoir un default.yaml et être en mesure de passer outre les changements dans la host.yaml

--- 
:hierarchy: 
    - "host/%{::fqdn}" 
    - "server_type/%{server_type}" 
    - default 
:backends: 
    - yaml 
:yaml: 
    :datadir: "/puppet/hieradata/%{::environment}" 
:merge_behavior: deeper 

Ce dernier produit des

dev1.internet.com.yaml 
    augeas_xml: 
     - 'set /root/node/serverlocation/#text 'New York' 
     - 'set /root/node/ntp/#text '123.123.123.125' 
     - 'set /root/node/servername/#text 'dev' 
     - 'set /root/node/serverlocation/#text 'London' 
     - 'set /root/node/ntp/#text '123.123.123.123' 

mais je veux faire

dev1.internet.com.yaml 
    augeas_xml: 
     - 'set /root/node/servername/#text 'dev' 
     - 'set /root/node/serverlocation/#text 'London' 
     - 'set /root/node/ntp/#text '123.123.123.123' 
     - 'set /root/node/serverlocation/#text 'New York' 
     - 'set /root/node/ntp/#text '123.123.123.125' 
+0

'hiera_hash' ne sert à rien ici, que vous créez en effet des tableaux. Qu'en est-il du résultat de 'hiera_array' n'est pas désiré? S'il vous plaît montrer la sortie qu'il génère, et pourquoi c'est un problème. –

+0

Les paramètres spécifiques à l'hôte n'ont pas priorité sur les paramètres spécifiques à l'environnement. L'exemple que j'ai donné est pour un petit ensemble de serveurs. J'utilise des marionnettes pour gérer des centaines de serveurs. Je pourrais utiliser hiera et créer un fichier yaml pour chaque hôte. Cependant, je veux avoir un default.yaml et être en mesure de remplacer les changements dans le host.yaml – Vash

+0

S'il vous plaît ajouter votre hiera.yaml à la question et plus exactement montrer les emplacements des fichiers que vous décrivez - est-ce un répertoire structure ou une structure logique en haut? –

Répondre

0

Il serait beaucoup plus simple de garder les commandes et chemins Augeas hors de vos fichiers de données et de ne mettre que les bits importants de data - le nom, l'emplacement et l'adresse du serveur - dans les fichiers de données. Les commandes Augeas sont très certainement spécifiques à l'implémentation, pas aux données.

Par exemple:

dev.yaml

servername: 'dev' 
serverlocation: 'London' 
ntp: '123.123.123.123' 

dev1.internet.com.yaml

serverlocation: 'New York' 
ntp: '123.123.123.125' 

dev2.intranet.com.yaml

serverlocation: 'Accrington' 

Ensuite, dans votre manifeste, vous avez quelque chose comme ceci:

$servername = hiera('servername') 
$serverlocation = hiera('serverlocation') 
$ntp = hiera('ntp') 

augeas { 'node': 
    context => '/files/root/node', 
    changes => [ 
    "set servername/#text '$servername'", 
    "set serverlocation/#text '$serverlocation'", 
    "set ntp/#text '$ntp'", 
    ], 
} 

(noter les autres propriétés de ressources Augias sont manquantes et doivent être remplacées par votre propre)