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:
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
'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
-a "name=<role_name> public=yes"
, nhưng điều đó không giúp ích gì.
-m <module-name>
) với các cặp key = value làm đối số ( -a key=value
)
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
ansible localhost -m include_role -a name=myrole
- hiệu quả với tôi!
ansible localhost -m include_role -a name=myrole
bị 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'.
Bạn cũng có thể kiểm tra kho lưu trữ hộp công cụ ansible . Nó sẽ cho phép bạn sử dụng những thứ như
ansible-role --host 192.168.0.10 --gather --user centos --become my-role
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"
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.yml
giố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.
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
}