使用 Ansible 创建接口配置文件
Create interface configuration files using Ansible
我有一个 Excel 电子表格,已保存为 CSV 文件(以逗号分隔),其中包含服务器列表的多个接口的 IP 地址。这些服务器上(最初)配置了一个接口,所以我可以连接。我想逐行查看此文件并获取必要的值以在本地构建 ifcfg 文件,复制到服务器,然后重新启动网络。
这不是实际文件;相反,一个示例概述了一个位置提供了多个 IP 地址的想法。
New Orleans, 192.168.10.42, 13, 192.168.3.10
Atlanta, 192.168.31.100, 18, 192.168.10.10
Detroit, 172.16.31.8, 43, 172.16.10.27
目标是解析此文件并创建如下网络接口文件
ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
NM_CONTROLLED=no
IPADDR=192.168.10
ifcfg-ens3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
NM_CONTROLLED=no
IPADDR=192.168.3.10
这看起来让我走到了那里
- debug:
loop: "{{ lookup('file', './file.one').splitlines() }}"
register: val
和returns
ok: [localhost] => (item=New Orleans, 192.168.10.42, 13, 192.168.3.10) => {
"msg": "Hello world!"
}
ok: [localhost] => (item=Atlanta, 192.168.31.100, 18, 192.168.10.10) => {
"msg": "Hello world!"
}
ok: [localhost] => (item=Detroit, 172.16.31.8, 43, 172.16.10.27) => {
"msg": "Hello world!"
}
我确实在 Whosebug 上找到了一个使用 the_dict
的片段,但所有内容都作为列表而不是标量返回:(
tasks:
- debug: var=the_dict
vars:
the_dict: >-
{%- set row = lookup("file", "~/Documents/Book1.csv").split("\n") | list -%}
{%- for i in row -%}
{%- set v = i.split(",") -%}
{%- set A_Location = v.0 -%}
{%- set B_Interface = v.1 -%}
...
...
...
要使用 ansible 读取 csv,请阅读 module CSV
模板使用示例
模板文件conf.j2(放在templates目录)
{% for record in records.list %}
ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
NM_CONTROLLED=no
IPADDR={{ record.ip1 }}
ifcfg-ens3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
NM_CONTROLLED=no
IPADDR=1{{ record.ip2 }}
{% endfor %}
- name: playbook2.0
hosts: localhost
gather_facts: False
tasks:
- name: Read CSV file and return a list
community.general.read_csv:
path: file.csv
fieldnames: location,ip1,data,ip2
delimiter: ','
register: records
delegate_to: localhost
- name: generate fileconf.txt from conf.j2
template:
src: conf.j2
dest: fileconf.txt
您在文件 fileconf.txt
中生成了新文件 conf
您可以根据需要使用 jinja2 语法调整 file.j2
我有一个 Excel 电子表格,已保存为 CSV 文件(以逗号分隔),其中包含服务器列表的多个接口的 IP 地址。这些服务器上(最初)配置了一个接口,所以我可以连接。我想逐行查看此文件并获取必要的值以在本地构建 ifcfg 文件,复制到服务器,然后重新启动网络。
这不是实际文件;相反,一个示例概述了一个位置提供了多个 IP 地址的想法。
New Orleans, 192.168.10.42, 13, 192.168.3.10
Atlanta, 192.168.31.100, 18, 192.168.10.10
Detroit, 172.16.31.8, 43, 172.16.10.27
目标是解析此文件并创建如下网络接口文件
ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
NM_CONTROLLED=no
IPADDR=192.168.10
ifcfg-ens3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
NM_CONTROLLED=no
IPADDR=192.168.3.10
这看起来让我走到了那里
- debug:
loop: "{{ lookup('file', './file.one').splitlines() }}"
register: val
和returns
ok: [localhost] => (item=New Orleans, 192.168.10.42, 13, 192.168.3.10) => {
"msg": "Hello world!"
}
ok: [localhost] => (item=Atlanta, 192.168.31.100, 18, 192.168.10.10) => {
"msg": "Hello world!"
}
ok: [localhost] => (item=Detroit, 172.16.31.8, 43, 172.16.10.27) => {
"msg": "Hello world!"
}
我确实在 Whosebug 上找到了一个使用 the_dict
的片段,但所有内容都作为列表而不是标量返回:(
tasks:
- debug: var=the_dict
vars:
the_dict: >-
{%- set row = lookup("file", "~/Documents/Book1.csv").split("\n") | list -%}
{%- for i in row -%}
{%- set v = i.split(",") -%}
{%- set A_Location = v.0 -%}
{%- set B_Interface = v.1 -%}
...
...
...
要使用 ansible 读取 csv,请阅读 module CSV
模板使用示例 模板文件conf.j2(放在templates目录)
{% for record in records.list %}
ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
NM_CONTROLLED=no
IPADDR={{ record.ip1 }}
ifcfg-ens3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
NM_CONTROLLED=no
IPADDR=1{{ record.ip2 }}
{% endfor %}
- name: playbook2.0
hosts: localhost
gather_facts: False
tasks:
- name: Read CSV file and return a list
community.general.read_csv:
path: file.csv
fieldnames: location,ip1,data,ip2
delimiter: ','
register: records
delegate_to: localhost
- name: generate fileconf.txt from conf.j2
template:
src: conf.j2
dest: fileconf.txt
您在文件 fileconf.txt
中生成了新文件 conf您可以根据需要使用 jinja2 语法调整 file.j2