网络自动化运维 Help

9-2 Ansible资产

介绍

Ansible: (翻译中并没有这个单词,查了下名字来源)Ansible这个词是美国科幻小说作家厄休拉·勒古恩(Ursula K. Le Guin)在她1966年的小说《罗卡农的世界》(Rocannon's World)中创造的。 在勒古恩的虚构宇宙中,ansible是一种假想的设备,能够跨越遥远的距离,甚至在星系之间进行瞬时或超光速通信。这个词本身被认为是answerable (可回答的)的缩写,反映了该设备能够立即传递响应的能力。

Ansible自动化工具底层依赖SSH协议 ,相比其它协议,不需要在被管理节点安装额外的代理软件(如SNMP协议)。
SSH作为基础的、最流行的远程连接协议,网络设备上容易配置,Linux系统则默认已安装和开机启动,因此Ansible工具的前期准备较为简单。
Ansible是一个Python写的包,脸上SSH把各种操作写成了模块 ,例如专门管理服务的、专门运行原生命令的等等,用户只需要调用模块和配置命令参数。

官方文档

9 2ansible

官方文档 快速开始 https://docs.ansible.com/ansible/latest/getting_started/introduction.html

Getting Started with Ansible: 核心概念: 这部分文档主要介绍 Ansible 的基本原理和核心组件,旨在帮助新用户理解 Ansible 是什么、如何工作以及如何进行最基本的自动化操作。

Getting Started with Execution Environments: 核心概念: 这部分文档专注于 Ansible 的现代化部署和执行方式,引入了执行环境 (Execution Environments - EE) 的概念。执行环境是包含运行 Ansible 所需的所有依赖项(包括 Ansible Core、Python 版本、Ansible 集合及其依赖)的容器镜像。

也就是只看第一部分。

YAML格式

.yaml是一种专用于配置文件的格式,跟json非常相似,yaml的场景侧重于配置,json侧重于数据传输。

特性

YAML

JSON (JavaScript Object Notation)

语法

- 使用缩进表示结构
- 列表项使用 -
- 映射使用 :
- 通常符号较少,更接近自然语言
- 缩进有意义

- 使用 {} 表示对象
- 使用 [] 表示数组
- 使用 : 分隔键值
- 使用 , 分隔元素
- 字符串通常必须用双引号
- 语法严格

可读性

通常认为更易于人类阅读和编写。

结构清晰,但符号较多,人工读写稍显繁琐。

注释

支持# 开头的单行注释。

不支持注释 (官方规范)。

数据类型/特性

- 基本类型 + 列表/映射
- 支持锚点/别名 (&, *) 用于引用和复用
- 支持标签 (!!) 定义数据类型
- 支持多文档 (---)
- 对复杂类型支持更好(如日期)

- 基本类型 + 对象/数组
- 不支持锚点/别名、标签、多文档
- 主要用于表示基本数据结构

解析难度

对于机器解析相对复杂 (需要处理缩进、别名、标签等)。

对于机器解析非常简单快速 (无状态,语法规则简单)。

主要用途

配置管理文件 (Ansible, Docker Compose, K8s)、人工编辑的数据、日志。

Web API 数据交换、配置文件、日志、机器生成/解析数据。

安装Ansible

概念:

  • 被控节点(host node): 这里使用Ubuntu24.04作为被控节点,要求可通过SSH服务连接,要求Python版本不能太旧。

  • 控制节点(management node): Windows不支持作为控制节点 。运行时会报错os库没有一个属性,查了openstack网友遇到同样报错才知道问题所在os没有属性..., 官方文档说了但很不起眼 Ansible官方文档-intro_installation ,其实只要判断下操作系统给个提示就好。

  1. 在控制节点Ubuntu虚拟机中安装
    在Ubuntu中的Pycharm的终端中运行(因为ubuntu的终端里pip没有创建软连接,而pycharm中用的是虚拟环境解释器),注意Windows不可当控制节点。大约50Mb,挂国内源比较快。下面截图是在MacOS环境下,你可在Ubuntu中的Pycharm(我提供的虚拟机中已经安装)中运行。

# 在老师提供的Ubuntu中的Pycharm中的终端里运行,注意不是Windows中的Pycharm。否则初学者会迷惑于pip路径、环境变量。 # 虚拟机的vmware tools还未安装,不能从宿主机的文档里粘贴,建议手动敲代码或在虚拟机中火狐浏览器打开文档。 pip install ansible==11.5.0 -i https://mirrors.cloud.tencent.com/pypi/simple
9 2pip ansible mac os
  1. 项目目录下创建资产配置文件inventory.ini ,内含服务器IP、ssh用户名、密码、初次ssh连接自动信任证书等配置。

[myhosts] 127.0.0.1 ansible_user=zhangsan ansible_password=111111 ansible_python_interpreter='/usr/bin/python3' ansible_ssh_common_args='-o StrictHostKeyChecking=no'

或yaml格式达到同样效果,虽然这章主要介绍yaml格式,但简单配置情况下还是ini更方便。

myhosts: hosts: 127.0.0.1: ansible_user: zhangsan ansible_password: '111111' ansible_python_interpreter: '/usr/bin/python3' ansible_ssh_common_args: '-o StrictHostKeyChecking=no'

说明,
1) IP地址和SSH用户名密码根据实际情况变化 。如果只开一个虚拟机的话,那么这台虚拟机又当管理节点又当被控节点, 那么被控节点的IP就是本地127.0.0.1
如果开两台虚拟机,一台控制节点,一台被控节点,两台都为桥接模式,那么被控节点是本校的机房网段172开头的IP。
如果在个人电脑上用NAT模式实验,那么IP192.168.x.x开头。
2) myhosts是被管理节点的组名,要与后面命令中参数一致。

  1. 验证资产ping通-第一次尝试
    验证资产命令 ansible安装后会在系统全局生成一个命令行工具ansible,把各种功能封装成模块,所以命令形如ansible 配置组名 -m 模块 参数1=值1

