Ansible Playbooks vs Roles


97

Theo tài liệu Ansible, Playbook là:

... cơ sở cho một hệ thống quản lý cấu hình và triển khai nhiều máy thực sự đơn giản, không giống bất kỳ hệ thống nào đã tồn tại và một hệ thống rất phù hợp để triển khai các ứng dụng phức tạp.

Và, một lần nữa, theo cùng những tài liệu đó, Vai trò là:

... cách tự động tải các vars_files, tác vụ và trình xử lý nhất định dựa trên cấu trúc tệp đã biết. Nhóm nội dung theo vai trò cũng cho phép dễ dàng chia sẻ vai trò với những người dùng khác.

Tuy nhiên, sự phân biệt giữa chúng và các trường hợp sử dụng khác nhau của chúng không phải là rõ ràng ngay lập tức đối với tôi. Ví dụ: nếu tôi định cấu hình /etc/ansible/hoststệp của mình trông giống như sau:

[databases]
mydb01.example.org
mydb02.example.org

[mail_servers]
mymail01.example.org
mymail_dr.example.org

... thì mục " [databases]" này ... có vai trò gì? Hoặc tên của một tệp YAML playbook ở đâu đó? Hay cái gì khác?!?

Nếu ai đó có thể giải thích cho tôi sự khác biệt về những điều này, sự hiểu biết của tôi về Ansible sẽ được nâng cao hơn rất nhiều!

  • Playbook so với Vai trò [databases]và các mục tương tự trong/etc/ansible/hosts
  • Nếu Playbook được xác định bên trong tệp YAML, thì Vai trò được định nghĩa ở đâu?
  • Ngoài việc ansible.cfgsống trên máy chủ Ansible, làm cách nào để thêm / định cấu hình Ansible với Playbook / Vai trò có sẵn? Ví dụ, khi tôi chạy ansible-playbook someplaybook.yaml, làm thế nào Ansible biết nơi để tìm cuốn sách đó?

1
Vai trò là một cách để làm cho mã trong sách chơi có thể sử dụng lại bằng cách đưa chức năng vào "thư viện" tổng quát để sau đó có thể được sử dụng trong bất kỳ sách phát nào khi cần.
Juan Jimenez

taskslàm công cụ. playbookstổ chức và khởi động các nhiệm vụ. rolestổ chức các nhóm tác vụ, trình xử lý, v.v. thực hiện một chức năng cụ thể. Một số playbooklà cần thiết để khởi chạy role(các). Bạn sẽ gọi một bộ sưu tập của rolesplaybooks? Giả sử ví dụ một cái quản lý cấu hình của tất cả các máy chủ trên trang web của bạn?
fbicknel

Câu trả lời:


110

Playbook so với Vai trò so với [cơ sở dữ liệu] và các mục nhập tương tự trong / etc / ansible / hosts

[databases]là một tên riêng cho một nhóm máy chủ. Nó cho phép bạn tham chiếu nhiều máy chủ bằng một tên duy nhất.

Vai trò là một tập hợp các tác vụ và các tệp bổ sung để định cấu hình máy chủ lưu trữ để phục vụ cho một vai trò nhất định .

Playbook là bản đồ giữa máy chủ và vai trò.

Ví dụ từ tài liệu mô tả dự án ví dụ. Nó chứa hai điều:

  • Sách chơi. site.yml, webservers.yml, fooservers.ymlLà playbooks.
  • Vai trò: roles/common/roles/webservers/chứa các định nghĩa commonwebserversvai trò tương ứng.

Bên trong playbook ( webservers.yml) bạn có một cái gì đó như:

---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
  roles: <- this is list of roles to assign to these hosts
     - common
     - webservers

Nếu Playbook được xác định bên trong tệp YAML, thì Vai trò được định nghĩa ở đâu?

