2017-03-03 2 views
-1

L'utilisation de marionnettes pour modifier un fichier listener.ora:manière correcte de regex parenthèse match file_line fantoche après l'article

file_line { 'addFloatingListenerTCPS': 
    ensure => present, 
    path => "${LSNR_PATH}/listener.ora", 
    line => "  (ADDRESS = (PROTOCOL = TCPS)(HOST = ${FLOATING_IP})(PORT = 1522))", 
    after => "^\s+(ADDRESS = (PROTOCOL = TCPS)(HOST = DB)(PORT = 1522))", 
    require => Class["othernode"] 
} 

Cela ne provoque pas d'erreurs de marionnettes, mais place la nouvelle entrée tout le chemin à la fin de le fichier, plutôt que dans le bloc d'écoute où il devrait être. (Pour moi, cela indique que la valeur de l'attribut after ne correspond pas au contenu du fichier, donc le mode ajout par défaut de la marionnette).

Modification de la valeur d'attribut after pour échapper à toutes les parenthèses:

after => "^\s+\(ADDRESS = \(PROTOCOL = TCPS\)\(HOST = DB\)\(PORT = 1522\)\)", 

génère plusieurs avertissements dans la console:

Warning: Unrecognised escape sequence '\(' in file /etc/puppet/modules/test_conf/manifests/init.pp at line 30 
Warning: Unrecognised escape sequence '\(' in file /etc/puppet/modules/test_conf/manifests/init.pp at line 30 
Warning: Unrecognised escape sequence '\)' in file /etc/puppet/modules/test_conf/manifests/init.pp at line 30 
Warning: Unrecognised escape sequence '\(' in file /etc/puppet/modules/test_conf/manifests/init.pp at line 30 
Warning: Unrecognised escape sequence '\)' in file /etc/puppet/modules/test_conf/manifests/init.pp at line 30 
Warning: Unrecognised escape sequence '\(' in file /etc/puppet/modules/test_conf/manifests/init.pp at line 30 
Warning: Unrecognised escape sequence '\)' in file /etc/puppet/modules/test_conf/manifests/init.pp at line 30 
Warning: Unrecognised escape sequence '\)' in file /etc/puppet/modules/test_conf/manifests/init.pp at line 30 

rendant inutilisable par satellite. Cependant, l'exécution se termine et après la nouvelle entrée est à l'intérieur du bloc où il devrait être.

Cela soulève plusieurs questions:

  1. sont-parenthèses interprétés comme des caractères spéciaux, et si oui, pourquoi ne peuvent-ils être échappées?
  2. Est-ce que les expressions régulières de marionnette stdlib gèrent les références?
+0

fonctionne-t-il: '"^\\ s + \\ (adresse = \\ (PROTOCOLE = EPTC \\) \\ (HOST = DB \\) \\ (PORT = 1522 \\) \\) "' – MohaMad

Répondre

0

Oui, vous avez besoin d'échapper à l'intérieur de votre expression de parantheses régulière au sein de l'attribut after de votre ressource file_line. Les parenthèses sont utilisées dans les expressions régulières pour capturer des parties de l'expression à utiliser ultérieurement par des variables. Toutefois, les avertissements sont générés car vous avez des guillemets doubles (") pour votre chaîne d'expressions rationnelles. Cela amène l'analyseur de marionnettes à interpréter initialement les \ comme des échappements de chaîne interpolés et non des échappements d'expression régulière. Par conséquent, vous devez modifier votre valeur d'expression rationnelle en une chaîne littérale pour que l'analyseur l'interprète correctement.

after => '^\s+\(ADDRESS = \(PROTOCOL = TCPS\)\(HOST = DB\)\(PORT = 1522\)\)', 

Ceci supprimera vos avertissements de marionnettes.

L'explication ci-dessus répond à vos deux questions supplémentaires aussi, mais voici un résumé rapide répété:

  1. Oui; ils peuvent et sont.
  2. Oui

D'ailleurs, aurait pris la marionnette charpie pour vous aussi: https://github.com/rodjek/puppet-lint