将一组任务委派给另一个依赖条件的主机

时间:2019-06-19 05:14:45

标签: ansible ansible-inventory

我的问题有点复杂。我有一些与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

但这不起作用。

1 个答案:

答案 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