如何在限定节点的Ansible Playbook中跨节点获取RKE2集群令牌?
问题解决:用Ansible将新RKE2 Agent节点加入集群并跨节点获取令牌
你的场景完全可以用slurp模块实现,甚至能更高效地完成需求。核心思路是在playbook中单独针对rke2-server1执行令牌读取操作,再将变量传递给被限制的agent-node3,即使你用--limit指定了目标节点,只要play里明确指定主机,Ansible依然会执行对应任务。
1. 调整Playbook结构
把原playbook拆分为两个独立的play,分别处理令牌读取和节点加入:
# join-cluster.yml - name: 从RKE2服务器获取集群令牌 hosts: rke2-server1 gather_facts: no tasks: - name: 读取RKE2令牌文件 slurp: path: /var/lib/rancher/rke2/server/node-token register: rke2_token_raw - name: 解码令牌并设置为全局可用变量 set_fact: rke2_cluster_token: "{{ rke2_token_raw.content | b64decode | trim }}" delegate_to: localhost run_once: yes - name: 将新Agent节点加入RKE2集群 hosts: rke2-node-agents tasks: - name: 配置并启动RKE2 Agent服务 shell: | curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh - mkdir -p /etc/rancher/rke2/ echo "server: https://rke2-server1:9345" > /etc/rancher/rke2/config.yaml echo "token: {{ rke2_cluster_token }}" >> /etc/rancher/rke2/config.yaml systemctl enable --now rke2-agent args: creates: /etc/rancher/rke2/config.yaml
2. 关键细节说明
- slurp模块的作用:slurp用于远程读取文件内容,返回base64编码的字符串,因此需要用
b64decode解码,trim去除多余换行符,确保令牌格式正确。 - 全局变量传递:通过
delegate_to: localhost和run_once: yes,将令牌变量存储在控制节点,后续的agent节点play可以直接引用该变量。 - --limit参数的兼容性:第二个play的目标组是
rke2-node-agents,当你执行--limit 'agent-node3'时,只会在agent-node3上执行配置操作,完全不会影响已加入集群的agent-node1、agent-node2。 - 替代方案参考:如果不想用slurp,也可以用
command模块直接读取令牌(如cat /var/lib/rancher/rke2/server/node-token),但slurp是Ansible官方推荐的文件读取方式,对二进制文件和特殊权限文件的兼容性更好。
3. 运行命令
依然使用你原来的命令即可:
ansible-playbook join-cluster.yml -i hosts.ini --limit 'agent-node3'
注:第一个play的目标是rke2-server1,不受--limit参数限制(除非你主动排除该节点),因此会正常执行令牌读取操作。
内容的提问来源于stack exchange,提问作者Anisha goyal
相关产品推荐
相关产品推荐

