如何检查动态添加到清单的主机的 OS 版本

How to check the OS version of host which in dynamically added to inventory

我正在尝试获取服务器名称作为用户输入,如果服务器 OS 是 RHEL7,它将继续执行进一步的任务。我正在尝试使用 hostvars 但它没有帮助,请帮助我找到条件为 OS 的版本:

---
- name: Add hosts
  hosts: localhost
  vars:
    - username: test
      password: test
  vars_prompt:
    - name: server1
      prompt: Server_1 IP or hostname
      private: no
    - name: server2
      prompt: Server_2 IP or hostname
      private: no

  tasks:
    - add_host:
        name: "{{ server1 }}"
        groups:
          - cluster_nodes
          - primary
          - management
        ansible_user: "{{ username }}"
        ansible_password: "{{ password}}"

    - add_host:
        name: "{{ server2 }}"
        groups:
          - cluster_nodes
          - secondary
        ansible_user: "{{ username }}"
        ansible_password: "{{ password}}"

    - debug:
        msg: "{{ hostvars['server1'].ansible_distribution_major_version }}"

当我执行剧本时,出现以下错误:

fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: \"hostvars['server1']\" is undefined\n\nThe error appears to be in '/var/lib/awx/projects/pacemaker_RHEL_7_ST/main_2.yml': line 33, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - debug:\n      ^ here\n"}

您需要在新添加的主机上 gather_facts 使用该变量。例如,这将通过自动收集事实来完成。

---
- name: Add hosts
  hosts: localhost
  vars:
    - username: test
      password: test
  vars_prompt:
    - name: server1
      prompt: Server_1 IP or hostname
      private: no
    - name: server2
      prompt: Server_2 IP or hostname
      private: no

  tasks:
    - add_host:
        name: "{{ server1 }}"
        groups:
          - cluster_nodes
          - primary
          - management
        ansible_user: "{{ username }}"
        ansible_password: "{{ password}}"

    - add_host:
        name: "{{ server2 }}"
        groups:
          - cluster_nodes
          - secondary
        ansible_user: "{{ username }}"
        ansible_password: "{{ password}}"

- name: Gather facts for newly added targets
  hosts: cluster_nodes
  # gather_facts: true <= this is the default

- name: Do <whatever> targeting localhost again
  hosts: localhost
  gather_facts: false  # already gathered in play1

  tasks:
    # Warning!! bad practice. Looping on a group usually
    # shows you should have a play targeting that specific group
    - debug:
        msg: "OS version for {{ item }} is 7"
      when: hostvars[item].ansible_distribution_major_version | int == 7
      loop: "{{ groups['cluster_nodes'] }}"

如果不想依赖自动采集,可以手动播放setup模块,例如第二场:

- name: Gather facts for newly added targets
  hosts: cluster_nodes
  gather_facts: false
  
  tasks:
    - name: get facts from targets
      setup: