-1

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 脚本。简而言之,它需要四个参数:

  1. routers文件
  2. 配置模板文件(例如system:syslog上面描述的)
  3. 票务系统票号(整数)
  4. 注释字符串(在路由器中用于描述更改)

根据上面的示例,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 中完成所有这些工作?

4

1 回答 1

0
$ cat system:syslog 
system {
    syslog {
        host 10.10.10.153 {
            any notice;
            daemon info;
        }
    }
}
$ cat replace_sys_syslog.j2 
groups {
    replace: system:syslog {
{{ conf }}
    }
}
$ cat example.py 
from jinja2 import Template


tmpl = Template(open('replace_sys_syslog.j2').read())
conf = tmpl.render(conf=open('system:syslog').read())
print conf
$ python example.py 
groups {
    replace: system:syslog {
system {
    syslog {
        host 10.10.10.153 {
            any notice;
            daemon info;
        }
    }
}

    }
}

现在使用这些模板文件,Ansible 任务可以生成配置。

于 2017-06-07T09:15:50.653 回答