2016-09-13 20 views
6

hiera.yamlMúa rối hiera tương đương trong Ansible

--- 
:hierarchy: 
- node/%{host_fqdn} 
    - site_config/%{host_site_name} 
    - site_config/perf_%{host_performance_class} 
    - site_config/%{host_type}_v%{host_type_version} 
    - site/%{host_site_name} 
    - environments/%{site_environment} 
    - types/%{host_type}_v%{host_type_version} 
    - hosts 
    - sites 
    - users 
    - common 
# options are native, deep, deeper 
:merge_behavior: deeper 

Chúng tôi hiện có hiera cấu hình này. Vì vậy, cấu hình được hợp nhất trong chuỗi sau common.yaml> users.yaml> sites.yaml> hosts.yaml> types/xxx_vxxx.yaml> vv. Đối với các cấu trúc phân cấp trên cùng, nó sẽ bị ghi đè chỉ khi tệp đó tồn tại.

ví dụ: common.yaml

server: 
    instance_type: m3.medium 

site_config/mysite.yaml

server: 
    instance_type: m4.large 

Vì vậy, đối với tất cả các trang web khác, các loại ví dụ sẽ m3.medium, nhưng chỉ cho mysite nó sẽ là m4.large.

Làm cách nào để có thể đạt được điều tương tự trong Ansible?

+0

Ok wow: đây là một câu hỏi siêu thực. Tôi muốn nói điều này là không thể trong nội tại Ansible. Toàn bộ khái niệm tra cứu dữ liệu động được ưu tiên theo cách mà Puppet làm cho chúng được gắn chặt với cách mà Puppet hoạt động như một phần mềm mà tôi không nghĩ nó phù hợp với những gì Ansible đang cố gắng đạt được. Điều này nghe có vẻ như một ý tưởng FOSS mới thực sự thú vị. –

Trả lời

3

Tôi nghĩ rằng @Xiong nói đúng là bạn nên đi theo các biến trong Ansible.
Bạn có thể thiết lập khoảng không quảng cáo linh hoạt với các mức độ ưu tiên từ chung cho đến cụ thể.

Nhưng bạn có thể thử đoạn này nếu nó giúp:

--- 
- hosts: loc-test 
    tasks: 
    - include_vars: hiera/{{ item }} 
     with_items: 
     - common.yml 
     - "node/{{ ansible_fqdn }}/users.yml" 
     - "node/{{ ansible_fqdn }}/sites.yml" 
     - "node/{{ ansible_fqdn }}/types/{{ host_type }}_v{{ host_type_version }}.yml" 
     failed_when: false 

    - debug: var=server 

này sẽ cố gắng nạp biến từ các tập tin với cấu trúc tương tự như câu hỏi của bạn.
Không tồn tại các tệp không tồn tại (vì failed_when: false).
Các tệp được tải theo thứ tự danh sách này (từ trên xuống dưới), ghi đè lên các giá trị trước đó.

Gotchas:

  • tất cả các biến mà bạn sử dụng trong danh sách phải được xác định (ví dụ host_type trong ví dụ này không thể được định nghĩa trong common.yml), bởi vì danh sách các mục để lặp được templated trước toàn bộ vòng lặp được thực hiện (xem bản cập nhật cho giải pháp thay thế).

  • Ghi đè an toàn (thay thế) dấu gạch ngang theo mặc định, tôi đoán trường hợp sử dụng của bạn mong đợi hành vi hợp nhất. Điều này có thể đạt được với cài đặt hash_behavior - nhưng điều này là không bình thường đối với Playbook Ansible.

P.S. Bạn có thể thay đổi hành vi hợp nhất từ ​​trên xuống dưới bằng cách thay đổi with_items thành with_first_found và đảo ngược danh sách (từ cụ thể đến chung). Trong trường hợp này Ansible sẽ tải các biến từ tập tin đầu tiên được tìm thấy.

Cập nhật: các biến sử dụng từ trước bao gồm trong đường dẫn tệp.

Bạn có thể chia vòng lặp thành nhiều tác vụ, do đó, Ansible sẽ đánh giá kết quả của từng tác vụ trước khi tạo đường dẫn bao gồm tệp tiếp theo.
Make hiera_inc.yml:

- include_vars: hiera/common.yml 
    failed_when: false 
- include_vars: hiera/node/{{ ansible_fqdn }}/users.yml 
    failed_when: false 
- include_vars: hiera/node/{{ ansible_fqdn }}/sites.yml 
    failed_when: false 
- include_vars: hiera/node/{{ ansible_fqdn }}/types/{{ host_type | default('none') }}_v{{ host_type_version | default('none') }}.yml 
    failed_when: false 

Và trong playbook chính của bạn:

- include: hiera_inc.yml 

này trông hơi vụng về, nhưng cách này bạn có thể xác định host_type trong common.yaml và nó sẽ được vinh danh trong đường dẫn khuôn mẫu cho nhiệm vụ tiếp theo.

Với Ansible 2.2 nó sẽ có thể để include_vars vào biến có tên (không gian lưu trữ không toàn cầu), vì vậy bạn có thể include_vars vào hiera_facts và sử dụng combine bộ lọc để hợp nhất chúng lại mà không thay đổi hành vi băm toàn cầu.

+0

Cảm ơn Konstantin. Trình bày danh sách chuỗi không thực sự quan trọng lắm. Nhưng có các biến được xác định trước sẽ là một vấn đề. cho ví dụ. host_type được định nghĩa trong hosts.yaml – MavWolverine

+0

Tôi vẫn đang học được ansible. Một cái gì đó giống như công việc này? http://stackoverflow.com/questions/35489380/using-a-variable-from-one-ansible-var-file-in-a-second-var-file?rq=1 – MavWolverine

+0

Điều này khá gần và có thể là tinh chỉnh thành một chức năng tương tự thực sự. –

0

Tôi không quen với Puppet, vì vậy đây có thể không phải là ánh xạ trực tiếp. Nhưng điều tôi hiểu câu hỏi của bạn là "làm cách nào để sử dụng giá trị ở một vị trí được chia sẻ nhưng ghi đè định nghĩa của chúng cho các máy chủ khác nhau?". Trong Ansible, bạn làm điều này với variables.

Bạn có thể define variables directly in your inventory. Bạn có thể define variables in host- and group-specific files. Bạn có thể define variables at a playbook level. Bạn có thể define variables at a role level. Heck, bạn thậm chí có thể define variables with command-line switches.

Giữa tất cả những nơi này, bạn sẽ có thể xác định ghi đè cho phù hợp với tình huống của mình. Có thể bạn sẽ muốn xem the documentation section on how to decide where to define a variable để biết thêm thông tin.

+0

Không, những gì anh ta hỏi là làm thế nào để ưu tiên tra cứu dữ liệu động trong Ansible. –

Các vấn đề liên quan