Exécuter un PostgreSQL script à l'aide de Ansible
Je suis à la recherche d'un moyen de lancer une Postgres script à l'aide de Ansible. Alors que je trouve un assez bon exemple Ici, j'ai besoin de:
- Exécuter le script en tant qu'utilisateur postgres
- Je n'ai pas forcément besoin de garder une copie du script sur le serveur, donc si j'ai besoin d'avoir une copie, il sera seulement temporaire d'utilisation.
Quelqu'un peut-il me dire si cela est possible et si oui un exemple d'exécution. Voici ce que j'ai essayé jusqu'à présent à l'aide de Ansible, et il a juste accroché à ces points:
- name: Testing DB to make sure it is available
command: psql -U bob image
register: b
- debug: b
- name: Verifying Tables exist in Image
shell: \d image
register: c
- debug: c
- name: Exiting Image DB
shell: \q
register: d
- debug: d
- name: Going to Agent DB
command: psql -U bob agent
register: e
- debug: e
Ce bloque toujours à la première partie lors de la connexion à l'image DB.
OriginalL'auteur ryekayo | 2015-08-19
Vous devez vous connecter pour publier un commentaire.
Pourquoi ça ne marche pas
Ce:
ne fait pas ce que vous pensez que cela fonctionne.
La première commande s'exécute
psql -U bob image
. Cela commence unpsql
session.psql
attend entrée stdin. Ansible ne vous enverra jamais de tout, il est tout simplement en attente pour la commande spécifiée à la sortie, de sorte qu'il peut vérifier le code de sortie.Donc Ansible attend
psql
à la sortie, etpsql
attend Ansible pour envoyer de l'entrée.Chaque tâche dans Ansible est indépendant. Le
shell
oucommand
modules de ne pas changer la coque qu'à la suite d'exécution des commandes. Vous simplement ne pouvez pas le faire comme vous le souhaitez.Même si
psql
quitté après la première tâche (ou est passé à l'arrière-plan), vous pourriez juste obtenir une erreur à partir de la deuxième tâche:Donc la façon dont vous essayez de faire, ce n'est tout simplement pas aller travailler.
Comment le faire
Vous avez besoin pour exécuter chaque tâche séparément
psql
de commande, avec une chaîne de commande:... ou avec l'entrée standard, sauf que Ansible ne semble pas à l'appui de la fourniture d'une variable comme stdin pour une commande.
... ou avec une (peut-être basé sur un modèle) de script SQL:
Alternativement, vous pouvez utiliser Ansible de la prise en charge intégrée pour les requêtes de PostgreSQL pour le faire, mais dans ce cas, vous ne pouvez pas utiliser le
psql
du client de barre oblique inverse des commandes comme\d
, vous devez utiliser uniquement SQL. Requêteinformation_schema
pour la table info, etc.Voici comment certains de mon code ressemble
Voici un exemple à partir d'un module d'automatisation j'ai écrit qui fait beaucoup avec PostgreSQL.
Vraiment, je dois le sucer et écrire une
psql
Ansible tâche qui exécute des commandes viapsql
, plutôt que d'utilisershell
, ce qui est affreux et maladroit. Pour l'instant, cependant, il fonctionne. J'ai utiliser des chaînes de connexion qui sont affectées à partir des variables ou générées à l'aide deset_fact
à réduire le désordre un peu et de faire des liens plus souple.J'aimerais utiliser le
template
module ou Ansible de support pour la copie de fichiers à copier sur un script sql en tant qu'un fichier temporaire, puis l'exécuter avecpsql -f
. Si j'avais besoin de vérifier les résultats de chacun des énoncés, je ne l'utiliseraispsql -c 'SELECT ...'
au lieu de cela, avec chacun d'eux comme une tâche distincte.merci pour l'aide. J'ai terminé l'ansible script et il fonctionne très bien.
OriginalL'auteur Craig Ringer
La réponse que Craig donne est bonne, mais ne parvient pas à résoudre le problème de l'exécution de ces commandes en tant qu'utilisateur spécifique. Qui peut être fait avec mes ajouts à son code:
Note le "devenir" et "become_user" paramètres". Ces dira Ansible pour changer à l'utilisateur avant d'exécuter les commandes.
IMPORTANT: Ansible la Version 1.9 et l'utilisation antérieure
sudo: yes
etsudo_user: postgres
au lieu debecome: true
etbecome_user: postgres
Merci pour l'edit Nathan. Cette réponse a été écrit à l'origine avant de
become
a été introduit, mais c'est une bonne modifier à ce point afin de refléter comportement actuel.OriginalL'auteur smiller171
S'appuyant sur l'excellente réponses ci-dessus, vous pouvez également spécifier des variables d'environnement dans votre Ansible tâche comme indiqué ci-dessous. Notez que cela suppose que vous avez mis en place un .pgpass fichier avec le mot de passe pour la cible db.
OriginalL'auteur Roy Wood