我需要从我的网络中获得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(';') }}"
<一口>
指出
- 测试 的完整剧本示例
- 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(';') }}
- 如果注释中没有
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