Điểm:0

Cách tốt nhất để tạo tệp yaml có số phần thay đổi dựa trên máy chủ lưu trữ

lá cờ dz

Tôi đang cố gắng sử dụng ansible để triển khai các tệp cấu hình cho hàng trăm máy trong đó các máy khác nhau sẽ có nhiều lần lặp lại các đoạn cấu hình cụ thể. Cụ thể là tôi đang sử dụng trình phân tích cú pháp nhật ký promtail và các máy khác nhau sẽ có các vị trí tệp nhật ký khác nhau để phân tích cú pháp với các nhãn khác nhau. Lý tưởng nhất là tôi muốn giữ cấu hình ansible khá đơn giản để tôi chỉ có thể sử dụng các yêu cầu kéo để thay đổi các phần khác nhau.

Ban đầu, tôi sẽ sử dụng group_vars và xác định từng vị trí tệp nhật ký trong group_var. Điều này hoạt động tốt miễn là tôi chỉ xây dựng một vị trí nhật ký duy nhất. Khi tôi cần nhiều vị trí nhật ký, nó sẽ bị hỏng vì tôi sẽ chỉ có một giá trị được trả về từ group_vars.

Để minh họa.

máy chủ:
    
    ĐĂNG NHẬP1:
      máy chủ:
        ứng dụng[15:16].qa2.example.com
    ĐĂNG NHẬP2:
      máy chủ
        ứng dụng[16:17].qa2.example.com



GROUP_VARS/LOGFILE1
GROUP_VARS/LOGFILE2

Tôi chỉ có thể tìm cách lặp qua từng nhóm và sau đó nối đầu ra vào tệp cấu hình nhưng tôi không thấy cách nào để thực hiện điều đó với chức năng mẫu. Lý tưởng nhất là tôi chỉ có thể lặp qua tất cả các vị trí tệp nhật ký nhưng tôi không chắc cách thực hiện.

Hoặc có lẽ tôi có thể sử dụng một tệp biến bên ngoài và sau đó sử dụng một loại điều kiện nào đó để xác định máy chủ nào có cấu hình nào?

Cùng một dữ liệu trong nhóm_vars...

tập tin: /opt/tomcat/fxcts/logs/gxxss.log
biên dịch: TX_Tomcat
ứng dụng: TX
mô-đun: GXX
đường ống_regex: Không có 
đường ống_vars:
  - Không có
drop_expression: Không có
Đa tuyến: Không có

Đây là mẫu jinja

