Điểm:3

Lặp lại qua danh sách/từ điển lồng nhau bằng các mẫu Jinja2

lá cờ ph

Tôi đang cố định cấu hình động nhiều máy chủ NFS trong hệ thống của mình bằng cách tạo các tệp/etc/exports của chúng bằng Ansible. Tôi hy vọng có thể làm điều này với mẫu jinja2. Đó là mẫu jinja2 mà tôi không thể tìm ra dựa trên danh sách xuất của mình.

Tôi có các biến sau được xác định trong vai trò nfs của mình:

site_nfs_servers: ['ansibletarget1', 'ansibletarget2']

xuất khẩu:
  - máy chủ: "ansibletarget1"
    chia sẻ:
      - đường dẫn: "/của tôi/đầu tiên/chia sẻ/đường dẫn"
        khách hàng: "*"
        tùy chọn: "rw, đồng bộ hóa"
      - đường dẫn: "/của tôi/giây/chia sẻ/đường dẫn"
        khách hàng: "*"
        tùy chọn: "rw, đồng bộ hóa, root_squash"
  - máy chủ: "ansibletarget2"
    chia sẻ:
      - đường dẫn: "/ khác/chia sẻ/đường dẫn/khác/máy chủ"
        khách hàng: "*"
        tùy chọn: "ro, đồng bộ hóa"

Sau đó, tôi có cách chơi ansible sau để tạo mẫu:

- name: Tạo tệp xuất.
  mẫu:
    src: xuất khẩu.j2
    đích: /etc/exports
    chủ sở hữu: root
    nhóm: gốc
    chế độ: '0750'

Mẫu của tôi hiện trông như thế này:

{% để xuất trong xuất %}
{% nếu ansible_hostname trong export.server %}
{% cho chia sẻ trong cổ phiếu %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}
{% endif %}
{% endfor %}

Tôi không nghĩ rằng tôi ở bất cứ nơi nào gần có cấu trúc mẫu chính xác. Làm thế quái nào mà một người có thể lặp qua danh sách này?

Điểm:3
lá cờ in

Bạn đang thiếu tham chiếu đến xuất khẩu trong vòng lặp thứ hai của bạn.

{% để xuất trong xuất %}
{% nếu ansible_hostname trong export.server %}
{% để chia sẻ trong export.shares %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}
{% endif %}
{% endfor %}

Tuy nhiên, sẽ tốt hơn nếu xác định các chia sẻ trong các biến máy chủ, như trong câu trả lời của Vladimir.

Điểm:2
lá cờ br

Tạo khoảng không quảng cáo

vỏ> vật chủ mèo
[site_nfs_servers]
ansiblemục tiêu1
ansiblemục tiêu2

và đặt cổ phiếu vào host_vars

vỏ> mèo host_vars/ansibletarget1.yml 
chia sẻ:
  - đường dẫn: "/của tôi/đầu tiên/chia sẻ/đường dẫn"
    khách hàng: "*"
    tùy chọn: "rw, đồng bộ hóa"
  - đường dẫn: "/của tôi/giây/chia sẻ/đường dẫn"
    khách hàng: "*"
    tùy chọn: "rw, đồng bộ hóa, root_squash"
vỏ> mèo host_vars/ansibletarget2.yml 
chia sẻ:
  - đường dẫn: "/ khác/chia sẻ/đường dẫn/khác/máy chủ"
    khách hàng: "*"
    tùy chọn: "ro, đồng bộ hóa"

Tạo một vai trò đơn giản để thử nghiệm

vỏ> vai trò cây/my_nfs_role/
vai trò/my_nfs_role/
âââ nhiệm vụ
â âââ main.yml
âââ mẫu
    âââ xuất khẩu.j2

2 thư mục, 2 tập tin
vỏ> vai trò mèo/my_nfs_role/t task/main.yml 
- mẫu:
    src: xuất khẩu.j2
    đích: /etc/exports.test
vỏ> vai trò mèo/my_nfs_role/templates/exports.j2 
{% cho chia sẻ trong cổ phiếu %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}

Sau đó, sử dụng nhóm khoảng không quảng cáo và vai trò trong vở kịch

shell> cat playbook.yml
- máy chủ: site_nfs_servers
  vai trò:
    - my_nfs_role

Chạy playbook và tạo các tệp

shell> ansible-playbook -i hosts playbook.yml

CHƠI [site_nfs_servers] ************************************************ **

NHIỆM VỤ [my_nfs_role : template] ******************************************
đã thay đổi: [ansibletarget1]
đã thay đổi: [ansibletarget2]
 ...
shell> ssh admin@ansibletarget1 mèo /etc/exports.test
/của tôi/đầu tiên/chia sẻ/đường dẫn * rw, đồng bộ hóa
/my/second/share/path * rw,sync,root_squash

shell> ssh admin@ansibletarget2 mèo /etc/exports.test
/another/shared/path/different/server * ro,sync

Nhìn thấy Thiết lập Ansible mẫu.


Nếu bạn muốn giữ các chia sẻ trong một đối tượng, hãy đặt danh sách vào nhóm_vars. Để đơn giản hóa mã, hãy chuyển đổi danh sách thành từ điển. Bạn có thể dùng cộng đồng.General.groupby_as_dict Ví dụ

vỏ> mèo group_vars/all.yml
xuất khẩu:
  - máy chủ: "ansibletarget1"
    chia sẻ:
      - đường dẫn: "/của tôi/đầu tiên/chia sẻ/đường dẫn"
        khách hàng: "*"
        tùy chọn: "rw, đồng bộ hóa"
      - đường dẫn: "/của tôi/giây/chia sẻ/đường dẫn"
        khách hàng: "*"
        tùy chọn: "rw, đồng bộ hóa, root_squash"
  - máy chủ: "ansibletarget2"
    chia sẻ:
      - đường dẫn: "/ khác/chia sẻ/đường dẫn/khác/máy chủ"
        khách hàng: "*"
        tùy chọn: "ro, đồng bộ hóa"

export_dict: "{{exports|community.General.groupby_as_dict('server') }}"

cho

  xuất khẩu_dict:
    có thể nhắm mục tiêu1:
      máy chủ: ansibletarget1
      chia sẻ:
      - khách hàng: '*'
        tùy chọn: rw, đồng bộ hóa
        đường dẫn: /my/first/share/path
      - khách hàng: '*'
        tùy chọn: rw, đồng bộ hóa, root_squash
        đường dẫn:/của tôi/giây/chia sẻ/đường dẫn
    có thể nhắm mục tiêu2:
      máy chủ: ansibletarget2
      chia sẻ:
      - khách hàng: '*'
        tùy chọn: ro, đồng bộ hóa
        đường dẫn:/khác/chia sẻ/đường dẫn/khác/máy chủ

Sau đó sửa đổi mẫu. Điều này sẽ tạo ra các tập tin giống như trước đây.

vỏ> vai trò mèo/my_nfs_role/templates/exports.j2 
{% cho phần chia sẻ trong export_dict[inventory_hostname]['shares'] %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% endfor %}

Đă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.