Xây dựng sự phụ thuộc từ một trụ cột ở Saltstack


7

Tôi đang cố gắng tạo một trạng thái giả trong Salt để lấy các phụ thuộc từ danh sách có nguồn gốc từ một trụ cột.

Trong top.slstập tin của tôi , tôi có:

base:
  '*':
    - components

Sau đó, trong components.sls, tôi có:

{% if 'components' in pillar.items() %}
include:
{% for component in pillar.get('components',[]) %}
  - {{ component }}
{% endfor %}
{% endif %}

{% if 'components' in pillar.items() %}
components:
  require:
{% for component in pillar.get('components',[]) %}
    - {{ component }}
{% endfor %}
{% endif %}

Khi tôi kiểm tra nội dung trụ cột, tôi thấy:

$ salt my-minion-id pillar.items

my-minion-id:
    ----------
    components:
        - a-dependency-name

Nhưng khi tôi cố gắng xem tập hợp các trạng thái, tôi thấy:

$ salt my-minion-id state.show_sls components

my-minion-id:
    ----------

... Và đó là nó.

Mục tiêu cuối cùng của tôi, ở đây, là để điều trị các minion như thù địch, vì vậy tôi đang cố gắng để kéo vai trò chi tiết ra khỏi trụ cột thay vì gán vai trò trong tôi file_root's top.sls. Theo hiểu biết của tôi, mọi minion đều có quyền truy cập đầy đủ vào nội dung của file_root và tôi không muốn một minion thù địch biết tường lửa hoặc dịch vụ cụ thể của bất kỳ nút không liên quan nào.

Biên tập:

Tôi phát hiện ra rằng cấu trúc trụ cột của tôi không hỗ trợ sáp nhập trụ cột, vì nó sử dụng danh sách, vì vậy tôi đã chuyển sang cấu trúc trụ cột sử dụng các giá trị không có giá trị:

my-minion-id:
    ----------
    components:
        ----------
        a-dependency-name:
            None

1
Câu hỏi khá nâng cao về ngăn xếp muối, câu hỏi chính hãng từ một người dùng Chef: Tôi đã hiểu muối là mô hình đẩy, làm thế nào một nút (minion?) Có thể tự đăng ký? (Điều đó chỉ vì tò mò)
Tensibai

Hỏi đó như một câu hỏi riêng biệt, và tôi sẽ xem liệu tôi có thể đưa ra một câu trả lời thỏa đáng mà không bị phản đối NDA của tôi không.
Michael Mol

Đủ công bằng, nhưng lần kiểm tra cuối cùng của tôi về ngăn xếp muối đã không đáp ứng các yêu cầu của tôi (đặc biệt là trên các ô cửa sổ) vì vậy tôi sẽ xem liệu tôi có thể làm một cái gì đó không thiên vị hay không và liệu tôi có thực sự có thời gian không. Đã thử như nhận xét chỉ trong trường hợp tôi bỏ lỡ điều gì đó rõ ràng :)
Tensibai

Tôi chưa có đủ đại diện để trò chuyện, vì vậy điều này sẽ phải làm. Nhưng tóm lại: Một minion muối chạy trên một nút sẽ sử dụng DNS để tìm ra vị trí chủ muối của nó và sẽ tiếp cận với chủ. Master sẽ đổ khóa của minion vào hàng chờ xử lý cho đến khi có người chấp nhận.
Michael Mol

1
Theo như tôi biết phần thưởng liên kết hoạt động cho trò chuyện, bạn đã có hơn 20 tuổi, vì vậy, phần thưởng này sẽ hoạt động cho Trò chuyện DevOps :) Cảm ơn vì các con trỏ con trỏ có thể yêu cầu được đăng ký, tôi đã bỏ lỡ cách tiếp cận này
Tensibai

Câu trả lời:


4

Tệp SLS templated này hoạt động tuyệt vời:

{% if 'components' in salt.pillar.items() %}

include:
{% for component in salt.pillar.get('components').keys() %}
  - {{ component }}
{% endfor %}

{% endif %}

Tuy nhiên, nó đòi hỏi phải thay đổi cấu trúc phím trụ của tôi. Từ câu hỏi ban đầu, bạn thấy cấu trúc như sau:

my-minion-id:
    ----------
    components:
        - a-dependency-name

Thay vào đó, nó cần phải là:

my-minion-id:
    ----------
    components:
        ----------
        a-dependency-name:
            None

Lưu ý rằng a-dependency-namebây giờ là một lệnh và có một khóa / giá trị duy nhất , None. Do đó, tệp SLS trụ cột cần thay đổi từ

components:
  - a-dependency-name

đến

components:
  a-dependency-name: ~

Mặc dù bạn có thể thoát khỏi việc không sử dụng từ điển không có giá trị (và do đó loại bỏ .keys()trong mẫu) và sử dụng danh sách thay vào đó, nếu bạn làm điều đó, bạn không thể hợp nhất componentstừ nhiều trụ cột khác nhau; mỗi trụ cột Muối áp dụng sẽ ghi đè componentskhóa từ trước đó và lần đọc trụ cuối cùng sẽ giành chiến thắng. Nếu bạn muốn hợp nhất các trụ cột (chúng ta đang nói về phân công dựa trên vai trò, ở đây), đây có vẻ là cấu trúc cần thiết.

Với điều đó, đầu ra của salt my-minion-id state.show_sls componentssau đó là chính xác:

$ salt my-minion-id state.show_sls components
my-minion-id:
    ----------
    a-dependency-name:
      ----------
      ...

pillar.items()trong các mẫu Jinja hóa ra không hoàn toàn tương đương với salt.pillar.items(); nếu bạn thử sử dụng pillar.ls(), ví dụ, bạn có thể thấy lỗi sau:

Rendering SLS 'base:components' failed: Jinja variable 'salt.pillar object' has no attribute 'ls'

Cho dù điều đó có nghĩa là người ta nên tránh salt.lối tắt tiền tố ngầm mà Jinja cung cấp, hoặc thay vào đó sử dụng một cấu trúc như {% if pillar['components'] is defined %}(cảm ơn, @brousch, cho lời khuyên), tôi không thể nói.


3

Bạn cũng có thể làm điều đó như:

{% if pillar['components'] is defined %}
include:
{% for component in pillar['components'] %}
 - {{ component }}
{% endfor %}
{% endif %}

{% if pillar['components'] is defined %}
components:
  require:
{% for component in pillar['components'] %}
 - {{ component }}
{% endfor %}
{% endif %}
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.