我希望能够使用Ansible完全管理我的/etc/network/interfaces.d/配置文件。
我已经将ansible用于许多功能,包括apache文件,数据库和日志文件,但是我找不到合适的方法来正确添加/更新/删除网络接口配置文件。
我的服务器上有几个使用不同接口的不同项目,我希望ansible能够在我可以部署我的项目的任何服务器上工作。
我已经找到了使用下一个免费接口创建新文件的方法,
- name: calc next free interface
set_fact:
nextFreeIf: "
{%- set ifacePrefix = vars.ansible_default_ipv4.alias -%}
{%- set ifaceNum = { 'cnt': 0 } -%}
{%- macro increment(dct, key, inc=1)-%}
{%- if dct.update({key: dct[key] + inc}) -%}
{%- endif -%}
{%- endmacro -%}
{%- for iface in ansible_interfaces|sort -%}
{%- if iface| regex_search('^' ~ vars.ansible_default_ipv4.alias) -%}
{{ increment(ifaceNum, 'cnt') }}
{%- endif -%}
{%- endfor -%}
{{ifacePrefix}}:{{ifaceNum.cnt}}"
tags: network
- name: "copy network interface configuration"
template:
src: "files/etc/network/interfaces.d/my-configuration.conf"
dest: "/etc/network/interfaces.d/my-configuration.conf"
owner: root
group: root
force: true
notify: 'restart failover interface'
tags: network
现在,我需要找到一种方法来检查我的配置文件是否已经存在,因此我不会在每次运行ansible时重新创建新的配置文件。 但是,如果存在,仍然存在问题:
网络配置文件如下所示
auto {{ interface }}
iface {{ interface }} inet static
address {{ ip }}
netmask 255.255.255.255
由于我不知道我的项目使用的是哪个接口,因此我需要检查每个可用接口是否与实际文件匹配,如果不匹配,则使用下一个空闲接口进行更新。
我找不到使用Ansible的方法!
希望你能帮助我。
答案 0 :(得分:1)
好吧,我找到了一种很好的方法来做自己想做的事:
我无法弄清正在使用什么接口。这就是为什么我要检查每个接口是否良好。我试图通过比较每个接口要获取的文件和现有文件来找出答案。
但是我知道使用或将要使用哪个IP地址。 Ansible在每个接口中都有一个事实,在其中我可以找到对应的地址。因此,我不需要比较文件,只需要比较地址即可。
我只是更新了用于获取下一个免费接口的任务,以获取要使用的实际接口,该接口可以是下一个免费接口,也可以是已经使用的接口。
- name: find interface to use
set_fact:
interface: "
{%- set ifacePrefix = vars.ansible_default_ipv4.alias -%}
{%- set ifaceNum = { 'cnt': 1 } -%}
{%- macro increment(dct, key, inc=1)-%}
{%- if dct.update({key: dct[key] + inc}) -%}
{%- endif -%}
{%- endmacro -%}
{%- for iface in ansible_interfaces|sort -%}
{%- if ifacePrefix + '_' + ifaceNum.cnt|string in ansible_interfaces -%}
{{ increment(ifaceNum, 'cnt') }}
{%- endif -%}
{%- endfor -%}
{%- for iface in ansible_interfaces|sort -%}
{%- if iface.startswith(ifacePrefix) and ansible_facts[iface]['ipv4']['address'] == ip_failover -%}
{{ ifaceNum.update({'cnt': iface.split('_')[-1]}) }}
{%- endif -%}
{%- endfor -%}
{{ifacePrefix}}:{{ifaceNum.cnt}}"
tags: network
有关信息,第一个for循环是获得第一个免费接口,即使当某些接口断开时可能发生的接口编号出现空白。
答案 1 :(得分:0)
要检查conf文件是否存在,可以使用stat(https://docs.ansible.com/ansible/latest/modules/stat_module.html)
- stat:
path: "/path/to/conf/file"
register: conf_file
- name: DO it if conf file exists
action: {...}
when: "conf_file.stat.exists == True"