列出resolv.conf中的名称服务器,每个主机在一行中包含主机名



我需要从我的网络中获得DNS服务器,我尝试使用:

- hosts: localhost
  gather_facts: no
  tasks:
    - name: check resolv.conf exists
      stat:
        path: /etc/resolv.conf
      register: resolv_conf
    - name: check nameservers list in resolv.conf
      debug:
        msg: "{{ contents }}"
      vars:
        contents: "{{ lookup('file', '/etc/resolv.conf') | regex_findall('\s*nameserver\s*(.*)') }}"
      when: resolv_conf.stat.exists == True

但这并没有完全给出我所需要的结果。

是否有可能写出一个剧本,这样的结果看起来像下面?

主机名;dns1 dns2; dnsN

下面的声明给出了名称服务器列表

nameservers: "{{ lookup('file', '/etc/resolv.conf').splitlines()|
                 select('match', '^nameserver.*$')|
                 map('split', ' ')|
                 map('last')|list }}"

您可以将主机名和列表中的项目连接在一起

msg: "{{ inventory_hostname }};{{ nameservers|join(';') }}"

<一口>

指出

  1. 测试
  2. 的完整剧本示例
- hosts: localhost
  vars:
    nameservers: "{{ lookup('file', '/etc/resolv.conf').splitlines()|
                     select('match', '^nameserver.*$')|
                     map('split', ' ')|
                     map('last')|list }}"
  tasks:
    - debug:
        var: nameservers
    - debug:
        msg: |
          {{ inventory_hostname }};{{ nameservers|join(';') }}

  1. 如果注释中没有nameserver.*,下面的简化声明可以正常工作
nameservers: "{{ lookup('file', '/etc/resolv.conf')|
                 regex_findall('\s*nameserver\s*(.*)') }}"

不幸的是,Linux默认文件/etc/resolv.conf包含注释:

| # run "system -resolve——status"查看实际名称服务器的详细信息。

这个正则表达式将匹配nameservers.

nameservers:
  - s.

您可以通过在关键字nameserver后面放置至少一个空格来解决此问题。

                 regex_findall('\s*nameserver\s+(.*)') }}"

但是,如果评论中有关键字nameserver,这将不起作用。


: "没有过滤命名为"分裂">

A: Ansible 2.11以下没有filter split。使用regex_replace代替

nameservers: "{{ lookup('file', '/etc/resolv.conf').splitlines()|
                 select('match', '^nameserver.*$')|
                 map('regex_replace', '^(.*) (.*)$', '\2')|list }}"

由于您的regex_findall已经创建了一个包含所有DNS服务器的列表,您只需要将主机名添加到该列表中,并将join添加到整个列表中。

- name: check nameservers list in resolv.conf
  debug:
    msg: >-
      {{
        (
          [ ansible_hostname ] +
          lookup('file', '/etc/resolv.conf', errors='ignore')
            | regex_findall('s*nameservers*(.*)')
        ) | join(';')
      }}

这将导致类似(b176263884e6是容器的实际主机名):

TASK [check nameservers list in resolv.conf] *****************************
ok: [localhost] => 
  msg: b176263884e6;1.1.1.1;4.4.4.4;8.8.8.8

注意,您甚至不需要stat任务,因为您可以忽略errors='ignore'查找的错误。

然后,这将只给您主机名,以及一个警告:

TASK [check nameservers list in resolv.conf] *****************************
[WARNING]: Unable to find '/etc/resolv.conf' in expected paths 
(use -vvvvv to see paths)
ok: [localhost] => 
  msg: b176263884e6

最新更新