我routers
在版本控制系统中有一个纯文本文件,其中包含由换行符分隔的主机名:
$ cat routers
r1
r2
r3
$
我在版本控制系统中也有路由器配置模板作为纯文本文件。例如:
$ cat system:syslog
system {
syslog {
host 10.10.10.153 {
any notice;
daemon info;
}
}
}
$
我无法更改这两种文件的格式,因为它们被其他系统使用。现在我需要的是从这个文件创建 Ansible 库存文件,从路由器配置模板创建Ansible junos_configrouters
模块的配置文件,最后在 YAML 中创建 Ansible playbook。目前,我为此使用 bash 脚本。简而言之,它需要四个参数:
routers
文件- 配置模板文件(例如
system:syslog
上面描述的) - 票务系统票号(整数)
- 注释字符串(在路由器中用于描述更改)
根据上面的示例,routers
文件被转换为以下库存文件:
junipers ansible_connection=local
[junipers]
r1
r2
r3
system:syslog
文件被转换为<ticket_nr>.cfg
具有以下内容的文件名:
groups {
replace: system:syslog {
system {
syslog {
host 10.10.10.153 {
any notice;
daemon info;
}
}
}
}
}
基本上,bash 脚本会做这样的事情:
cat << EOF
groups {
replace: ${templatefile##*/} {
EOF
sed 's/^/ /' "$templatefile"
cat << EOF
}
}
EOF
最后生成剧本文件:
- hosts: junipers
remote_user: admin
tasks:
- name: Change routers conf.
ignore_errors: yes
junos_config:
comment: "<comment>"
timeout: 60
port: 22
src: <ticket_nr>.cfg
src_format: text
replace: yes
<comment>
并且<ticket_nr>
是给 bash 脚本的参数。此外,此 bash 脚本会检出所提及routers
文件和配置模板的最新版本。
现在有没有更好的方法可以在没有 bash 的情况下完成这一切?虽然这可行,但我觉得我做错了,我严重依赖 bash。是否有可能在 Ansible/Jinja2 中完成所有这些工作?