cạo_configs:
- tên_công việc: {{ mô-đun }}
    đường ống_giai đoạn:
        - biểu thức chính quy:
            biểu thức: {{pipeline_regex}}
        - nhãn:
            {% cho các nhãn trong pipe_vars -%}
            {{ nhãn }}:
            {% endfor %}
{#  Đây là một bài kiểm tra #}
        - dấu thời gian:
            nguồn: ngày
            định dạng: 2006-01-01 15:00:00.000000
        - rơi vãi:
            biểu thức: {{ drop_expression }}
        - đa tuyến:
            dòng đầu tiên: ""
            max_wait_time: 3s
            tĩnh_config:
    tĩnh_config:
    - chỉ tiêu:
        - máy chủ cục bộ
      nhãn:
        ứng dụng: {{ ứng dụng }}
        máy chủ lưu trữ: {{ ansible_hostname }}
        thành phần: {{ comp }}
        __path__: {{ tập tin }}

Đây là một ví dụ về cấu hình yaml thực tế. Như tôi đã nói, các vị trí nhật ký khác nhau có thể khác nhau tùy theo máy chủ.

người phục vụ:
  http_listen_port: 9080
  grpc_listen_port: 0
vị trí:
  tên tệp: /tmp/positions.yaml
khách hàng:
  - url: http://host:3100/loki/api/v1/push
cạo_configs:
- job_name: hệ thống
  tĩnh_config:
  - chỉ tiêu:
      - máy chủ cục bộ
    nhãn:
      công việc: varlog
      máy chủ: ${HOSTNAME}
      __path__: /var/log/*log
- job_name: apps_ssi
  tĩnh_config:
  - chỉ tiêu:
      - máy chủ cục bộ
    nhãn:
      công việc: chị
      máy chủ: ${HOSTNAME}
      __path__: /opt/tomcat/ssi/logs/*log
- job_name: apps_fxcts
  tĩnh_config:
  - chỉ tiêu:
      - máy chủ cục bộ
    nhãn:
      công việc: fxcts
      máy chủ: ${HOSTNAME}
      __path__: /opt/tomcat/fxcts/logs/*log
- job_name: tạp chí
  tạp chí:
    json: sai
    max_age: 12h
    nhãn:
      công việc: systemd-journal
      máy chủ: ${HOSTNAME}
  nhãn lại_configs:
    - source_labels: ['__journal__systemd_unit']
      target_label: 'đơn vị'
Zeitounator avatar
lá cờ fr
Bạn có thể vui lòng hiển thị cơ sở hạ tầng ví dụ về thông tin bạn đang đưa vào group_vars cho cấu hình promtail của mình không?
flyerhawk avatar
lá cờ dz
Tôi đã thêm thông tin
Zeitounator avatar
lá cờ fr
Bạn có thể cụ thể hơn không. Trong tệp kết quả, phần nào của cấu hình chung cho tất cả máy chủ và phần nào dành riêng cho nhóm/máy chủ?
flyerhawk avatar
lá cờ dz
Phần job_name có thể thay đổi dựa trên máy chủ. Một số sẽ có một job_name. Những người khác sẽ có 2 hoặc 3 hoặc 4. Vì vậy, tôi có thể chỉ định tĩnh điều đó trong host_vars nhưng điều đó thật rắc rối. Ban đầu tôi đã hy vọng sử dụng group_vars và chỉ nhóm các máy chủ nhưng tôi sẽ chỉ nhận được một giá trị được trả về cho biến.
Zeitounator avatar
lá cờ fr
Đã vài ngày trôi qua mà không có phản hồi nên tôi đoán là những người khác cũng gặp vấn đề tương tự như tôi... Về phần mình, tôi thực sự không hiểu bạn đang cố gắng làm gì và dữ liệu hiện tại của bạn trong kho có thể dẫn đến tệp cấu hình ví dụ mà bạn trình bày bằng cách áp dụng mẫu hiện tại của mình. Tôi không biết phải trả lời như thế nào.
Điểm:0
lá cờ cn

Một lần nữa, tôi không chắc mình làm theo chính xác, nhưng nếu câu trả lời của Roman không hiệu quả, thì tôi khuyên bạn nên sử dụng máy chủ trong cấu trúc thư mục trong kho của bạn và chỉ cần tạo một biến có bản đồ đường dẫn/nhãn. Sau đó, bạn có thể lặp qua biến đó trong mẫu jinja của mình.

Nếu có quá nhiều biến thể của đường dẫn và máy chủ mà điều này là không khả thi với số lượng máy, thì tôi khuyên bạn nên xem xét việc cố gắng chuẩn hóa vị trí/nhãn hoặc sử dụng một công cụ khác ngoài promtail có thể xử lý các tệp bị thiếu. Bằng cách đó, bạn chỉ có thể quản lý một danh sách nhật ký lớn để cạo và không phải lo lắng về việc thay đổi bất cứ điều gì.

Tùy chọn cuối cùng mà tôi có thể đề xuất là đảo ngược cách tiếp cận: tìm một công cụ cho phép bạn sử dụng một thư mục để cấu hình và thả các tệp cho từng công cụ cần theo dõi. Điều tôi muốn nói ở đây là bạn sẽ có một thư mục /etc/logscraper/conf.d được bao gồm trong cấu hình. Sau đó, mỗi công cụ sẽ tạo một tệp bên trong đó, ví dụ: /etc/logscraper/conf.d/10-tool.confvà nó sẽ xác định cách phân tích nhật ký. Bằng cách đó, bạn có thể triển khai điều đó với chính công cụ đó chứ không phải công cụ ghi nhật ký. Điều này có thêm lợi ích là giữ cấu hình liên quan đến sản phẩm/công cụ (ví dụ: apache) trong playbook đang triển khai sản phẩm.

flyerhawk avatar
lá cờ dz
Tôi cố gắng sử dụng host_vars để giải quyết vấn đề. Không lý tưởng nhưng nó hoạt động.
Điểm:0
lá cờ it

Tôi xin lỗi nhưng có quá nhiều thứ để đọc qua và nắm bắt hoàn toàn nhưng về bản chất, tôi hiểu rằng bạn cần đẩy các cấu hình khác nhau đến các máy chủ khác nhau dựa trên một số vị trí tệp nhật ký để phân tích cú pháp.

Giải pháp của tôi cho vấn đề này - để nắm bắt tất cả - sẽ là lặp qua tất cả các đường dẫn bạn cần theo dõi qua trình phân tích cú pháp nhật ký promtail và điều chỉnh cấu hình cho phù hợp:

---
- tên: "playbook để thêm các tệp cấu hình cụ thể"
  máy chủ: localhost


  nhiệm vụ:
  
  - tên: Chặn các tệp conf trình phân tích cú pháp nhật ký promtail
    chặn:
      - name: Kiểm tra xem đường dẫn nhật ký có tồn tại không
        thống kê:
          đường dẫn: "{{ item.path }}"
        đăng ký: reg_path
      - tên: Đẩy tệp conf nếu đường dẫn tồn tại
        mẫu:
          src: "{{ item.templ }}"
          đích: "/etc/promtal/whatever.d/"
        khi nào: reg_path.stat.exists
    vòng:
      - { tên: 'syslog', đường dẫn: '/var/log/syslog', templ: 'syslog.cong.j2'}
      - { tên: 'messages', đường dẫn: '/var/log/messages', templ: 'messages.cong.j2'}
      - { tên: 'apache-acl', đường dẫn: '/var/log/httpd/access.log', templ: 'apache-acl.cong.j2'}

Mã YAML này chưa được kiểm tra và cấu hình promtail có thể cần được thao tác theo cách khác nhưng hy vọng bạn hiểu được quan điểm của tôi.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.