Я меняю наши DNS-серверы. В рамках этого необходимо обновить записи DNS для наших статически настроенных серверных интерфейсов. Однако я наткнулся на загвоздку. В настоящее время для интерфейсов определены 2 записи, и я хотел бы заменить их на 3.
Этот сценарий демонстрирует проблему с использованием replace
. Он заменит DNS1 и DNS2, но не сможет добавить DNS3. lineinfile
есть похожие проблемы.
---
- hosts: canary
vars:
nameservers: [ '', 192.0.2.1, 192.0.2.2, 192.0.2.3 ]
tasks:
- name: nameservers
replace:
path: /etc/sysconfig/network-scripts/ifcfg-{{ansible_default_ipv4.interface}}
replace: \1="{{ item.1 }}"
regexp: (DNS{{ item.0 }}).+
with_indexed_items:
- "{{ nameservers }}"
when: ansible_distribution == "CentOS" and "nameservers" not in group_names
tags:
- debug
В чем проблема lineinfile
?
Если есть регулярное выражение строки, строка будет заменена; в противном случае будет добавлена новая строка.
---
- hosts: localhost
gather_facts: no
vars:
srv_list: [192.168.0.1, 192.168.0.2, 192.168.0.3]
tasks:
- lineinfile:
dest: /tmp/dns_test
regexp: ^DNS{{ item.0+1 }}
line: DNS{{ item.0+1 }}={{ item.1 }}
with_indexed_items: "{{ srv_list }}"
Этот код заменит DNS<N>
с соответствующим значением от srv_list
если он присутствует в файле, или добавить новую строку, если DNS с таким индексом не определен в файле.