Làm cách nào để tự động cài đặt vai trò Ansible Galaxy?


129

Tất cả các vở kịch / vai trò Ansible của tôi được kiểm tra trong repo git của tôi.

Tuy nhiên, đối với vai trò Ansible Galaxy, tôi luôn phải tải xuống từng cái một cách rõ ràng trên mỗi máy tôi muốn chạy Ansible từ đó.

Thậm chí rất khó để biết trước chính xác vai trò Ansible Galaxy nào là cần thiết cho đến khi Ansible phàn nàn về vai trò bị thiếu trong thời gian chạy.

Làm thế nào một người được cho là quản lý các phụ thuộc vai trò Ansible Galaxy? Tôi muốn họ đã kiểm tra chúng trong repit git của tôi cùng với phần còn lại của mã ansible của tôi hoặc để chúng tự động được nhận dạng và tải xuống khi tôi chạy Ansible trên máy mới.


galaxy.ansible.com/docs/USE/index.html Đây là mọi thứ bạn cần để sử dụng ansible-galaxy. Đó là một tài liệu được thực hiện tốt! Ngay cả khi bạn là người mới bắt đầu :)
Ayra

@pdeva Bạn có thể chấp nhận một trong những câu trả lời hợp lệ dưới đây không?
GG.

Câu trả lời:


148

Bạn nên sử dụng một requirements.ymltập tin cho trường hợp sử dụng này. Mô tả các vai trò bạn yêu cầu, sử dụng bất kỳ phương pháp cài đặt nào:

# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight

# Install a role from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight

# Install a role from a specific git branch
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: origin/master

# Install a role at a specific tag from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: 1.0.0

# Install a role at a specific commit from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: <commit hash>

Sau đó cài đặt chúng:

ansible-galaxy install -r requirements.yml

Đây là một ví dụ hoạt động (cài đặt OpenDaylight sử dụng Ansible làm nhà cung cấp Vagrant). Xem các tài liệu Ansible có liên quan để biết thêm.


Xem thêm @Kieran Andrew trả lời dưới đây. Nó mở rộng cái này
Marco Ferrari

1
Điều này thực sự không tự động cài đặt các phụ thuộc vai trò của một cuốn sách, nó cài đặt rõ ràng một danh sách các phụ thuộc đã được liệt kê thủ công bởi người đã tạo ra một cuốn sách.
Neil

53

Theo đề xuất, bạn có thể sử dụng thiên hà ansible cho nhu cầu này.

Ansible có một tính năng nơi bạn có thể tạo một requirements.ymltệp liệt kê tất cả các vai trò của mình. Bạn có thể tìm hiểu về điều đó tại đây: http://docs.ansible.com/ansible/latest/galax.html#installing-multipl-roles-from-a-file

Ví dụ: (tests.yml):

- src: yatesr.timezone

Sau đó, bạn chạy ansible-galaxy install -r requirements.ymltrên tệp này để tải xuống tất cả các vai trò được liệt kê ở đó.

Nếu bạn muốn tự động hóa nó thêm nữa, bạn có thể tạo một tập lệnh shell đơn giản sẽ chạy hai lệnh.

Ví dụ: (ansible.sh):

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 

1
Chỉ cần thử nghiệm, Nó hiển thị một thông báo rằng các vai trò đã được tải xuống, không có lỗi. Phiên bản2.2.1
Igonato

Nếu Playbook sử dụng các vai trò thiên hà mà bạn đang cài đặt thì chúng sẽ không chạy lần đầu tiên khi playbook được gọi vì sự hiện diện của chúng được kiểm tra trước khi chúng được tải xuống. Gọi cho playbook lần thứ hai sau đó sẽ nhận các vai trò mới được cài đặt.
Ben

Tôi đã cập nhật về cách mà bây giờ tôi đang thực hiện nó, với một tập lệnh bao bọc để giảm các lệnh.
Kieran Andrew

19

Tôi thường thấy mình cài đặt cài đặt Java JDK. Sử dụng một vai trò làm cho liên lạc đó dễ dàng hơn. Tôi đã thử một vài cách khác nhau (bao gồm rất nhiều .gitmodules và mô hình con ... Tôi phải sử dụng nhiều hệ thống git cho công việc và tất cả đều trở nên xấu xí). Yêu cầu lớn nhất của tôi là tôi không kiểm tra mã vai trò trong dự án playbook của mình, chủ yếu là để tôi có thể giữ mọi thứ ở một nơi.

Nội dung của tệp 'tests.yml' của tôi:

- src: https://github.com/staylorx/ansible-role-wls-prep.git
  version: master
  name: staylorx.wls-prep

- src: https://my-work-git-extravaganza.com
  version: 2.x
  name: coolplace.niftyrole

#From Ansible Galaxy
- src: staylorx.oracle-jdk

Tôi chạy một playbook riêng, install-vai.yml:

---

- hosts: localhost

  tasks:
    - file:
        path:  roles
        state: absent

    - local_action:
        command ansible-galaxy install -r requirements.yml --roles-path roles

    - lineinfile:
        dest:   .gitignore
        regexp: '^\/roles$'
        line:   '/roles'
        state:  present

