Ansible: Могу ли я выполнить роль из командной строки?

92

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

Теперь я хочу выполнить эту роль на хосте 192.168.0.10 из командной строки с хоста Ansible.

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

Есть способ сделать это?

Карл
источник

Ответы:

84

Я не знаю об этой функции, но вы можете использовать теги, чтобы просто запустить одну роль из вашей playbook.

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

ansible-playbook webserver.yml --tags "apache"
абуз
источник
62

С помощью 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 / в / ansible / roles или настроенного пути роли.

Подробнее здесь: https://github.com/ansible/ansible/pull/43131

Юлиус Жаромскис
источник
1
Это на самом деле не отвечает на вопрос, потому что нет ссылки на YAML-файл внешней роли, который реализован и хочет включить @kari. У меня такой же вопрос. Однако, прочитав этот ответ, я понимаю только, что это возможно. Я просто не знаю как.
Кола
Надеюсь, я прояснил ответ @Kola
Юлиус Жаромскис
1
Это нарушено в Ansible 2.8. Он просто регистрирует загадочные сообщения об ошибках вроде'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
Это решение, похоже, работает для меня с 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 такого нет, но если вы часто это используете, попробуйте этот скрипт.
Поместите его где-нибудь в свой PATH с возможностью поиска под именем 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'.
Christian Ciach
16

Вы также можете проверить репозиторий ansible-toolbox . Это позволит вам использовать что-то вроде

ansible-role --host 192.168.0.10 --gather --user centos --become my-role
Саша Мирошниченко
источник
13

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

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

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

rkrzr
источник
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-keys и sudoers для выполнения без необходимости вводить пароль - идеально для автоматизации, это может повлиять на безопасность. поэтому вам необходимо проанализировать свою среду, чтобы увидеть, подходит ли она.

Y Melo
источник
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
}

Berlinguyinca
источник