146 lines
6.1 KiB
YAML
146 lines
6.1 KiB
YAML
# SKIP_ARMV7=1(默认):仅 noop。
|
||
# SKIP_ARMV7=0 且 ARMV7_NFS_SSH 或 ARMV7_SSH:经 SSH 在 arm 上 dnf 装 nfs-utils、写 /etc/exports、exportfs(见 docs/01-04)。
|
||
# 导出路径/网段:ARMV7_NFS_EXPORT_PATH(默认 /sdcard)、ARMV7_NFS_CLIENT_SUBNET(默认 192.168.2.0/24)
|
||
- name: 01-04 armv7 NFS(矩阵 + 可选远程安装)
|
||
hosts: localhost
|
||
gather_facts: false
|
||
vars:
|
||
repo_root: "{{ playbook_dir }}/../../.."
|
||
doc_id: "01-04"
|
||
doc_filename: "01-04-armv7-nfs服务安装.md"
|
||
skip_armv7: "{{ lookup('env', 'SKIP_ARMV7') | default('1', true) | trim }}"
|
||
armv7_ssh: "{{ lookup('env', 'ARMV7_SSH') | default('', true) | trim }}"
|
||
armv7_nfs_export_path: "{{ lookup('env', 'ARMV7_NFS_EXPORT_PATH') | default('/sdcard', true) | trim }}"
|
||
armv7_nfs_client_subnet: "{{ lookup('env', 'ARMV7_NFS_CLIENT_SUBNET') | default('192.168.2.0/24', true) | trim }}"
|
||
tasks:
|
||
- name: Resolve ARMV7_NFS_SSH from env
|
||
ansible.builtin.set_fact:
|
||
armv7_nfs_ssh: >-
|
||
{% set n = lookup('env', 'ARMV7_NFS_SSH') | default('', true) | trim %}
|
||
{% set b = lookup('env', 'ARMV7_SSH') | default('', true) | trim %}
|
||
{{ n if n | length > 0 else b }}
|
||
|
||
- name: Baseline docs/files checks
|
||
block:
|
||
- name: Assert docs file exists
|
||
ansible.builtin.stat:
|
||
path: "{{ repo_root }}/docs/{{ doc_filename }}"
|
||
register: _doc_stat
|
||
|
||
- name: Fail when docs file missing
|
||
ansible.builtin.assert:
|
||
that:
|
||
- _doc_stat.stat.exists
|
||
fail_msg: "docs file missing: docs/{{ doc_filename }}"
|
||
|
||
- name: Find matching ansible/files doc_id directory
|
||
ansible.builtin.find:
|
||
paths: "{{ repo_root }}/ansible/files"
|
||
file_type: directory
|
||
patterns: "{{ doc_id }}"
|
||
use_regex: false
|
||
register: _files_dirs
|
||
|
||
- name: Fail when ansible/files doc_id directory missing
|
||
ansible.builtin.assert:
|
||
that:
|
||
- _files_dirs.matched | int >= 1
|
||
fail_msg: "ansible/files missing doc_id directory: ansible/files/{{ doc_id }}"
|
||
|
||
- name: Show noop verification summary
|
||
ansible.builtin.debug:
|
||
msg:
|
||
- "doc_id={{ doc_id }}"
|
||
- "doc={{ doc_filename }}"
|
||
- "files_dirs={{ _files_dirs.files | map(attribute='path') | list }}"
|
||
|
||
- name: Verify cluster reachable (kubectl get nodes) [runbook baseline]
|
||
ansible.builtin.shell: |
|
||
set -euo pipefail
|
||
KUBECONFIG={{ k3s_kubeconfig | default('/etc/rancher/k3s/k3s.yaml') }} kubectl get nodes
|
||
args:
|
||
executable: /bin/bash
|
||
delegate_to: "{{ groups['k3s_server'][0] }}"
|
||
become: true
|
||
run_once: true
|
||
changed_when: false
|
||
|
||
- name: Verify core namespace exists (kube-system) [runbook baseline]
|
||
ansible.builtin.shell: |
|
||
set -euo pipefail
|
||
KUBECONFIG={{ k3s_kubeconfig | default('/etc/rancher/k3s/k3s.yaml') }} kubectl get ns kube-system
|
||
args:
|
||
executable: /bin/bash
|
||
delegate_to: "{{ groups['k3s_server'][0] }}"
|
||
become: true
|
||
run_once: true
|
||
changed_when: false
|
||
|
||
- name: Find YAML manifests under ansible/files doc_id dirs
|
||
ansible.builtin.find:
|
||
paths: "{{ _files_dirs.files | map(attribute='path') | list }}"
|
||
file_type: file
|
||
patterns:
|
||
- "*.yml"
|
||
- "*.yaml"
|
||
recurse: true
|
||
use_regex: false
|
||
register: _files_manifests
|
||
|
||
- name: Show manifest count summary
|
||
ansible.builtin.debug:
|
||
msg:
|
||
- "doc_id={{ doc_id }}"
|
||
- "manifest_files={{ _files_manifests.matched | default(0) }}"
|
||
- "manifest_paths={{ (_files_manifests.files | map(attribute='path') | list)[:12] }}"
|
||
|
||
- name: Server-side dry-run apply (kubectl apply --dry-run=server) [doc assertion]
|
||
ansible.builtin.shell: |
|
||
set -euo pipefail
|
||
KUBECONFIG={{ k3s_kubeconfig | default('/etc/rancher/k3s/k3s.yaml') }} \
|
||
kubectl apply --dry-run=server -f "{{ item.path }}"
|
||
args:
|
||
executable: /bin/bash
|
||
loop: "{{ _files_manifests.files }}"
|
||
loop_control:
|
||
label: "{{ item.path }}"
|
||
delegate_to: "{{ groups['k3s_server'][0] }}"
|
||
become: true
|
||
run_once: true
|
||
changed_when: false
|
||
when: (_files_manifests.matched | default(0) | int) > 0
|
||
|
||
- name: Fail when SKIP_ARMV7=0 but no ARMV7_SSH / ARMV7_NFS_SSH
|
||
ansible.builtin.fail:
|
||
msg: "SKIP_ARMV7=0 但未设置 ARMV7_SSH(或 ARMV7_NFS_SSH 指向 NFS 所在 arm 主机)"
|
||
when: skip_armv7 == '0' and armv7_nfs_ssh | length == 0
|
||
|
||
- name: Note skipping remote NFS setup
|
||
ansible.builtin.debug:
|
||
msg: "SKIP_ARMV7={{ skip_armv7 }}:跳过 arm NFS 远程配置。"
|
||
when: skip_armv7 != '0' or armv7_nfs_ssh | length == 0
|
||
|
||
- name: Remote NFS install (dnf on arm)
|
||
when: skip_armv7 == '0' and armv7_nfs_ssh | length > 0
|
||
block:
|
||
- name: Install nfs-utils and enable nfs-server
|
||
ansible.builtin.shell: "{{ armv7_nfs_ssh }} 'sudo dnf install -y nfs-utils && sudo systemctl enable --now nfs-server'"
|
||
|
||
- name: Check if export path already in /etc/exports
|
||
ansible.builtin.shell: "{{ armv7_nfs_ssh }} sudo grep -qF {{ armv7_nfs_export_path | quote }} /etc/exports"
|
||
register: armv7_exports_grep
|
||
failed_when: false
|
||
changed_when: false
|
||
|
||
- name: Append NFS export line
|
||
ansible.builtin.shell: "{{ armv7_nfs_ssh }} bash -c 'echo \"{{ armv7_nfs_export_path }} {{ armv7_nfs_client_subnet }}(rw,sync,no_subtree_check,no_root_squash)\" | sudo tee -a /etc/exports'"
|
||
when: armv7_exports_grep.rc != 0
|
||
|
||
- name: Apply exportfs
|
||
ansible.builtin.shell: "{{ armv7_nfs_ssh }} sudo exportfs -rav"
|
||
changed_when: true
|
||
|
||
- name: Verify showmount
|
||
ansible.builtin.shell: "{{ armv7_nfs_ssh }} showmount -e localhost"
|
||
changed_when: false
|