1
2
3
4
5
作者:李晓辉

微信联系:Lxh_Chat

联系邮箱: 939958092@qq.com

初识Ansible-navigator

RHAAP2中提供了ansible-navigator 命令来运行Playbook,不再使用ansible-playbook等命令

Ansible Navigator 是一个基于命令行的工具,旨在为用户提供更高效的 Ansible 使用体验。它通过一个交互式的文本用户界面(TUI),简化了与 Ansible 剧本、清单和文档的交互过程。

Ansible Navigator 的主要特点:

  1. 交互式界面:提供直观的命令行界面,用户可以轻松浏览和运行 Ansible 剧本。

  2. 支持执行环境:通过容器技术(如 Podman 或 Docker),确保一致的运行环境,减少依赖问题。

  3. 剧本调试与排查:支持实时查看剧本执行的详细信息,便于快速定位问题。

  4. 与 Ansible 集成:与 Ansible 的核心功能无缝对接,支持清单、集合和模块的管理。

功能亮点

  1. 交互式体验

    • 提供用户友好的界面,可通过菜单选择查看清单、日志或集合。

    • 让用户在终端中轻松浏览Playbook的内容和执行结果。

  2. 支持执行环境

    • 通过集成容器技术(如Podman或Docker),确保在标准化环境中运行Ansible任务,减少系统依赖的复杂性。

    • 用户可以随时切换是否启用执行环境,从而满足不同的使用需求。

  3. 更强的调试能力

    • 在运行Playbook的过程中,Navigator能实时提供详细的日志输出。

    • 用户可以通过“逐步查看”的方式精准定位任务失败的原因,大大提升问题排查效率。

  4. 内容集合和清单管理

    • Navigator允许用户便捷地浏览和操作Ansible内容集合及清单文件。

    • 它能自动解析集合中的模块和插件,为用户提供详细的结构信息。

Ansible-navigator 运行示例

以前执行Playbook:

1
[student@workstation ~]$ ansible-playbook -i inventory playbook.yml 

现在执行Playbook:

1
[student@workstation ~]$ ansible-navigator run playbook.yml -i inventory -m stdout

需要注意这个-m stdout,如果不加这个-m参数,会进入交互式运行的状态,而不是默认输出到屏幕的方式,以下是交互式界面

可以通过按0-9的数字 或在 ansible-navigator 中键⼊:数字,获取有关play 运⾏的任务的信息,比如我按下0会有如下反应

只要前面还有数字编号,就可以按数字继续查询详情,比如我又按下2

看完了之后,按ESC退出

使用自动化执行环境来提⾼可移植性

⾃动化执⾏环境是⼀种容器镜像,借助⾃动化执⾏环境,可以避免在⾃动化控制器上创建多个 Python 虚拟环境。rhaap2使⽤多个⾃动化执⾏环境,⽽不是多个 Python 虚拟环境

如果使⽤ ansible-navigator 运⾏ playbook,并且不指定特定的⾃动化执⾏环境,ansible-navigator 会⾃动尝试从 registry.redhat.io 调取默认的⾃动化执⾏环境,对于rhaap2来说,这个环境是:registry.redhat.io/ansible-automation-platform-22/ee-supported-rhel8:latest

在运行Playbook时,可以用--eei来选择特定的容器镜像以⽤作⾃动化执⾏环境,也可以用-pp选项来控制 ansible-navigator 如何调取容器镜像。 当此选项的值设置为 missing时,⾃动化内容导航器仅在本地系统上不存在镜像时才拉取容器镜像。

注意

如果你的镜像仓库需要认证,请提前podman login xxxx
我们课程中,默认用的镜像地址为:hub.lab.example.com/ee-supported-rhel8
用户名: admin
密码:redhat

安装ansible-navigator

Ansible 是非侵入式的自动化平台,所以只需要在控制节点安装即可,需要注意的是,安装需要开通相应的红帽订阅,不过我们的环境中已经内置了。

1
[student@workstation ~]$ sudo yum install ansible-navigator -y

安装好了之后,还需要生成ansible.cfg配置文件和ansible-navigator.yml配置文件

ansible.cfg 是控制 Ansible 核心运行行为的重要文件,而 ansible-navigator.yml 则是针对 Navigator 界面和交互体验的定制化工具配置。这两个文件相辅相成,共同为用户提供了灵活高效的自动化操作环境。