Tôi chạy playbook đầu tiên này, sau đó tôi chạy các vai trò của mình trong bất kỳ playbook nào một cách bình thường. Đối với tôi, bí mật là đảm bảo nó bị bỏ qua bởi git vì vậy tôi không kiểm tra các vai trò do nhầm lẫn. Ngoài ra, vì tôi xóa sạch thư mục mỗi lần, tôi đảm bảo rằng tôi không cần phải ép buộc hoặc bỏ qua lỗi.


Nó sẽ thất bại với 'không tìm thấy vai trò' trước khi bạn chạy lệnh cục bộ.
Daniel Andrei Mincă

1
@ Mincă Daniel Andrei bạn cần sử dụng cách năng động, ví dụ bao gồm_role. kiểm tra cái này
user1686407

4

Một giải pháp khác là sử dụng mô đun con git. Xét cho cùng, Ansible Galaxy chỉ là một thư mục của kho github ...

Tôi sử dụng lệnh này để tự động thêm bất kỳ vai trò Galaxy nào dưới dạng mô hình con:

ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh

Cam kết thay đổi sau đó để repo git của bạn. Khi bạn sao chép repo của mình trong tương lai, hãy đảm bảo sao chép nó với các mô hình con, vdgit clone ... --recursive

Một lợi thế của điều này là, một mô hình con git luôn tham chiếu một phiên bản cụ thể (git commit-hash). Điều này sẽ ngăn bạn chạy các bản cập nhật chưa được kiểm tra trong môi trường sản xuất của bạn. Một phiên bản mới của vai trò Galaxy có thể có lỗi hoặc hoạt động hoàn toàn khác so với trước đây. Với một mô hình con git, bạn quyết định xem và khi nào bạn cập nhật vai trò lên phiên bản mới.

Ngoài ra, bạn sẽ không phải chăm sóc thêm các vai trò thiên hà trong danh sách đen .gitignoređể ngăn chặn việc đưa mã của chúng vào kho lưu trữ của bạn.


5
Đây là thực tế xấu theo ý kiến ​​của tôi. Sau đó, đơn giản hơn là sử dụng các công cụ quản lý phụ thuộc sau đó để dán các repo SCM lại với nhau, đặc biệt là khi chúng ta đang nói về các mô đun con git cho SCM.
David Resnick

1
Đã đồng ý. Trong thực tế, tôi không sử dụng điều này nữa. Tuy nhiên, đây là một cách tiếp cận hợp lệ vì thiên hà không thể hoàn hảo. Galaxy sẽ không kiểm tra các bản cập nhật, ngay cả khi một phiên bản bị lỗi trong tệp yêu cầu của bạn, nếu bạn buộc nó tải xuống lại tất cả các vai trò với --forcecờ không có giấy tờ, nó sẽ không hiển thị cho bạn nếu hoặc thực sự thay đổi. Đó là hộp đen bạn chỉ có thể kiểm soát nếu bạn giữ các vai trò thiên hà đã tải xuống trong SCM. Vì những lý do khác dù sao đó cũng là một ý tưởng tốt. Khi kéo các mô đun con ít nhất bạn thấy vai trò nào đã thay đổi.
udondan

BTW, tất cả các vấn đề con có, AFAIK không đáng kể trong tình huống này vì chúng có liên quan đến việc sửa đổi nội dung của chúng. Kéo là hoàn toàn tốt theo kinh nghiệm của tôi ..
udondan

4

Bạn có thể sử dụng vai trò Ansible để cài đặt các vai trò cần thiết bằng mô-đun lệnh .

Đây là một ví dụ rất cơ bản chạy ansible-galaxy install:

- name: Install roles from Ansible Galaxy
  command: ansible-galaxy install {{ item.item }}
  with_items:
    - "{{ ansible_roles_list }}"

ansible_roles_listthể được cung cấp dưới dạng một biến hoặc là một tham số vai trò.

Nếu bạn làm điều này trong một vai trò, nó phải được áp dụng trước bất kỳ vai trò nào khác mà bạn muốn cài đặt bằng cách sử dụng nó, trong một playbook riêng. Điều này là do Ansible kiểm tra xem tất cả các vai trò có sẵn trước khi chạy playbook nơi bạn tham chiếu chúng không.


trứng và gà :)
bazeusz

2

Tại thời điểm này, theo như tôi biết thì không có cách nào để tự động tải xuống các vai trò trong thời gian chạy. Đặt cược tốt nhất của bạn là cam kết chúng vào repo của riêng bạn hoặc có một tài liệu phù hợp liệt kê tất cả các yêu cầu. Bạn thậm chí có thể tạo một playbook trước chuyến bay để cài đặt vai trò của bạn. :)


3
Bạn có thể sử dụng tệp tests.txt cho việc này. Xem: docs.ansible.com/ từ
toast38coza

0

Ở đây, yêu cầu của tôi là về vai trò và được sử dụng trong install.yml

chính.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r {{ role_path }}/requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml
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.