我目前正在设置许多 Ansible 角色来设置 Kubernetes 集群。到目前为止,我的角色是提供幂等 EC2(1x Master / 2x Worker)和后续角色,以使用 Docker/Kubernetes 依赖项设置这些 master/worker 节点。我AWS ec2.ini/.py dynamic-inventory
用来发现我的create_ec2
角色配置的实例的 IP。
尝试使用从主节点检索的加入命令将我的工作人员加入集群时遇到问题。我有 2 个单独的角色用于 master 和 worker 配置。在主人的任务中,我得到了加入命令:
kubeadm token create --print-join-command
然后注册一个变量,然后我用它来设置主机事实:
set_fact:
join_command: "{{ join_command_stdout.stdout_lines[0] }}"
我遇到的问题是当我在运行我的工作角色时尝试在我的工作节点上访问这个事实时。我正在尝试通过以下方式访问事实:
"{{ hostvars['tag_Type_master'].join_command }} --ignore-preflight-errors all >> node_joined.txt"
但是它失败了,因为我为 hostvars 提供的主机显然是未定义的。
作为参考,我在我的动态清单中保存了这个值(IP 省略):
"tag_Type_master": [
"1.2.3.4"
我收到的错误是:
"{"msg": "The task includes an option with an undefined variable. The error was: \"hostvars['tag_Type_master']\" is undefined"
我正在努力弄清楚如何访问我的动态清单中定义的 EC2 实例的主机事实。
我尝试将 EC2 IP 直接补充到主机变量 ( hostvars['1.2.3.4'].join_command
) 中,但是任务只是挂起并且什么都不做。
我也试过放入一个魔术变量(hostvars['inventory_hostname].join_command
)无济于事。
似乎人们已经成功地从静态清单文件中定义的主机访问主机事实,但是由于 EC2 服务器的动态特性,将在其上创建集群,我无法使用这种方法。
运行.yml:
name: Setup K8s master node
hosts: tag_Name_kube_master
gather_facts: true
roles:
- setup_kube_master
name: Setup K8s worker nodes
hosts: tag_Name_kube_worker
gather_facts: true
roles:
- setup_kube_worker
setup_kube_master/tasks/set_fact.yml:
name: Get join command for workers
shell: kubeadm token create --print-join-command
register: join_command_stdout
name: Persist variable for workers
set_fact:
join_command: "{{ join_command_stdout.stdout_lines[0] }}"
setup_kube_worker/tasks/get_fact.yml:
name: join cluster
shell: "{{ hostvars['tag_Type_master'].join_command }} --ignore-preflight-errors all >> node_joined.txt"
args:
chdir: $HOME
creates: node_joined.txt