1. ansible.cfg 文件

ansible.cfg 是 Ansible 的核心配置文件,用于定义 Ansible 的全局行为。它主要用于控制任务的执行方式、连接远程主机的方式,以及日志和角色路径等重要参数。该文件在运行 Ansible 时会自动被读取,用户通过它可以自定义 Ansible 的运行环境。

主要作用:

  • 清单配置:指定默认的主机清单文件路径。

  • 连接管理:设置SSH连接参数,例如超时时间和控制路径。

  • 日志管理:定义日志文件的位置和格式,以便记录执行过程。

  • 角色和模块路径:配置自定义角色和模块的搜索路径,方便扩展功能。

该文件的优先级较高,影响所有Ansible任务的运行,是控制Ansible行为的核心工具。

我们来看看这个ansible.cfg

1
2
3
4
5
6
7
8
9
10
11
cat > ansible.cfg <<-EOF
[defaults]
inventory = ./inventory
remote_user = student

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOF
  • inventory: 指定了主机清单文件的位置。

  • remote_user: 指定默认的远程用户。

  • become: 启用提权。

  • become_method: 指定提权方法为 sudo

  • become_user: 指定提权用户为 root

  • become_ask_pass: 提权时不要求输入密码。

我们既然已经制定了清单,就来弄一个吧

1
2
3
cat > inventory <<-EOF
server[a:b].lab.example.com
EOF

2. ansible-navigator.yml 文件

ansible-navigator.yml 是专为 Ansible Navigator 设计的配置文件,用于控制 Navigator 的交互式界面行为、执行环境,以及与清单和内容集合的交互方式。它更侧重于优化用户体验和提供定制化的操作方式。

主要作用:

  • 交互模式:指定 Navigator 的运行模式,例如交互式界面模式或标准输出模式。

  • 执行环境:定义是否启用容器化执行环境,以及配置容器镜像和运行引擎(如Podman或Docker)。

  • 资源管理:设置默认的清单文件和剧本路径,便于快速加载和使用。

  • 日志与调试:控制日志的保存位置和详细程度,方便用户追踪和排查问题。

  • 界面优化:调整用户界面的行为和布局,提升交互效率。

此文件的设置范围更聚焦于用户体验,主要影响 Navigator 工具的操作方式,而非 Ansible 的核心执行逻辑。

看看这个样例文件:

1
2
3
4
5
6
7
8
9
10
11
cat > ansible-navigator.yml <<-EOF
---
ansible-navigator:
execution-environment:
image: 'hub.lab.example.com/ee-supported-rhel8:latest'
pull:
policy: missing
mode: stdout
playbook-artifact:
enable: false
EOF

来解读一下

  • execution-environment: 执行环境配置。

    • image: 指定了运行 Ansible 的执行环境镜像,此处使用 quay.io/ansible/ansible-runner:latest
  • playbook-artifact: 配置 playbook 执行结果的保存。

    • enable: 启用 playbook artifact 功能。
  • mode: 设置 Ansible Navigator 的输出模式为 stdout,表示将结果输出到标准输出(终端)。

这个配置文件定义了 Ansible Navigator 的执行环境、playbook 执行结果保存、输出模式。

配置受管主机的⾝份验证

如果你想让 ansible-navigator 能够登录到受管主机并获取超级用户权限,最简单的方法就是让控制节点上的自动化用户使用 SSH 密钥认证登录,然后配置该用户可以通过 sudo 提权,而无需输入密码。

首先,你需要在控制节点上为自动化用户生成 SSH 密钥,并将该密钥分发到所有远程主机。这样,ansible-navigator 就能通过 SSH 连接,并且可以轻松获得提权权限。

1
2
[student@workstation ~]$ ssh-keygen
[student@workstation ~]$ ssh-copy-id student@servera

需要在所有的受管主机上配置sudo提权,这里以servera举例,你需要在所有的清单主机上完成以下内容

1
2
3
[servera@workstation ~]# vim /etc/sudoers
...
student ALL=(ALL) NOPASSWD: ALL

为⾃动化执⾏环境提供私钥

