Sự khác biệt giữa mặc định và bình trong vai trò Ansible là gì?


151

Khi tạo một vai trò Ansible mới, mẫu tạo cả thư mục a varsdefaultsthư mục chứa một main.ymltệp trống . Khi xác định vai trò của mình, tôi có thể đặt các định nghĩa biến trong một trong hai định nghĩa này và chúng sẽ có sẵn trong các nhiệm vụ của tôi.

Sự khác biệt giữa việc đưa các định nghĩa vào defaultsvà là varsgì? Những gì nên đi vào defaults, và những gì nên vào vars? Liệu nó có ý nghĩa để sử dụng cả hai cho cùng một dữ liệu?

Tôi biết rằng có một sự khác biệt về quyền ưu tiên / ưu tiên giữa hai người, nhưng tôi muốn hiểu những gì nên đi đâu.

Hãy nói rằng vai trò của tôi sẽ tạo ra một danh sách các thư mục trên hệ thống đích. Tôi muốn cung cấp một danh sách các thư mục mặc định sẽ được tạo, nhưng muốn cho phép người dùng ghi đè lên chúng khi sử dụng vai trò.

Đây là những gì nó sẽ trông như thế nào:

---
- directories:
  - foo
  - bar
  - baz

Tôi có thể đặt cái này vào defaults/main.ymlhoặc trong vars/main.yml, từ góc độ thực thi, nó sẽ không tạo ra bất kỳ sự khác biệt nào - nhưng nó nên đi đâu?

Câu trả lời:


113

Tài liệu Ansible về quyền ưu tiên thay đổi tóm tắt niceley này:

Nếu nhiều biến có cùng tên được xác định ở những nơi khác nhau, chúng sẽ thắng theo một thứ tự nhất định, đó là:

  • vars thêm (-e trong dòng lệnh) luôn luôn giành chiến thắng
  • sau đó đến các biến kết nối được xác định trong kho (ansible_ssh_user, v.v.)
  • sau đó đến "hầu hết mọi thứ khác" (chuyển đổi dòng lệnh, vars đang chơi, bao gồm các vars, vars vai trò, v.v.)
  • sau đó đến phần còn lại của các biến được xác định trong kho
  • sau đó đến sự thật được phát hiện về một hệ thống
  • sau đó "mặc định vai trò", là "mặc định" nhất và mất ưu tiên cho mọi thứ.

Vì vậy, giả sử bạn có một "tomcat" vai trò mà bạn sử dụng để cài đặt Tomcat trên một loạt các webhost, nhưng bạn cần phiên bản khác nhau của tomcat trên một vài máy chủ, cần nó để chạy như người dùng khác nhau trong những trường hợp khác, vv Các defaults/main.ymltập tin có thể trông đại loại như thế này:

tomcat_version: 7.0.56
tomcat_user: tomcat

Vì đó chỉ là các giá trị mặc định, điều đó có nghĩa là chúng sẽ được sử dụng nếu các biến đó không được xác định ở bất kỳ nơi nào khác cho máy chủ được đề cập. Bạn có thể ghi đè chúng thông qua các vars phụ, thông qua các sự kiện trong tệp kho của bạn, v.v. để chỉ định các giá trị khác nhau cho các biến này.

Chỉnh sửa: Lưu ý rằng danh sách trên là dành cho Ansible 1.x. Trong Ansible 2.x, danh sách đã được mở rộng. Như mọi khi, Tài liệu Ansible cung cấp một mô tả chi tiết về quyền ưu tiên biến cho 2.x.


4
Cảm ơn, đó là một trang tuyệt vời - đó là những gì tôi đang tìm kiếm. Tôi đi sâu vào chi tiết hơn rất nhiều về những gì cần đưa vào defaultsvà những gì varstiếp theo.
nwinkler 18/03/2015

42
đó là giá trị nhấn mạnh: vars vai trò có một ưu tiên cao ác . Theo kinh nghiệm của tôi, chúng cao hơn chơi vars, điều này thực sự gây phiền nhiễu.
tedder42

5 năm sau, nhưng ... tôi có xu hướng nhìn nó theo cách này: mặc định vai trò là những thứ mà tôi mong đợi một người sử dụng vai trò sẽ ghi đè lên trong lọ của họ ở đâu đó. Vars vai trò, OTOH, cho phép tôi tránh thông tin mã hóa cứng trong một nhiệm vụ, nhưng có khả năng sẽ chỉ bị ghi đè để thử nghiệm và được thay đổi bởi một người duy trì vai trò. Ví dụ: tên người dùng quản trị ban đầu sẽ ở mặc định, nhưng phiên bản phụ thuộc sẽ ở dạng vars.
ntwrkguru

