我的问题有点复杂。我有一些与Ansible协调的多节点群集基础结构。
并且可以有Kubernetes主节点或从节点的节点。如果当前任务在从属节点上播放,则需要根据此任务将一组特定的任务委派给主节点。
例如,我的库存结构如下:
[k8s_master]
hostname ansible_ssh_host= ... etc.
[k8s_slaves]
hostname ansible_ssh_host= ... etc.
[k8s_cluster:children]
k8s_master
k8s_slaves
我有一个任务要检查k8s节点是主节点还是从节点并注册一些值:
- name: Checking if node is kubernetes master
stat:
path: "{{kubeconf}}"
register: master_conf
并且我想根据master_conf.stat.exists值在本地(如果该节点是k8s主节点)或将其委托给主节点(如果该节点是k8s从节点)来执行一些任务集(正确或错误)。问题:
block:
或
include_tasks:
。 set_fact:
node_hostname: "{{ansible_hostname}}"
然后我需要在任务中使用变量{{node_hostname}}
,即使它们是
委托。然后我需要在播放过程中注册一些变量
主节点,并再次在从节点上的任务中使用它。
仍然找不到正确的解决方案。我尝试过类似的事情:
- name: Including tasks to perform if we are on the master node
include_tasks: set-of-tasks.yml
when: master_conf.stat.exists
- name: Including tasks to perform if we are on the slave node
include_tasks: set-of-tasks.yml
delegate_to: "{{item}}"
delegate_facts: true
with_items: "{{groups.k8s_master}}"
when: master_conf.stat.exists == false
但这不起作用。
答案 0 :(得分:0)
使用include
和包含我需要委派任务的节点的主机名的任意变量的组合解决了这种情况(include_task
不支持任意变量)。
所以语法是:
- name: Checking if node is kubernetes master
stat:
path: "{{kubeconf}}"
register: master_conf
- name: Including tasks to perform if we are on the master node
include: set-of-tasks.yml
when: master_conf.stat.exists
- name: Including tasks to perform if we are on the slave node
include: set-of-tasks.yml
delegate_host: "{{item}}"
with_items: "{{groups.k8s_master}}"
when: master_conf.stat.exists == false
然后在set-of-tasks.yml中将delegate_to
添加到委派的任务中:
proxy_to:“ {{delegate_host}}”
由于某种原因default(omit)
对我不起作用(Ansible尝试解析原始节点主机名,但失败了,尽管它可以与指定IP的清单文件中的该名称正常工作)。所以我在set-of-tasks.yml的开头添加了类似的内容:
- name: Setting target kubernetes master node
set_fact:
delegate_host: "{{ansible_hostname}}"
when: delegate_host is undefined