Obtém o nome do host atual e envia-o para o arquivo conf com ansible

4

Estou trabalhando em um playbook ansible para obter o nome do host atual de um servidor e, em seguida, configurá-lo em um arquivo de configuração. Eu não consigo descobrir como posso empurrar a saída do shell usando o módulo 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=????
    
por pedrocalixto 01.03.2016 / 22:13

3 respostas

11

Em geral, para ver o que está dentro de uma variável, você pode usar o módulo debug .

- debug:
    var: result

Isso deve mostrar um objeto e suas propriedades que incluem stdout . Esse é o resultado completo do comando anterior. Então, para usar a saída da primeira tarefa, você usaria result.stdout .

Para usar qualquer variável, você usaria expressões Jinja2: {{ whatever }} . Então, sua tarefa poderia ser assim:

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

Tanto para teoria, mas aqui vem a verdadeira resposta . Não faça assim. Claro que o Ansible já sabe o nome do host.

O nome do host, conforme definido em seu inventário, seria {{ inventory_hostname }} . O nome do host conforme relatado pelo servidor é {{ ansible_hostname }} . Além disso, há {{ ansible_fqdn }} . Então, basta usar qualquer um deles em vez de executar uma tarefa adicional:

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

Você deve passar variáveis na linha de comando .

Primeiro, registre a variável

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


Este playbook executa dois comandos: o primeiro armazena sua saída em uma variável chamada myname e o segundo em uma variável v. O resultado de whoami é uma única string que é disponibilizada para o modelo como variablename.stdout. O resultado de jpprog.sh é um objeto JSON representado como uma string:

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

O modelo segue:

-> I am {{ myname.stdout }}

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

JSON struct T: {{ t }}

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

e a saída é:

-> I am jpm

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

name = john 
number = 18

Fonte: Site Jan-Piet Mens .

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

funcionou para mim.

    
por 27.09.2018 / 22:23