8 votes

Obtenir le nom de l'hôte actuel et le pousser dans le fichier de conf avec ansible

Je travaille sur un playbook ansible pour obtenir le nom d'hôte actuel d'un serveur et le définir dans un fichier de configuration. Je n'arrive pas à comprendre comment je peux pousser la sortie Shell en utilisant le module lineinfile.

  - name: Get hostname
    shell: echo $HOSTNAME
    register: result

  - name: Set hostname on conf file
    lineinfile: dest=/etc/teste/linux/zabbix_agentd.conf regexp="^Hostname=.*" insertafter="^# Hostname=" line=Hostname=????

25voto

udondan Points 2001

En général, pour voir ce qu'il y a dans une variable, vous pouvez utiliser la fonction debug module.

- debug:
    var: result

Ceci devrait vous montrer un objet et ses propriétés qui incluent stdout . C'est le résultat complet de la commande précédente. Donc, pour utiliser le résultat de la première tâche, vous devez utiliser result.stdout .

Pour utiliser n'importe quelle variable, il faut utiliser les expressions Jinja2 : {{ whatever }} . Votre tâche pourrait donc ressembler à ceci :

- name: Set hostname on conf file
  lineinfile:
    dest: /etc/teste/linux/zabbix_agentd.conf
    regexp: ^Hostname=.*
    insertafter: ^# Hostname=
    line: Hostname={{ result.stdout }}

Voilà pour la théorie, mais voici la vraie réponse . Ne le faites pas comme ça. Bien sûr, Ansible connaît déjà le nom d'hôte.

Le nom d'hôte tel qu'il est défini dans votre inventaire serait le suivant {{ inventory_hostname }} . Le nom d'hôte tel que rapporté par le serveur est {{ ansible_hostname }} . En outre, il y a {{ ansible_fqdn }} . Il suffit donc d'utiliser l'une d'entre elles au lieu d'exécuter une tâche supplémentaire :

- name: Set hostname on conf file
  lineinfile:
    dest: /etc/teste/linux/zabbix_agentd.conf
    regexp: ^Hostname=.*
    insertafter: ^# Hostname=
    line: Hostname={{ ansible_hostname }}

1voto

Vous devez passer des variables dans la ligne de commande .

Tout d'abord, enregistrez la variable

---
- hosts: 127.0.0.1
  connection: local
  vars:
  - person: John Snow
  - filename: v1.j2
  vars_files:
  - vars.yml
  tasks:
  - name: Who I am?
    action: command /usr/bin/whoami
    register: myname
  - name: Run jpprog.sh
    action: command ./jpprog.sh
    register: v

  - name: Populate template
    action: template src={{filename}} dest=/tmp/out

Ce playbook exécute deux commandes : la première stocke sa sortie dans une variable appelée myname, et la seconde dans une variable v. Le résultat de whoami est une chaîne unique qui est mise à la disposition du modèle sous variablename.stdout. Le résultat de jpprog.sh est un objet JSON représenté par une chaîne :

{
    "number": 18,
    "name": "john"
}

Le modèle est le suivant :

-> I am {{ myname.stdout }}

{% set t = v.stdout|from_json %}

JSON struct T: {{ t }}

name = {{ t.name }} 
number = {{ t['number'] }}

et la sortie est :

-> I am jpm

JSON struct T: {u'number': 18, u'name': u'john'}

name = john 
number = 18

Source : Site web de Jan-Piet Mens .

0voto

Fox Lollato Points 1
- name: Set hostname on conf file
  command: sed -i s/whatComesAfterHostname=/{{ ansible_hostname }}/g /etc/teste/linux/zabbix_agentd.conf

a fonctionné pour moi.

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