ansible-navigatoransible-playbook 在身份验证方面的主要区别在于,ansible-navigator 会在容器内运行 Playbook,因此无法直接访问控制节点上的 ~/.ssh 目录。但是,如果你在控制节点上运行 ssh-agent 来存储 SSH 私钥,或者使用图形界面登录,那么当你运行 ansible-navigator 时,它可以自动将这些密钥传递到容器中的执行环境。

如果你是通过字符界面登录的,就需要手动启动 ssh-agent。可以通过运行以下命令来启动它:

1
2
3
4
[student@workstation ~]$ eval $(ssh-agent)
Agent pid 6513
[student@workstation ~]$ ssh-add
Identity added: /home/student/.ssh/id_rsa (student@workstation.lab.example.com)

这两条命令的作用是启动 ssh-agent 并将 SSH 私钥添加到该代理中,以便后续的 SSH 连接能够自动使用这些密钥进行身份验证。

  1. eval $(ssh-agent)
    这条命令启动了 ssh-agent,并通过 eval 命令将其环境变量加载到当前 shell 会话中。ssh-agent 是一个后台进程,用于管理你的 SSH 密钥。它会存储 SSH 私钥,以便 SSH 客户端能够在连接时自动使用,而不需要你每次都输入密码。

  2. ssh-add
    这条命令用于将 SSH 私钥添加到 ssh-agent 中。我们这里,/home/student/.ssh/id_rsa 是默认的私钥文件,它会被添加到 ssh-agent 进行管理。

这样,当你用 ssh 连接到远程主机时,ssh-agent 会自动提供正确的密钥,无需每次输入密码。这对 ansible-navigator 等工具非常有用,因为它们在容器中运行时无法直接访问 ~/.ssh,但可以通过 ssh-agent 来获取密钥。

运行ansible-navigator

早期命令现在命令
ansible-configansible-navigator config
ansible-docansible-navigator doc
ansible-inventoryansible-navigator inventory
ansible-playbookansible-navigator run

ansible-navigator的子命令:

在交互式会话中运⾏⼦命令时,键⼊ : 可启动命令,如 :config

子命令描述
collections获取有关已安装集合的信息
config检查当前的 Ansible 配置
doc检查插件的 Ansible ⽂档
help显⽰ ansible-navigator 的详细帮助
images检查执⾏环境
inventory浏览清单
log查看当前的⽇志⽂件
open在⽂本编辑器中打开当前⻚⾯
replay重播 playbook 构件
run运⾏ playbook

检查以前的 Playbook 运⾏

ansible-navigator 提供了一个 重播(replay) 功能,可以查看上一次 Playbook 运行的输出。每次运行 Playbook 时,它都会自动生成一个 构件文件(artifact),格式类似于 Playbookname-artifact-xxxxx.json

如果你想回顾上次的运行结果,只需要运行:

它会读取最新的构件文件,让你查看之前的 Playbook 运行情况。

1
ansible-navigator replay xxx.json

重播文件的好处

如果 Playbook 运行失败,你可以直接把这个 重播文件 发送给其他开发人员或支持团队,他们可以继续排查问题,而 不需要 访问你的 Playbook、角色、清单文件或变量文件。这对于团队协作和故障排查来说,非常方便!

获取帮助

ansible-navigator 提供了对插件(如模块、查找和回调)文档的访问功能,和 ansible-doc 命令非常相似。唯一的不同之处在于,ansible-navigator 不支持使用 --list-l 选项来列出特定类型的所有插件。你必须明确指定插件的名称。

举个例子,如果你想查看 ansible.posix.firewalld 模块的文档,可以运行以下命令:

1
ansible-navigator doc ansible.posix.firewalld

此外,你也可以在 ansible-navigator 的交互式会话中,通过运行子命令 :doc ansible.posix.firewalld 来查看相同的文档。

ansible-navigator 命令本身提供了多种获取帮助的方式:

  1. 交互模式中的帮助:如果你在交互模式中运行 ansible-navigator,可以键入 :help 来打开帮助页面。

  2. 命令行帮助:你也可以在命令中添加 --help-h 选项,这样会显示命令语法和选项的描述。例如:

1
ansible-navigator --help

通过这些方式,你可以轻松获得有关 ansible-navigator 使用的帮助和文档。