Ansible-检查var是否已设置两次

Ansible-检查var是否已设置两次,ansible,Ansible,我有两个节点和一个变量: 节点1: setup: master 节点2: setup: slave 对于任务,请在主机中设置变量。\u vars: --- - hosts: myhost tasks: - name: Copy file to master or slave copy: src: somesource dest: /tmp/"{{ setup }}" owner: root group:

我有两个节点和一个变量:

节点1:

setup: master
节点2:

setup: slave
对于任务,请在主机中设置变量。\u vars:

---
- hosts: myhost
  tasks:
    - name: Copy file to master or slave
      copy:
        src: somesource
        dest: /tmp/"{{ setup }}"
        owner: root
        group: root
      mode: 0775
      # failed_when: setup is undefined or both_nodes_have_"master"
如果出现以下情况,我如何能使任务失败:

  • 如果两个节点都设置了
    master
  • 如果没有节点设置了
    主节点
    从节点
只有在以下情况下,我才能让任务继续:

  • 一个节点设置了
    主节点
    ,另一个节点设置了
    从节点
试着数一数:

库存:

master ansible_connection=local
slave  ansible_connection=local

[master]
master

[slave]
slave

[myhost:children]
master
slave

[master:vars]
setup_type=master

[slave:vars]
setup_type=slave
剧本:

---
- hosts: myhost
  gather_facts: yes
  vars:
    master_count: 0
    slave_count: 0
  tasks:
    - name: Count master fields
      set_fact:
        master_count: "{{master_count | int + 1}}"
      with_items:
        - "{{ groups.myhost }}"
      when: "hostvars[item]['setup_type'] is defined and hostvars[item]['setup_type'] == 'master'"

    - name: Count slave fields
      set_fact:
        slave_count: "{{slave_count | int + 1}}"
      with_items:
        - "{{ groups.myhost }}"
      when: "hostvars[item]['setup_type'] is defined and hostvars[item]['setup_type'] == 'slave'"

    - name: Fail if invalid master number
      debug:
        msg: "Master count: {{master_count}}"
      failed_when: "master_count | int != 1"

   - name: Fail if invalid slave number
     debug:
       msg: "Slave count: {{slave_count}}. Required: {{groups.myhost | length - master_count | int}}"
     failed_when: "slave_count | int + master_count | int != groups.myhost | length"
如果有零台或多台主机,则此操作将失败;如果没有足够的从属主机,则此操作将失败(这将自动检查有多少台主机,并期望所有非主主机都是从属主机)

如果需要将这些字符串粘贴到解决方案中,则需要修改这些字符串:

  • setup\u type
    :是问题中的变量吗
  • master
    slave
    是我们正在检查的变量值
  • myhost
    是我们进行搜索的组

请注意,这些文件显示在多个位置,因此您应该对所有文件进行搜索和替换。此外,我认为所有这些都可以动态化,这意味着你可以将其提取为一个角色或单独的角色,以便于重用

你可以共享完整的YML(虚拟)吗?更新的初始帖子