Resposta: Posso executar a função na linha de comando?

90

Suponha que eu tenha uma função chamada "apache"

Agora quero executar essa função no host 192.168.0.10 a partir da linha de comando do host Ansible

ansible-playbook -i  "192.168.0.10" --role  "path to role"

Existe uma maneira de fazer isso?

Karl
fonte

Respostas:

83

Não estou ciente desse recurso, mas você pode usar tags para executar apenas uma função de seu manual.

roles:
    - {role: 'mysql', tags: 'mysql'}
    - {role: 'apache', tags: 'apache'}

ansible-playbook webserver.yml --tags "apache"
abuzze
fonte
57

Com o ansible 2.7, você pode fazer isso:

$ cd /path/to/ansible/
$ ansible localhost -m include_role -a name=<role_name>
localhost | SUCCESS => {
    "changed": false,
    "include_variables": {
        "name": "<role_name>"
    }
}
localhost | SUCCESS => {
    "msg": "<role_name>"
}

Isso executará a função de / path / para / ansible / roles ou o caminho da função configurada.

Leia mais aqui: https://github.com/ansible/ansible/pull/43131

Julius Žaromskis
fonte
Isso realmente não responde à pergunta porque não há referência ao arquivo YAML de função externa que @kari implementou e deseja incluir. Eu tenho a mesma pergunta. Mesmo assim, depois de ler essa resposta, só entendo que é viável. Só não sei como.
Kola
Espero ter esclarecido a resposta @Kola
Julius Žaromskis
1
Isso está quebrado no Ansible 2.8. Ele apenas registra mensagens de erro enigmáticas como'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
Esta solução parece funcionar para mim com o ansible 2.8.2. Parece haver um problema em expor variáveis ​​a outras funções incluídas na função original (o que não é um problema em um manual). Tentei mudar para -a "name=<role_name> public=yes", mas não ajudou.
user2066480 de
22

Não existe tal coisa no Ansible, mas se este for um caso de uso frequente para você, tente este script.
Coloque-o em algum lugar dentro de seu PATH pesquisável sob o nome ansible-role:

#!/bin/bash

if [[ $# < 2 ]]; then
  cat <<HELP
Wrapper script for ansible-playbook to apply single role.

Usage: $0 <host-pattern> <role-name> [ansible-playbook options]

Examples:
  $0 dest_host my_role
  $0 custom_host my_role -i 'custom_host,' -vv --check
HELP
  exit
fi

HOST_PATTERN=$1
shift
ROLE=$1
shift

echo "Trying to apply role \"$ROLE\" to host/group \"$HOST_PATTERN\"..."

export ANSIBLE_ROLES_PATH="$(pwd)/roles"
export ANSIBLE_RETRY_FILES_ENABLED="False"
ansible-playbook "$@" /dev/stdin <<END
---
- hosts: $HOST_PATTERN
  roles:
    - $ROLE
END
Konstantin Suvorov
fonte
3
Eu criei uma proposta de ferramenta para "criar um papel ansible", veremos: github.com/ansible/proposals/issues/131
jhutar
4
Parece que foi implementado no Ansible 2.7: github.com/ansible/ansible/pull/43131
EM0
Sim, tente ansible localhost -m include_role -a name=myrole- funciona para mim!
jhutar
ansible localhost -m include_role -a name=myroleestá quebrado desde o ansible 2.8. Ele apenas registra mensagens de erro enigmáticas como'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
16

Você também pode verificar o repositório ansible-toolbox . Isso permitirá que você use algo como

ansible-role --host 192.168.0.10 --gather --user centos --become my-role
Sasha Miroshnychenko
fonte
13

Eu escrevi um pequeno plug-in Ansible, chamado auto_tags, que gera dinamicamente para cada função em seu manual uma tag com o mesmo nome. Você pode encontrar aqui .

Depois de instalá-lo (as instruções estão na essência acima), você pode executar uma função específica com:

ansible-playbook -i "192.168.0.10" --tags "name_of_role"

rkrzr
fonte
4

Você já tentou isso? é super legal. Estou usando a função 'update-os' em vez da função 'apache' para dar um exemplo mais significativo. Eu tenho uma função chamada digamos ./roles/update-os/no meu, ./eu adiciono um arquivo chamado ./role-update-os.ymlque se parece com:

#!/usr/bin/ansible-playbook
---
- hosts: all
  gather_facts: yes
  become: yes
  roles:
  - update-os

Torne este arquivo executável ( chmod +x role-update-os.yml). Agora você pode executar e limitar o que quer que tenha em seu inventário, ./update-os.yml -i inventory-dev --limit 192.168.0.10o limite que você pode passar os nomes dos grupos também.

  • --limit web,db > web e db é o grupo definido em seu inventário
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Observe que você pode configurar as políticas de ssh-keys e sudoers para serem executadas sem a necessidade de digitar a senha - ideal para automação, há implicações de segurança nisso. portanto, você deve analisar seu ambiente para ver se ele é adequado.

Y Melo
fonte
2

no ansible 2.8 funciona um pouco diferente

wohlgemuth@leela:~/workspace/rtmtb-ansible/kvm-cluster$ ansible localhost -m import_role -a name=rtmtb
 [WARNING]: No inventory was parsed, only implicit localhost is available

localhost | CHANGED => {
    "changed": true, 
    "checksum": "d31b41e68997e1c7f182bb56286edf993146dba1", 
    "dest": "/root/.ssh/id_rsa.github", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b7831c4c72f3f62207b2b96d3d7ed9b3", 
    "mode": "0600", 
    "owner": "root", 
    "size": 3389, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.46-139127672211209/source", 
    "state": "file", 
    "uid": 0
}
localhost | CHANGED => {
    "changed": true, 
    "checksum": "1972ebcd25363f8e45adc91d38405dfc0386b5f0", 
    "dest": "/root/.ssh/config", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f82552a9494e40403da4a80e4c528781", 
    "mode": "0644", 
    "owner": "root", 
    "size": 147, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.99-214274671218454/source", 
    "state": "file", 
    "uid": 0
}

berlinguyinca
fonte