有没有办法在 ansible playbook 中获取无法访问的主机列表

use*_*544 6 ansible

我的 ansible 角色编码如下。

---
  - name: Get host facts
    set_fact:
      serverdomain: "{{ansible_domain}}"
      server_ip: "{{ansible_ip_addresses[1]}}"

  - name: Host Ping Check
    failed_when: false
    win_ping:
    register: var_ping

  - name: Get Host name
    debug: msg="{{the_host_name}}"
  
  - name: Set Execution File and parameters
    set_fact:
      scriptfile: "{{ansible_user_dir}}\\scripts\\host_check.ps1"
      params: "-servername '{{the_host_name}}' -response var_ping.failed"
  
  - name: Execute script
    win_command: powershell.exe "{{scriptfile}}" "{{params}}"
Run Code Online (Sandbox Code Playgroud)

它按其应有的方式工作,但当然根本不会触及无法访问的主机。我想生成一个列表,或者是否有一个包含所有无法访问的主机的变量。是否可以将其放在逗号分隔列表中并存储在变量中?

最后,我需要如何/在哪里设置gather_facts:否。我尝试了几个地方都没有成功。

编辑1

- name Unreachable servers
  set_fact:
    down: "{{ ansible_play_hosts_all | difference(ansible_play_hosts)}}"

  - name: Set Execution File and parameters
    set_fact:
      scriptfile: "{{ansible_user_dir}}\\scripts\\host_check.ps1"
      params: "-servername '{{the_host_name}}' -response var_ping.failed -unreachable_hosts {{ down }}"

  - name: Execute script
    win_command: powershell.exe "{{scriptfile}}" "{{params}}"
    when: inventory_hostname == {{ db_server_host }}
Run Code Online (Sandbox Code Playgroud)

感谢您的回答,我现在已经能够在我的 ansible 角色中使用相同的登录名,并且它似乎有效。

不过我确实有一些问题。我的剧本针对清单中定义的主机运行,在这种情况下,我想要实现的情况是无法访问的主机在最后立即传递到 powershell 脚本上。例如,100 台主机中,有 10 台无法访问。该剧本应收集 10 个无法访问的主机,并将主机列表以数组格式传递给 powershell 脚本或作为 json 数据类型。

我想要做的就是能够从我的 powershell 脚本处理无法访问的服务器列表。

此刻,我得到

[“服务器1”,“服务器2”]

我的脚本将使用这样的格式:“server1”,“server2”

最后,最后记录无法访问的服务器的过程只需要在将日志记录到数据库的特定服务器上发生一次。我创建了一个任务来执行此操作,如上所示。

db_server_host 作为额外变量从 ansible tower 传递。我添加“时间”的原因是我只希望它在数据库服务器上运行,而不是在每个主机上运行。我收到错误条件检查 inventory_hostname == {{ db_server_host }} 失败。评估条件 inventory_hostname == {{ db_server_host }} 'mydatabaseServerName' 未定义时出现错误

Vla*_*tka 11

问:在 Ansible playbook 中获取无法访问的主机列表。

简短回答:创建以下列表之间的差异

down: "{{ ansible_play_hosts_all|difference(ansible_play_hosts) }}"
Run Code Online (Sandbox Code Playgroud)

详细信息:使用特殊变量。引用:

ansible_play_hosts_all:播放所针对的所有主机的列表。

ansible_play_hosts:当前播放运行的主机列表,不受序列号限制。失败/无法访问的主机不在此列表中。

例如,给定库存

shell> cat hosts
alpha
beta
charlie
delta
Run Code Online (Sandbox Code Playgroud)

剧本

- hosts: alpha,beta,charlie
  gather_facts: true
  tasks:
    - block:
        - debug:
            var: ansible_play_hosts_all
        - debug:
            var: ansible_play_hosts
        - set_fact:
            down: "{{ ansible_play_hosts_all|difference(ansible_play_hosts) }}"
        - debug:
            var: down
      run_once: true
Run Code Online (Sandbox Code Playgroud)

如果alpha无法到达,则给出(桥接) (见下文)

ansible_play_hosts_all:
  - alpha
  - beta
  - charlie

ansible_play_hosts:
  - beta
  - charlie

down:
  - alpha
Run Code Online (Sandbox Code Playgroud)

主机alpha无法访问

PLAY [alpha,beta,charlie] *************************************************

TASK [Gathering Facts] ****************************************************
fatal: [alpha]: UNREACHABLE! => changed=false 
  msg: 'Failed to connect to the host via ssh: ssh: connect to host test_14 port 22: No route to host'
  unreachable: true
ok: [charlie]
ok: [beta]

...
Run Code Online (Sandbox Code Playgroud)

笔记

字典hostvars保留清单中的所有主机,例如

- hosts: alpha,beta,charlie
  gather_facts: true
  tasks:
    - debug:
        var: hostvars.keys()
      run_once: true
Run Code Online (Sandbox Code Playgroud)

给出(删节)

hostvars.keys():
  - alpha
  - beta
  - charlie
  - delta
Run Code Online (Sandbox Code Playgroud)


mda*_*iel 0

  tasks:
  - ping:
    register: ping_out
    # one can include any kind of timeout or other stall related config here

  - debug:
      msg: |
        {% for k in hostvars.keys() %}
        {{ k }}: {{ hostvars[k].ping_out.unreachable|default(False) }}
        {% endfor %}
Run Code Online (Sandbox Code Playgroud)

产量(当清单仅包含活动主机时alpha):

    msg: |-
     alpha: False
     beta: True
     charlie: True
Run Code Online (Sandbox Code Playgroud)

最后,我需要如何/在哪里设置gather_facts:否。我尝试了几个地方都没有成功。

它只在关键字中出现一次playbook,因此它是一个播放关键字:

    msg: |-
     alpha: False
     beta: True
     charlie: True
Run Code Online (Sandbox Code Playgroud)