41

Các biến vai trò được xác định trong varcó độ ưu tiên rất cao - chúng chỉ có thể được ghi đè bằng cách chuyển chúng trên dòng lệnh, trong tác vụ cụ thể hoặc trong một khối. Do đó, gần như tất cả các biến của bạn nên được xác định trong defaults.

Trong bài viết " Ưu tiên biến - Nơi đặt vai trò của bạn ", tác giả đưa ra một ví dụ về những gì cần đưa vào vars: Các hằng số cụ thể theo hệ thống không thay đổi nhiều. Vì vậy, bạn có thể có vars/debian.ymlvars/centos.ymlcó cùng tên biến nhưng giá trị khác nhau và bao gồm chúng có điều kiện.


3

IMHO nó là không thực tế và không hợp lý rằng nơi Ansible như ưu tiên cao về cấu hình trong vars của vai trò . Cấu hình trong vars/main.ymldefaults/main.ymlnên thấp và có thể là cùng một ưu tiên.

Có bất kỳ ví dụ thực tế nào về các trường hợp chúng ta muốn loại hành vi này không?

Có những ví dụ mà chúng tôi không muốn điều này.

Điểm cần làm ở đây là cấu hình trong defaults/main.ymlkhông thể động. Cấu hình trong vars/main.ymlcan. Vì vậy, ví dụ, bạn có thể bao gồm cấu hình cho hệ điều hành cụ thể và phiên bản động như được hiển thị trong ge Muffguy.postgresql

Tuy nhiên, do được ưu tiên là rất lạ và không thực tế trong nhu cầu geerlingguy Ansible để giới thiệu các biến giả như có thể thấy trong variables.yml

- name: Define postgresql_packages.
  set_fact:
    postgresql_packages: "{{ __postgresql_packages | list }}"
  when: postgresql_packages is not defined

Đây là một ví dụ thực tế cụ thể cho thấy rằng sự ưu tiên là không thực tế.

Một điểm khác để làm ở đây là chúng tôi muốn các vai trò có thể được cấu hình. Vai trò có thể là bên ngoài, được quản lý bởi người khác. Theo nguyên tắc chung, bạn không muốn cấu hình trong các vai trò có mức độ ưu tiên cao.


Đây phải là một bình luận, không phải là một câu trả lời.
ntwrkguru

3

Về cơ bản, bất cứ thứ gì đi vào vai trò của mặc định, mặc định (thư mục mặc định bên trong vai trò) là dễ uốn nắn và dễ bị ghi đè nhất. Bất cứ điều gì trong thư mục vars của vai trò ghi đè các phiên bản trước của biến đó trong không gian tên. Ý tưởng ở đây để làm theo là bạn càng hiểu rõ về phạm vi, nó càng được ưu tiên hơn với dòng lệnh -e vars thêm luôn luôn chiến thắng. Các biến chủ và / hoặc khoảng không quảng cáo có thể giành được các giá trị mặc định của vai trò, nhưng không bao gồm rõ ràng như thư mục vars hoặc tác vụ bao gồm. tài liệu


-4

Biến và mặc định đi tay trong tay. đây là một ví dụ

-name: install package
 yum: name=xyz{{package_version}} state=present

trong tập tin mặc định của bạn, bạn sẽ có một cái gì đó như:

package_version: 123

Những gì ansible sẽ làm là, nó sẽ lấy giá trị package_versionvà đặt nó bên cạnh tên gói để nó sẽ được đọc ở đâu đó như:

-name: install package
 yum: name=xyz123 state=present

Bằng cách này, nó sẽ cài đặt xyz123và không xyz123.4hoặc bất cứ thứ gì có trong kho lưu trữ tuyệt vời của xyz's.

Cuối cùng nó sẽ làm yum install -y xyz123

Vì vậy, về cơ bản mặc định là các giá trị hiện tại, nếu bạn không đặt giá trị cụ thể cho các biến, khiến không gian đó không thể trống.


Bị từ chối vì nó không giải quyết được câu hỏi. Rõ ràng defaultsđược sử dụng khi không có varsđịnh nghĩa, nhưng câu trả lời không giải thích, tại sao bạn lại định nghĩa một giá trị là cái này hay cái kia, đó là những gì OP yêu cầu. So sánh với lời giải thích dưới đây.
Thomas Hirsch
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.