# 作为管理节点的linux系统终端里运行 ansible myhosts -m ping -i inventory.ini
  1. 安装sshpass ,这是一个操作系统上的软件。
    初次运行验证资产命令后报错,因为密码默认应该是交互式方式用户手动输入,直接写配置文件里不安全(但方便实验),且需要一个叫sshpass的工具加密密码和传输信息。

(.venv) ~/Downloads/ansible_quickstart ansible myhosts -m ping -i inventory.ini [WARNING]: Unhandled error in Python interpreter discovery for host 192.168.156.135: Expecting value: line 1 column 1 (char 0) An exception occurred during task execution. To see the full traceback, use -vvv. The error was: SyntaxError: future feature annotations is not defined [WARNING]: Platform linux on host 192.168.156.135 is using the discovered Python interpreter at /usr/bin/python3, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible- core/2.18/reference_appendices/interpreter_discovery.html for more information. 192.168.156.135 | FAILED! => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "module_stderr": "Shared connection to 192.168.156.135 closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n File \"/home/yangzheng/.ansible/tmp/ansible-tmp-1745373649.983315-56612-242030219447474/AnsiballZ_ping.py\", line 107, in <module>\r\n _ansiballz_main()\r\n File \"/home/yangzheng/.ansible/tmp/ansible-tmp-1745373649.983315-56612-242030219447474/AnsiballZ_ping.py\", line 99, in _ansiballz_main\r\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n File \"/home/yangzheng/.ansible/tmp/ansible-tmp-1745373649.983315-56612-242030219447474/AnsiballZ_ping.py\", line 44, in invoke_module\r\n from ansible.module_utils import basic\r\n File \"<frozen importlib._bootstrap>\", line 971, in _find_and_load\r\n File \"<frozen importlib._bootstrap>\", line 951, in _find_and_load_unlocked\r\n File \"<frozen importlib._bootstrap>\", line 894, in _find_spec\r\n File \"<frozen importlib._bootstrap_external>\", line 1157, in find_spec\r\n File \"<frozen importlib._bootstrap_external>\", line 1131, in _get_spec\r\n File \"<frozen importlib._bootstrap_external>\", line 1112, in _legacy_get_spec\r\n File \"<frozen importlib._bootstrap>\", line 441, in spec_from_loader\r\n File \"<frozen importlib._bootstrap_external>\", line 544, in spec_from_file_location\r\n File \"/tmp/ansible_ping_payload_ed14h5pb/ansible_ping_payload.zip/ansible/module_utils/basic.py\", line 5\r\nSyntaxError: future feature annotations is not defined\r\n", "msg": "MODULE FAILURE: No start of json char found\nSee stdout/stderr for the exact error", "rc": 1 }

安装命令随平台变化(每家操作系统有自己的城池、除了名字不一样用法几乎一样):

apt update
apt install sshpass

# MacOS默认没有包管理工具,但第三方工具brew非常流行。需要先安装brew包管理工具,略。
brew update
brew install sshpass

yum update
yum install sshpass

# Windows没有默认的包管理工具,但第三方工具Chocolatey知名。需要先安装Chocolatey,Windows上用包管理工具的人非常少。
choco install sshpass

  1. 验证资产ping通-第二次尝试

# 作为管理节点的linux系统终端里运行 ansible myhosts -m ping -i inventory.ini

🎉成功后返回的json信息中包含SUCCESS'ping': 'pong' (乒乓球的英文,这是程序员的一点情趣,但我认为还是有点歧义的,值应该用ok)。
ssh连通后就可以通过ansible工具中的各种功能实现配置文件上传修改、运行命令、查询状态等各种运维功能了。

9 2 ping

9 2 ping 2

查看所有资产列表的命令是ansible-inventory -i inventory.ini --list。 失败的话根据报错信息检查服务器ssh服务状态、inventory.ini中的资产配置信息。

08 五月 2025