Chúng được định nghĩa bên trong các roles/*thư mục. Các vai trò được xác định chủ yếu bằng cách sử dụng tệp YAML, nhưng cũng có thể chứa tài nguyên thuộc bất kỳ loại nào ( files/, templates/). Theo định nghĩa vai trò tài liệu được cấu trúc theo cách này:

  • Nếu tồn tại các role / x / task / main.yml, các tác vụ được liệt kê trong đó sẽ được thêm vào vở kịch
  • Nếu tồn tại các role / x / handlers / main.yml, các trình xử lý được liệt kê trong đó sẽ được thêm vào vở kịch
  • Nếu tồn tại các role / x / vars / main.yml, các biến được liệt kê trong đó sẽ được thêm vào vở kịch
  • Nếu tồn tại các role / x / meta / main.yml, mọi phụ thuộc vai trò được liệt kê trong đó sẽ được thêm vào danh sách các vai trò (1.3 trở lên)
  • Mọi tác vụ sao chép đều có thể tham chiếu đến các tệp trong vai trò / x / tệp / mà không cần phải định hướng chúng một cách tương đối hoặc tuyệt đối
  • Bất kỳ tác vụ tập lệnh nào cũng có thể tham chiếu các tập lệnh trong vai trò / x / tệp / mà không cần phải định hướng chúng một cách tương đối hoặc tuyệt đối
  • Bất kỳ tác vụ mẫu nào cũng có thể tham chiếu đến các tệp trong vai trò / x / mẫu / mà không cần phải định hướng chúng một cách tương đối hoặc tuyệt đối
  • Bất kỳ tác vụ bao gồm nào cũng có thể tham chiếu tệp trong vai trò / x / nhiệm vụ / mà không cần phải định hướng chúng một cách tương đối hoặc tuyệt đối

Tệp quan trọng nhất là roles/x/tasks/main.ymlở đây bạn xác định các tác vụ sẽ được thực thi khi vai trò được thực thi.

Ngoài ansible.cfg sống trên máy chủ Ansible, làm cách nào để thêm / định cấu hình Ansible với Playbook / Roles có sẵn? Ví dụ: khi tôi chạy ansible-playbook someplaybook.yaml, làm cách nào Ansible biết tìm playbook đó ở đâu?

$ ansible-playbook someplaybook.yaml

Sẽ tìm kiếm một cuốn sách bên trong thư mục hiện tại.

$ ansible-playbook somedir/somedir/someplaybook.yaml

Sẽ tìm kiếm một cuốn sách bên trong somedir/somedir/thư mục.

Bạn có trách nhiệm đặt dự án của mình với tất cả các vở kịch và vai trò trên máy chủ. Ansible không liên quan gì đến điều đó.


Cảm ơn @Yaroslav Admin (+1) - một câu hỏi tiếp theo: bạn nói rằng vai trò được xác định bên trong thư mục , nhưng sau đó điều gì thực sự thiết lập vai trò? Nói cách khác, webservers.ymlplaybook ánh xạ các [webservers]máy chủ đến vai trò commonwebserversvai trò. Nhưng những gì chính xác được bao gồm với commonvai trò? Không có cách nào để xác định điều đó trong các thư mục, vì vậy có các tệp YAML thường bên trong các "thư mục vai trò" đó không? Cảm ơn một lần nữa!
smeeb

@smeeb Vâng, bạn đúng vai trò được xác định bởi các tệp bên trong thư mục đó. Chúng chủ yếu là YAML, nhưng cũng có thể chứa các loại tệp khác. Xem câu trả lời cập nhật để biết thêm chi tiết.
Quản trị viên Yaroslav

36

Playbook so với Vai trò so với [cơ sở dữ liệu] và các mục nhập tương tự trong / etc / ansible / hosts

Vai trò là một cách để nhóm các nhiệm vụ lại với nhau vào một vùng chứa. Bạn có thể có một vai trò để thiết lập MySQL, một vai trò khác để thiết lập Postfix, v.v.

Sách chơi xác định điều gì đang xảy ra ở đâu . Đây là nơi bạn xác định các máy chủ (nhóm máy chủ, xem bên dưới) và các vai trò sẽ được áp dụng cho các máy chủ đó.

[databases]và các mục khác trong kho của bạn là nhóm máy chủ. Các nhóm máy chủ xác định một tập hợp các máy chủ mà một vở kịch sẽ chạy.

Một vở kịch là một tập hợp các nhiệm vụ hoặc vai trò (hoặc cả hai) bên trong một vở kịch. Trong hầu hết các trường hợp (và ví dụ), một vở kịch sẽ chỉ chứa một vở kịch duy nhất. Nhưng bạn có thể có bao nhiêu tùy thích. Điều đó có nghĩa là bạn có thể có một playbook sẽ chạy vai trò postfixtrên nhóm máy chủ mail_serversvà vai trò mysqltrên nhóm máy chủ databases:

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

Nếu Playbook được xác định bên trong tệp YAML, thì Vai trò được định nghĩa ở đâu?

Trong Ansible, hầu hết mọi thứ đều được định nghĩa trong YAML, được tính cho các vai trò và sách vở.

Ngoài ansible.cfg sống trên máy chủ Ansible, làm cách nào để thêm / định cấu hình Ansible với Playbook / Roles có sẵn? Ví dụ: khi tôi chạy ansible-playbook someplaybook.yaml, làm cách nào Ansible biết tìm playbook đó ở đâu?

AFAIK bạn phải cung cấp đường dẫn đến playbook khi gọi ansible-playbook. Vì vậy, ansible-playbook someplaybook.yamlmong đợi someplaybook.yamlsẽ được trong thư mục hiện tại của bạn. Nhưng bạn có thể cung cấp đường dẫn đầy đủ:ansible-playbook /path/to/someplaybook.yaml


13

Đó là một câu hỏi thuật ngữ / ngữ nghĩa. Nó có thể mang tính chủ quan, mặc dù đã có định nghĩa cơ sở.

Quan điểm của tôi như sau:

Bất kỳ hệ thống quản lý / triển khai cấu hình nào đều có:

  1. source data - dữ liệu được sử dụng để tạo cấu hình của máy chủ đích
  2. target data - dữ liệu được sử dụng để xác định máy chủ đích
  3. config changes- danh sách / bộ quy tắc / hành động mà chúng tôi áp dụng với source datatrên máy chủ mục tiêu dựa trêntarget data

Trong điều kiện Ansible:

  1. source data- là những nơi khác nhau mà chúng ta có thể đặt dữ liệu - group_vars, playbookvars, rolevars, v.v., Những nơi này ảnh hưởng đến mức độ ưu tiên (nếu một biến có tên giống nhau được xác định lại ở các vị trí khác nhau, có những quy tắc rất cụ thể về giá trị của biến trong ansible/ ansible-playbookthực thi
  2. target data - là khoảng không quảng cáo (Và, cũng có thể xác định các biến khoảng không quảng cáo / nhóm máy chủ bên trong khoảng không quảng cáo!)
  3. config changes - ansible có 4 cấp độ trừu tượng cho nó:
    1. nhiệm vụ - một hành động
    2. danh sách nhiệm vụ - danh sách các hành động
    3. vai trò - danh sách các hành động (hoặc danh sách các danh sách) được nhóm theo cùng một 'chủ đề', thường tất cả các mục tiêu đang hoạt động trên cùng một máy chủ / nhóm máy chủ
    4. playbook - danh sách các lượt chơi, mỗi lượt hoạt động trên các nhóm máy chủ có thể khác nhau, áp dụng một số roles / tasks / danh sách tác vụ (và các tác vụ đặc biệt như handlers)

Từ khía cạnh 'phần mềm' - vai trò phải đủ chung để được sử dụng lại .

Ngoài ra ở một số tổ chức (khá lớn), 'vai trò' được chuyển bởi nhóm A, trong khi được sử dụng trong các vở kịch do nhóm B.

tóm lược

Tất cả những điều trên cho phép nhóm các cấu hình tương tự - thành một role. nhóm các hệ thống con / thành phần có liên quan thành một playbook. Ngoài ra, đáng nhắc đến, 1 YAML mục trong một playbook (bao gồm cả hosts:và một trong hai hoặc tasks, pre_tasks, post_tasks, roles) được gọi là mộtplay

Bây giờ cho câu hỏi của bạn:

Vâng, nó là khó hiểu lúc đầu.

Bạn thường kết nối của bạn source datavới ngữ nghĩa của vai trò của bạn, vì vậy khi bạn thấy vai trò đó setup_dbđược áp dụng trong một vở kịch trên nhóm máy chủ có liên quan (ví dụ db_hosts) Nhưngplay có thể đang chạy trên một liên hợp của một số nhóm máy chủ. Nó chỉ là vấn đề của quy ước và tính linh hoạt.

PS

Vui lòng viết lại cho tôi xem điều này có làm tăng thêm sự nhầm lẫn hay không. Cảm ơn.


1

Cũng nên nhớ rằng một playbook có thể gọi nhiều hơn một vai trò nếu một tệp meta được sử dụng nhằm mục đích ảnh hưởng đến các vai trò khác nhau.

Playbook mẫu: dual_role-playbook.yml

- name: Some Action for two roles
  hosts: localhost

  vars_files:
    - roles/dual_role/meta/main.yml

  roles:
    - dual_role/container-1
    - dual_role/container-2

Lược đồ thư mục và tệp vai trò sẽ giống như sau:

dual_role-playbook.yml
  -- roles
     -- dual_role
        -- meta/main.yml
        -- container-1
           -- tasks/main.yml
           -- templates/template.j2
        -- container-2
           -- tasks/main.yml
           -- templates/template.j2

0

Chỉ cần đặt:

Playbook giống như chương trình chính, nó chứa các hướng dẫn đầy đủ để hoàn thành công việc. Tuy nhiên, đối với các dự án lớn, việc thực sự đưa từng chi tiết vào đó là điều không nên. Vì vậy, bạn cần vai trò.

Vai trò là một chương trình con và thường đạt được một mục tiêu, ví dụ: thiết lập một máy chủ cơ sở dữ liệu. Bạn có thể đặt nó vào roles/thư mục hoặc tải xuống các vai trò của bên thứ 3 bằng cách cung cấp URI rolesfile.ymlvà yêu cầu ansible-galaxy tải chúng xuống cho bạn.

Đây [database]là một nhóm máy chủ được xác định trong tệp khoảng không quảng cáo liệt kê các máy chủ thuộc databasenhóm. Bạn cũng có thể chỉ định một nhóm máy chủ web bằng cách chỉ định một số thứ như

[web]
web1.example.com
web2.example.com

Nhóm webhoặc databasesau đó có thể được sử dụng trong các vở kịch hoặc vai trò để chỉ định các máy chủ để áp dụng.

Các nhóm cũng có thể được sử dụng trong lệnh ansibleđể chạy các lệnh đặc biệt.

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.