Ansible: Dapatkah saya menjalankan peran dari baris perintah?

92

Misalkan saya memiliki peran yang disebut "apache"

Sekarang saya ingin menjalankan peran itu pada host 192.168.0.10 dari baris perintah dari host yang mungkin

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

Apakah ada cara untuk melakukannya?

Karl
sumber

Jawaban:

84

Saya tidak mengetahui fitur ini, tetapi Anda dapat menggunakan tag hanya untuk menjalankan satu peran dari buku pedoman Anda.

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

ansible-playbook webserver.yml --tags "apache"
beramai-ramai
sumber
62

Dengan kemungkinan 2.7 Anda bisa melakukan ini:

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

Ini akan menjalankan peran dari / path / ke / ansible / role atau konfigurasi jalur peran.

Baca lebih lanjut di sini: https://github.com/ansible/ansible/pull/43131

Julius Žaromskis
sumber
1
Ini tidak benar-benar menjawab pertanyaan karena tidak ada referensi ke file YAML peran eksternal yang diimplementasikan @kari dan ingin disertakan. Saya memiliki pertanyaan yang sama. Namun setelah membaca jawaban ini, saya hanya mengerti bahwa itu layak. Saya hanya tidak tahu bagaimana caranya.
Kola
Semoga saya telah mengklarifikasi jawaban @Kola
Julius Žaromsis
1
Ini rusak di Ansible 2.8. Itu hanya mencatat pesan kesalahan samar seperti'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
Solusi ini tampaknya berhasil untuk saya dengan kemungkinan 2.8.2. Tampaknya ada masalah dengan mengekspos variabel ke peran lain yang termasuk dalam peran asli (yang bukan masalah dalam buku pedoman). Saya mencoba mengubah ke -a "name=<role_name> public=yes", tetapi itu tidak membantu.
user2066480
Untuk memahami apa -m dan -a lihat docs.ansible.com/ansible/latest/user_guide/modules_intro.html Pada dasarnya, ini adalah bagaimana modul dapat dimulai dari baris perintah ( -m <module-name>) dengan key = value pair sebagai argumen ( -a key=value)
andymel
22

Tidak ada yang namanya Ansible, tetapi jika ini adalah kasus yang sering Anda gunakan, coba skrip ini.
Letakkan di suatu tempat dalam PATH Anda yang dapat dicari di bawah nama 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
sumber
3
Saya telah membuat proposal alat "buat peran yang mungkin", kita akan melihat: github.com/ansible/proposals/issues/131
jhutar
4
Sepertinya ini telah diterapkan di Ansible 2.7: github.com/ansible/ansible/pull/43131
EM0
Ya, silakan coba ansible localhost -m include_role -a name=myrole- berhasil untuk saya!
jhutar
ansible localhost -m include_role -a name=myrolerusak karena kemungkinan 2.8. Itu hanya mencatat pesan kesalahan samar seperti'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
16

Anda juga dapat memeriksa repositori ansible-toolbox . Ini akan memungkinkan Anda untuk menggunakan sesuatu seperti

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

Saya telah menulis plugin Ansible kecil, bernama auto_tags, yang secara dinamis menghasilkan tag dengan nama yang sama untuk setiap peran di buku pedoman Anda. Anda bisa menemukannya di sini .

Setelah menginstalnya (petunjuknya ada di inti di atas) Anda kemudian dapat menjalankan peran tertentu dengan:

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

rkrzr.dll
sumber
4

Sudahkah kamu mencobanya? itu sangat keren. Saya menggunakan 'update-os' alih-alih peran 'apache' untuk memberikan contoh yang lebih bermakna. Saya memiliki peran yang disebut katakanlah ./roles/update-os/saya ./menambahkan file bernama ./role-update-os.ymlyang terlihat seperti:

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

Jadikan file ini dapat dieksekusi ( chmod +x role-update-os.yml). Sekarang Anda dapat menjalankan dan membatasi apa pun yang Anda miliki di inventaris ./update-os.yml -i inventory-dev --limit 192.168.0.10, batasnya, Anda juga dapat memberikan nama grup.

  • --limit web,db > web dan db adalah grup yang ditentukan dalam inventaris Anda
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Perhatikan bahwa Anda dapat mengonfigurasi kebijakan ssh-keys dan sudoers agar dapat mengeksekusi tanpa harus mengetikkan kata sandi - ideal untuk otomatisasi, ada implikasi keamanan dengan ini. oleh karena itu Anda harus menganalisis lingkungan Anda untuk melihat apakah itu cocok.

Y Melo
sumber
2

di 2,8 mungkin bekerja sedikit berbeda

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
sumber