Назад | Перейти на главную страницу

Получите текущее имя хоста и вставьте его в файл conf с помощью ansible

Я работаю над доступным сценарием, чтобы получить текущее имя хоста сервера, а затем установить его в файл конфигурации. Я не могу понять, как я могу отправить вывод оболочки с помощью модуля 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=????

В общем, чтобы посмотреть, что находится внутри переменной, вы можете использовать debug модуль.

- debug:
    var: result

Это должно показать вам объект и его свойства, которые включают stdout. Это полный результат предыдущей команды. Итак, чтобы использовать результат первой задачи, вы должны использовать result.stdout.

Чтобы использовать любую переменную, вы должны использовать выражения Jinja2: {{ whatever }}. Итак, ваша задача могла бы выглядеть так:

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

Так много теории, но вот настоящий ответ. Не делай этого так. Конечно, Ansible уже знает имя хоста.

Имя хоста, как определено в вашем инвентаре, будет {{ inventory_hostname }}. Имя хоста, сообщаемое сервером: {{ ansible_hostname }}. Дополнительно есть {{ ansible_fqdn }}. Поэтому просто используйте любой из них вместо выполнения дополнительной задачи:

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

Вам следует передавать переменные в командной строке.

Сначала зарегистрируйте переменную

---
- 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


Эта книга запускает две команды: первая сохраняет свой вывод в переменной с именем myname, а вторая - в переменной v. Результатом whoami является одна строка, которая становится доступной для шаблона как variablename.stdout. Результатом jpprog.sh является объект JSON, представленный в виде строки:

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

Шаблон следующий:

-> I am {{ myname.stdout }}

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

JSON struct T: {{ t }}

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

и вывод:

-> I am jpm

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

name = john 
number = 18

Источник:Веб-сайт Jan-Piet Mens.

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

работал у меня.