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 文档(详细信息,包括示例)

Ansible 样式文档

安装

您必须在系统上安装 依赖项。请查看 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

有关更多信息,请访问 - https://docs.ansible.com/ansible/latest/user_guide/collections_using.html#specifying-the-location-to-search-for-collections

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 控制机上安装以下内容:

许可证

Apache 2.0

支持

juniper.device 集合的支持由社区和 Juniper Networks 提供。如果您在 juniper.device 集合中的模块上遇到问题,您可以:

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

关于项目

Network build automation of Junos devices.

安装
ansible-galaxy install juniper.junos
许可证
apache-2.0
下载
3.5M
拥有者