Ansible : 명령 줄에서 역할을 실행할 수 있습니까?


94

"apache"라는 역할이 있다고 가정 해 보겠습니다.

이제 Ansible 호스트의 명령 줄에서 호스트 192.168.0.10에서 해당 역할을 실행하고 싶습니다.

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

그렇게하는 방법이 있습니까?

답변:


85

이 기능에 대해 잘 모르지만 태그를 사용하여 플레이 북에서 하나의 역할 만 실행할 수 있습니다.

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

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

66

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 / roles 또는 구성된 역할 경로에서 역할을 실행합니다.

자세한 내용은 https://github.com/ansible/ansible/pull/43131에서 확인하세요.


1
@kari가 구현하고 포함하고 싶어하는 외부 역할 YAML 파일에 대한 참조가 없기 때문에 이것은 실제로 질문에 대답하지 않습니다. 같은 질문이 있습니다. 그러나이 답변을 읽은 후 나는 그것이 가능하다는 것을 이해합니다. 방법을 모르겠습니다.
Kola


1
이것은 Ansible 2.8에서 깨졌습니다. 그것은 단지 비밀스러운 오류 메시지를 기록합니다'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach

1
이 솔루션은 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
"ansible-role 생성"도구 제안을 만들었습니다. 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=myroleansible 2.8부터 중단되었습니다. 그것은 단지 다음과 같은 비밀스러운 오류 메시지를 기록합니다'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach


13

auto_tags플레이 북의 각 역할에 대해 동일한 이름의 태그를 동적으로 생성 하는 작은 Ansible 플러그인을 작성했습니다 . 여기에서 찾을 수 있습니다. .

설치 후 (지침은 위의 요지에 있음) 다음을 사용하여 특정 역할을 실행할 수 있습니다.

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


4

시도해 보셨습니까? 정말 멋지다. 더 의미있는 예를 제공하기 위해 'apache'역할 대신 'update-os'를 사용하고 있습니다. 내가하자 말라는 역할이 ./roles/update-os/에 내 ./I라는 파일을 추가 ./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 정책을 구성 할 수 있습니다. 자동화에 이상적이며 보안에 영향을줍니다. 따라서 적합한 지 확인하기 위해 환경을 분석해야합니다.


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
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.