juniper.junos
Juniper Ansible 集合用于 Junos
关于
Juniper Networks 支持使用 Ansible 管理运行 Junos 操作系统的设备(Junos OS 和 Junos Evolved)。此集合托管在 Ansible Galaxy 网站上,地址为 juniper.device。
juniper.device
集合包含一组 Ansible 模块,这些模块在运行 Junos OS 的设备上执行特定的操作和配置任务。这些任务包括:安装和升级 Junos OS、在网络中配置新的 Junos 设备、加载配置更改、检索信息,以及重置、重启或关闭受管理设备。有关安装此集合的说明,请参阅 INSTALLATION 部分。
针对 Junos 设备的两组 Ansible 模块
自 Ansible 版本 >= 2.1 起,Ansible 还原生支持
用于 Junos 的核心模块。Ansible 核心中包含的 Junos 模块名称以 junos_
前缀开头。而在 Juniper.device
集合中包含的 Junos 模块名称以模块类型开头。这两组 Junos 模块可以在同一 Ansible 控制机上共存,Ansible playbook 可以调用任意一组(或两组)中的模块。Juniper Networks 建议在编写管理 Junos 设备的新 playbooks 时,使用 juniper.device
集合中的模块。
模块概述
juniper.device
集合包括以下模块:
- command — 在 Junos 设备上执行一个或多个 CLI 命令。
- config — 操作 Junos 设备的配置。
- facts — 从 Junos 设备中检索事实信息。
- file_copy - 从 Junos 设备复制文件,或将文件复制到 Junos 设备。
- jsnapy — 在 Junos 设备上执行 JSNAPy 测试。
- ping — 从 Junos 设备执行 ping 命令。
- pmtud — 从 Junos 设备到目标执行路径 MTU 发现。
- rpc — 在 Junos 设备上执行一个或多个 NETCONF RPC。
- software — 在 Junos 设备上安装软件。
- srx_cluster — 添加或删除 SRX 底盘集群配置。
- system — 在 Junos 系统上发起操作性操作。
- table — 使用 PyEZ 表/视图从 Junos 设备中检索数据。
PyEZ 版本要求
对于 ansible 集合 juniper.device
,我们需要安装 junos-eznc 版本 2.6.0 或更高版本。
插件概述
除了上述列出的模块外,还可以使用回调插件 jsnapy
,该插件用于模块 jsnapy。
回调插件 jsnapy
有助于打印有关 jsnapy 失败测试的附加信息。在每个失败测试之后,都会在 playbook 的 RECAP 后打印日志,如下示例所示:
PLAY RECAP *********************************************************************
qfx10002-01 : ok=3 changed=0 unreachable=0 failed=1
qfx10002-02 : ok=3 changed=0 unreachable=0 failed=1
qfx5100-01 : ok=1 changed=0 unreachable=0 failed=1
JSNAPy 结果: qfx10002-01 ************************************************
在 '//bgp-information/bgp-peer' 的 'peer-state' 值不相等,实际值为 {"peer-as": "65200", "peer-state": "Active", "peer-address": "100.0.0.21"}
在 '//bgp-information/bgp-peer' 的 'peer-state' 值不相等,实际值为 {"peer-as": "60021", "peer-state": "Idle", "peer-address": "192.168.0.1"}
在 '//interface-information/physical-interface[normalize-space(admin-status)='up' and logical-interface/address-family/address-family-name ]' 的 'oper-status' 值不相等,实际值为 {"oper-status": "down", "name": "et-0/0/18"}
JSNAPy 结果: qfx10002-02 ************************************************
在 '//bgp-information/bgp-peer' 的 'peer-state' 值不相等,实际值为 {"peer-as": "65200", "peer-state": "Active", "peer-address": "100.0.0.21"}
回调插件默认情况下未激活。它们必须手动添加到 Ansible 配置文件中的 [defaults]
部分,使用变量 callback_whitelist
。特别是,应该在 Ansible 配置文件中添加这些行以允许 jsnapy 回调插件:
[defaults]
callback_whitelist = jsnapy
文档
官方 Juniper 文档(详细信息,包括示例)
安装
您必须在系统上安装 依赖项。请查看 requirements.txt 以获取依赖项。
注意事项
MacOS Mojave 及更新版本
在 MacOS Mojave 及更新版本 (>=10.14)中,使用系统 ssh-keygen
创建的 ssh 密钥使用较新的 "OPENSSH" 密钥格式创建,即使在创建时指定 -t rsa
。这直接影响了 ssh 密钥的使用,特别是在使用 ssh_private_key_file
时。要创建/转换/检查密钥,请执行以下步骤:
- 创建一个新的 RSA 密钥:
ssh-keygen -m PEM -t rsa -b 4096
- 检查现有密钥:
head -n1 ~/.ssh/some_private_key
RSA 密钥将为-----BEGIN RSA PRIVATE KEY-----
,OPENSSH 密钥将为-----BEGIN OPENSSH PRIVATE KEY-----
- 将 OPENSSH 密钥转换为 RSA 密钥:
ssh-keygen -p -m PEM -f ~/.ssh/some_key
Ansible Galaxy 集合
您可以使用 ansible-galaxy install 命令安装最新版本的 juniper.device
集合。
sudo ansible-galaxy collection install juniper.device
您还可以使用 ansible-galaxy install 命令直接从 GitHub 安装 junos 集合的最新开发版本。
sudo ansible-galaxy collection install git+https://github.com/Juniper/ansible-junos-stdlib.git#/ansible_collections/juniper/device
Git 克隆
为了进行测试,您可以 git clone
此仓库并在仓库目录中运行 env-setup
脚本:
user@ansible-junos-stdlib> source env-setup
这将设置您的 $ANSIBLE_LIBRARY
变量为仓库位置和已安装的 Ansible 库路径。例如:
$ echo $ANSIBLE_LIBRARY /home/jeremy/Ansible/ansible-junos-stdlib/library:/usr/share/ansible
Docker
要将其作为 Docker 容器运行,包括 JSNAPy 和 PyEZ,只需从 Docker Hub 拉取并运行它。以下将拉取最新镜像并在交互式 ash shell 中运行。
docker run -it --rm juniper/pyez-ansible
不过,您可能希望绑定挂载一个主机目录(可能是包含您的 playbooks 和相关文件的目录)。以下命令将绑定挂载当前工作目录并启动 ash shell。
docker run -it --rm -v $PWD:/project juniper/pyez-ansible
您还可以将该容器用作执行文件来运行您的 playbooks。假设我们有如下的典型 playbook 结构:
example
|playbook.yml
|hosts
|-vars
|-templates
|-scripts
我们可以切换到 example 目录并运行 playbook,使用以下命令:
cd example/ docker run -it --rm -v $PWD:/playbooks juniper/pyez-ansible ansible-playbook -i hosts playbook.yml
您可以在容器名称后传递任何有效的命令字符串,它将传递给 Bash 执行。
您可能已经注意到基本命令几乎总是相同的。我们也可以使用别名来节省一些输入的字符。
alias pb-ansible="docker run -it --rm -v $PWD:/project juniper/pyez-ansible ansible-playbook" pb-ansible -i hosts playbook.yml
使用附加包扩展容器
可以在容器实例化时安装额外的操作系统(Alpine)软件包、Python 软件包(通过 pip)和 Ansible 集合。这可以通过传递环境变量或绑定挂载文件来完成。
操作系统软件包
环境变量:$APK
绑定挂载:/extras/apk.txt
文件格式:有效 Alpine 软件包的列表,每行一个
示例:
作为环境变量,当包含软件包列表的文件位于当前目录时。
docker run -it --rm -v $PWD:/project -e APK="apk.txt" juniper/pyez-ansible
作为绑定挂载。
docker run -it --rm -v $PWD/apk.txt:/extras/apk.txt juniper/pyez-ansible
Python 软件包
环境变量:$REQ
绑定挂载:/extras/requirements.txt
文件格式:pip 要求 文件
示例:
docker run -it --rm -v $PWD:/project -e REQ="requirements.txt" juniper/pyez-ansible
作为绑定挂载。
docker run -it --rm -v $PWD/requirements.txt:/extras/requirements.txt juniper/pyez-ansible
Ansible 软件包
环境变量:$ROLES
绑定挂载:/extras/requirements.yml
文件格式:Ansible 要求 文件
注意: 这适用于集合和角色。
示例:
docker run -it --rm -v $PWD:/project -e REQ="requirements.yml" juniper/pyez-ansible
作为绑定挂载。
docker run -it --rm -v $PWD/requirements.txt:/extras/requirements.yml juniper/pyez-ansible
示例 Playbook
以下示例概述了如何使用 Ansible 在运行 Junos OS 的设备上安装或升级软件映像。
---
- name: 安装 Junos OS
hosts: dc1
connection: local
gather_facts: false
vars:
wait_time: 3600
pkg_dir: /var/tmp/junos-install
os_version: 14.1R1.10
os_package: jinstall-14.1R1.10-domestic-signed.tgz
log_dir: /var/log/ansible
tasks:
- name: 检查 NETCONF 连接
ansible.builtin.wait_for:
host: "{{ inventory_hostname }}"
port: 830
timeout: 5
- name: 安装 Junos OS 软件包
juniper.device.software:
reboot: true
version: "{{ os_version }}"
package: "{{ pkg_dir }}/{{ os_package }}"
logfile: "{{ log_dir }}/software.log"
register: sw
notify:
- 等待重启
handlers:
- name: 等待重启
ansible.builtin.wait_for:
host: "{{ inventory_hostname }}"
port: 830
timeout: "{{ wait_time }}"
when: not sw.check_mode
依赖项
此模块需要在 Ansible 控制机上安装以下内容:
- Python >= 3.8
- Ansible 2.9 或更高版本
- Junos py-junos-eznc 2.6.0 或更高版本
- jxmlease 1.0.1 或更高版本
- xmltodict 0.13.0 或更高版本
- jsnapy 1.3.7 或更高版本
许可证
Apache 2.0
支持
此 juniper.device
集合的支持由社区和 Juniper Networks 提供。如果您在 juniper.device
集合中的模块上遇到问题,您可以:
- 打开 GitHub 问题。
- 在我们的 Google 组 上发布问题。
- 发送电子邮件至 [email protected]。
- 开立 JTAC 案例。
Ansible 核心中包含的 Junos 模块支持由 Ansible 提供。如果您在 Ansible 核心模块中遇到问题,应针对 Ansible 项目打开 Github 问题。
贡献者
Juniper Networks 正在积极贡献和维护此仓库。有关任何查询,请联系 [email protected]。
贡献者: Stephen Steiner, Dinesh Babu, Chidanand Pujar
前贡献者:
Stacy W Smith, Jeremy Schulman, Rick Sherman, Damien Garros, David Gethings, Nitin Kumar, Rahul Kumar
ansible-galaxy install juniper.junos