Ansible: Czy mogę wykonać rolę z wiersza poleceń?


92

Załóżmy, że mam rolę o nazwie „apache”

Teraz chcę wykonać tę rolę na hoście 192.168.0.10 z wiersza poleceń z hosta Ansible

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

Czy jest na to sposób?

Odpowiedzi:


84

Nie znam tej funkcji, ale możesz użyć tagów, aby uruchomić tylko jedną rolę ze swojego playbooka.

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

ansible-playbook webserver.yml --tags "apache"

62

Za pomocą ansible 2.7 możesz to zrobić:

$ 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>"
}

Spowoduje to uruchomienie roli od / path / to / ansible / roles lub skonfigurowanej ścieżki roli.

Przeczytaj więcej tutaj: https://github.com/ansible/ansible/pull/43131


1
To tak naprawdę nie odpowiada na pytanie, ponieważ nie ma odniesienia do zaimplementowanego pliku YAML z zewnętrzną rolą @kari, który chce dołączyć. Mam to samo pytanie. Jednak po przeczytaniu tej odpowiedzi rozumiem tylko, że jest to wykonalne. Po prostu nie wiem jak.
Kola

Mam nadzieję, że wyjaśniłem odpowiedź @Kola
Julius Žaromskis

1
To jest zepsute w Ansible 2.8. Po prostu rejestruje tajemnicze komunikaty o błędach, takie jak'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach

Wydaje mi się, że to rozwiązanie działa w przypadku ansibla 2.8.2. Wydaje się, że ma problem z wystawieniem zmiennych na inne role zawarte w pierwotnej roli (co nie jest problemem w playbooku). Próbowałem się zmienić -a "name=<role_name> public=yes", ale to nie pomogło.
user2066480

Aby zrozumieć, co robi -m i -a, zobacz docs.ansible.com/ansible/latest/user_guide/modules_intro.html. Zasadniczo w ten sposób można uruchamiać moduły z wiersza poleceń ( -m <module-name>) z parami klucz = wartość jako argumentami ( -a key=value)
andymel

22

W Ansible nie ma czegoś takiego, ale jeśli jest to częsty przypadek użycia, wypróbuj ten skrypt.
Umieść go gdzieś w swojej przeszukiwalnej PATH pod nazwą 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

3
Stworzyłem propozycję narzędzia „utwórz rolę ansibla
jhutar

4
Wygląda jakby został wdrożony w ansibl 2.7: github.com/ansible/ansible/pull/43131
EM0

Tak, spróbuj ansible localhost -m include_role -a name=myrole- działa dla mnie!
jhutar

ansible localhost -m include_role -a name=myrolejest uszkodzony od ansibla 2.8. Po prostu rejestruje tajemnicze komunikaty o błędach, takie jak'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach


13

Napisałem małą wtyczkę Ansible o nazwie auto_tags, która dynamicznie generuje dla każdej roli w twoim playbooku tag o tej samej nazwie. Znajdziesz go tutaj .

Po zainstalowaniu go (instrukcje są w istocie powyżej) możesz następnie wykonać określoną rolę za pomocą:

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


4

Czy próbowałeś tego? to jest super fajne. Używam roli „update-os” zamiast roli „apache”, aby podać bardziej znaczący przykład. Mam rolę nazwie powiedzmy Spójrzmy prawdzie ./roles/update-os/w moim ./dodaję plik o nazwie ./role-update-os.yml, która wygląda tak:

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

Spraw, aby ten plik był wykonywalny ( chmod +x role-update-os.yml). Teraz możesz biegać i ograniczać do tego, co masz w ekwipunku, ./update-os.yml -i inventory-dev --limit 192.168.0.10do limitu możesz również przekazywać nazwy grup.

  • --limit web,db > web i db to grupa zdefiniowana w Twoim ekwipunku
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Zwróć uwagę, że możesz skonfigurować zasady ssh-keys i sudoers, aby mogły być wykonywane bez konieczności wpisywania hasła - idealne do automatyzacji, ma to wpływ na bezpieczeństwo. dlatego musisz przeanalizować swoje środowisko, aby sprawdzić, czy jest odpowiednie.


2

w ansiblu 2.8 działa nieco inaczej

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
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.