Ansible: Чи можу я виконати роль з командного рядка?


90

Припустимо, у мене є роль під назвою "apache"

Тепер я хочу виконати цю роль на хості 192.168.0.10 з командного рядка з Ansible хоста

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

Чи є спосіб зробити це?

Відповіді:


84

Мені не відома ця функція, але ви можете використовувати теги, щоб просто запустити одну роль із вашої книги ігор.

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

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

60

За допомогою ansible 2.7 ви можете зробити це:

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

Це буде запускати роль із / path / to / ansible / role або налаштований шлях до ролі.

Детальніше читайте тут: https://github.com/ansible/ansible/pull/43131


1
Це насправді не відповідає на запитання, оскільки немає посилання на внесений файл YAML зовнішньої ролі @kari, який потрібно включити. У мене таке саме запитання. Проте прочитавши цю відповідь, я лише розумію, що це можливо. Я просто не знаю як.
Кола

Будемо сподіватися, що я пояснив відповідь @Kola
Julius Žaromskis

1
Це порушено в Ansible 2.8. Він просто реєструє загадкові повідомлення про помилки, наприклад'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Крістіан Чіач,

Здається, це рішення працює для мене з ansible 2.8.2. Здається, у нього проблема з виставленням змінних іншим ролям, включеним до початкової ролі (що не є проблемою в ігровій книзі). Я спробував змінити на -a "name=<role_name> public=yes", але це не допомогло.
user2066480

Щоб зрозуміти, що таке -m та -a, див. Docs.ansible.com/ansible/latest/user_guide/modules_intro.html В основному, це те, як модулі можна запускати з командного рядка ( -m <module-name>) з парами ключ = значення як аргументи ( -a key=value)
andymel

22

У Ansible такого немає, але якщо це часто використовується для вас, спробуйте цей сценарій.
Помістіть його десь у вашому ШЛЯХІ, що можна шукати, під назвою 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
Я створив пропозицію інструменту "створити роль відповідаючого", ми побачимо: github.com/ansible/proposals/issues/131
jhutar

4
Схоже, це було впроваджено в Ansible 2.7: github.com/ansible/ansible/pull/43131
EM0

Так, будь ласка, спробуйте ansible localhost -m include_role -a name=myrole- працює для мене!
jhutar

ansible localhost -m include_role -a name=myroleпорушено, оскільки відповідає 2.8. Він просто реєструє загадкові повідомлення про помилки, наприклад'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Крістіан Чіач,


13

Я написав невеликий плагін Ansible, який називається auto_tags, який динамічно генерує для кожної ролі у вашій книзі ігор однойменний тег. Ви можете знайти його тут .

Після встановлення (інструкції наведені в суті вище) ви можете виконати певну роль за допомогою:

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


4

Ви пробували це? це супер круто. Я використовую 'update-os' замість ролі 'apache', щоб надати більш значущий приклад. У мене є роль, яка називається, скажімо, ./roles/update-os/в моєму ./я додаю файл із назвою, ./role-update-os.ymlякий виглядає так:

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

Зробіть цей файл виконуваним ( chmod +x role-update-os.yml). Тепер ви можете запустити та обмежити тим, що у вас є в інвентарі, ./update-os.yml -i inventory-dev --limit 192.168.0.10ліміт, який ви також можете передати іменам груп.

  • --limit web,db > web і db - це група, визначена у вашому інвентарі
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Зверніть увагу, що ви можете налаштувати ssh-ключі та політику sudoers, щоб їх можна було виконувати без необхідності вводити пароль - ідеально підходить для автоматизації, це має наслідки для безпеки. тому вам доведеться проаналізувати своє оточення, щоб побачити, чи воно підходить.


2

у ansible 2.8 це працює дещо інакше

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
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.