Ansible: Tôi có thể thực thi vai trò từ dòng lệnh không?


91

Giả sử tôi có một vai trò tên là "apache"

Bây giờ tôi muốn thực thi vai trò đó trên máy chủ 192.168.0.10 từ dòng lệnh từ máy chủ Ansible

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

Có cách nào làm được việc này không?

Câu trả lời:


84

Tôi không biết về tính năng này, nhưng bạn có thể sử dụng các thẻ để chỉ chạy một vai trò từ playbook của mình.

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

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

61

Với ansible 2.7, bạn có thể làm điều này:

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

Điều này sẽ chạy vai trò từ / path / đến / ansible / role hoặc đường dẫn vai trò đã định cấu hình.

Đọc thêm tại đây: https://github.com/ansible/ansible/pull/43131


1
Điều này không thực sự trả lời câu hỏi vì không có tham chiếu đến vai trò bên ngoài tệp YAML @kari được triển khai và muốn bao gồm. Tôi có cùng một câu hỏi. Tuy nhiên, sau khi đọc câu trả lời này, tôi chỉ hiểu rằng nó là khả thi. Tôi chỉ không biết làm thế nào.
Kola

Hy vọng rằng tôi đã làm rõ câu trả lời @Kola
Julius Žaromskis

1
Điều này bị hỏng trong Ansible 2.8. Nó chỉ ghi lại các thông báo lỗi khó hiểu như'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach

Giải pháp này dường như hiệu quả với tôi với 2.8.2 ansible. Dường như có vấn đề với việc hiển thị các biến cho các vai trò khác được bao gồm trong vai trò ban đầu (đây không phải là vấn đề trong sách vở). Tôi đã cố gắng thay đổi thành -a "name=<role_name> public=yes", nhưng điều đó không giúp ích gì.
user2066480

Để hiểu -m và -a làm gì, hãy xem docs.ansible.com/ansible/latest/user_guide/modules_intro.html Về cơ bản, đây là cách các mô-đun có thể được bắt đầu từ dòng lệnh ( -m <module-name>) với các cặp key = value làm đối số ( -a key=value)
andymel

22

Không có điều đó trong Ansible, nhưng nếu đây là trường hợp sử dụng thường xuyên đối với bạn, hãy thử tập lệnh này.
Đặt nó ở đâu đó trong PATH có thể tìm kiếm của bạn dưới tên 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
Tôi đã tạo đề xuất công cụ "tạo vai trò có thể nhận diện", chúng ta sẽ thấy: github.com/ansible/proposal/issues/131
jhutar 20/07/18

4
Có vẻ như nó đã được triển khai trong Ansible 2.7: github.com/ansible/ansible/pull/43131
EM0

Vâng, hãy thử ansible localhost -m include_role -a name=myrole- hiệu quả với tôi!
jhutar

ansible localhost -m include_role -a name=myrolebị hỏng kể từ 2.8. Nó chỉ đăng các thông báo lỗi khó hiểu như'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach


13

Tôi đã viết một plugin Ansible nhỏ, được gọi là auto_tags, tự động tạo cho mỗi vai trò trong sách vở của bạn một thẻ cùng tên. Bạn có thể tìm thấy nó ở đây .

Sau khi cài đặt nó (hướng dẫn trong ý chính ở trên), bạn có thể thực thi một vai trò cụ thể với:

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


4

Bạn đã thử điều đó chưa? nó rất tuyệt. Tôi đang sử dụng vai trò 'update-os' thay vì 'apache' để đưa ra một ví dụ có ý nghĩa hơn. Tôi có một vai trò được gọi là giả sử ./roles/update-os/trong tôi, ./tôi thêm một tệp có tên ./role-update-os.ymlgiống như sau:

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

Làm cho tệp này có thể thực thi ( chmod +x role-update-os.yml). Giờ đây, bạn có thể chạy và giới hạn bất cứ thứ gì bạn có trong kho của mình ./update-os.yml -i inventory-dev --limit 192.168.0.10, giới hạn mà bạn có thể vượt qua tên nhóm.

  • --limit web,db > web và db là nhóm được xác định trong khoảng không quảng cáo của bạn
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Lưu ý rằng bạn có thể định cấu hình chính sách ssh-key và sudoers để có thể thực thi mà không cần phải nhập mật khẩu - lý tưởng cho việc tự động hóa, có những tác động bảo mật với điều này. do đó bạn phải phân tích môi trường của mình để xem liệu nó có phù hợp hay không.


2

trong ansible 2.8 nó hoạt động hơi khác một chút

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
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.