You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在限定节点的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:12:41