ansible pass resultado do comando shell para variável

1

Eu fiquei um pouco com id ansible e auto-gerada, eu tenho vários servidores mysql master-slaves para isso eu preciso gerar um server-id.

minha ideia era fazer algo assim:

   - name: generate repli-id
      shell: hostname -I | sed -e 's/ \+\([a-z0-9]\+\:\)\+[a-z0-9]\+//' | sed -e 's/ /\n/' | grep -v '^$' | tail -1 | awk -F. '{print $3 * 256 + $4}'
      register:  slave_repli

    - debug: var=slave_repli.stdout_lines

    - name: rewrite
      template: src=templates/root.j2 dest=/root/test.conf

para obter o ID gerado

TASK [debug] *******************************************************************
task path: /Users/miwi/ansible/roles/test/main.yml:32
ok: [mysqls5slave] => {
    "slave_repli.stdout_lines": [
        "3698"
    ]
}
ok: [mysqls5master] => {
    "slave_repli.stdout_lines": [
        "3699"
    ]
}

minha pergunta agora é como passá-la para o meu arquivo var

slave_server_id: {{slave_server_id}}

    
por Andre Lange 17.10.2016 / 11:56

3 respostas

0

Em vez de gerar o seu ID a partir do seu manual, é aqui que você pode definir um fato personalizado. No seu servidor mysql, você fará algo assim:

mkdir -p /etc/ansible/facts.d
cat <<EOF >/etc/ansible/facts.d/mysql.fact
#!/bin/sh
echo "[mysql]"
echo server_id='hostname -I | sed -e 's/ \+\([a-z0-9]\+\:\)\+[a-z0-9]\+//' | sed -e 's/ /\n/' | grep -v '^$' | tail -1 | awk -F. '{print $3 * 256 + $4}''
EOF
chmod +x /etc/ansible/facts.d/mysql.fact

Execute ansible -m setup your.mysql.ip.address para garantir que seu fato seja executado corretamente. Você deve ter alguns ansible_local['mysql']['mysql']['server_id'] definidos.

Digamos que você queira ansitar para implantar esse fato, você pode fazer algo como:

- name: install fact
  copy: src=myfact dest=/etc/ansible/facts.d/mysql.fact owner=root group=root mode=0755
  register: fact_installed
- name: reload facts
  setup: filter=ansible_local
  when: fact_installed is defined and fact_installed.changed == True

Depois disso, você pode incluir seu modelo, referindo-se à sua variável server_id .

    
por 17.11.2016 / 02:29
0

Você poderia usar o módulo de cópia além de local_action para salvar a variável em um arquivo local em sua máquina de controle e usá-la mais tarde em seu próximo playbook:

- local_action: copy content="slave_server_id: {{ slave_repli.stdout_lines[0] }}" dest=/path/to/var/file
    
por 05.04.2018 / 07:50
0

Você tem duas opções para usar o valor gerado em seu modelo:

Opção 1: use slave_repli.stdout_lines no seu modelo:

# in templates/root.j2:
...
slave_server_id: {{ slave_repli.stdout_lines[0] }}
...

Opção 2: atribuir uma variável

No seu manual:

- name: rewrite
  vars:
    slave_server_id: "{{ slave_repli.stdout_lines[0] }}"
  template:
    src: templates/root.j2
    dest: /root/test.conf

No seu modelo:

# in templates/root.j2:
...
slave_server_id: {{ slave_server_id }}
...

Eu prefiro a segunda abordagem, pois é muito mais limpa.

    
por 11.09.2018 / 18:22

Tags