Orange的运维学习日记--41.Ansible基础入门
文章目录
- Orange的运维学习日记--41.Ansible基础入门
-
- 手动执行任务与自动化执行任务
- [Ansible 与 DevOps](#Ansible 与 DevOps)
-
- [什么是 Ansible](#什么是 Ansible)
- [Ansible 特点](#Ansible 特点)
- [Ansible 概念与架构](#Ansible 概念与架构)
- [Ansible Way](#Ansible Way)
- [Ansible 用例](#Ansible 用例)
- [Ansible 部署](#Ansible 部署)
- [Ansible 基本使用](#Ansible 基本使用)
- [管理 Ansible 配置文件](#管理 Ansible 配置文件)
-
- 配置文件位置与优先级
- 配置文件解析
- 示例配置文件
- [ansible-config 命令](#ansible-config 命令)
- [localhost 连接](#localhost 连接)
- [运行 AD HOC 命令](#运行 AD HOC 命令)
手动执行任务与自动化执行任务
手动执行任务会容易遗漏某个步骤或错误地执行某个步骤 步骤是否正确或达到预期结果的验证通常有限
管理大量服务器时易出现环境差异 增加维护难度并带来错误或不稳定性
自动化执行任务通过标准化快速且正确地部署和配置所有系统
自动化完成日常重复性任务 让团队专注于更重要的事情
更快速地交付应用
良好的自动化系统支持基础架构即代码 方法使用机器可读的自动化语言来定义和描述IT基础架构状态
理想的自动化语言也应易于人类阅读 便于理解和修改状态
将自动化语言保存在简单文本文件中 可以使用版本控制系统管理 每次更改都有历史记录 并可将系统恢复到早期配置
这种流程奠定DevOps基础 开发人员定义所需配置 操作人员查看更改并使用自动化重复确保系统处于期望状态
Ansible 与 DevOps
DevOps是一组过程、方法与系统的统称 旨在促进开发、运营与质量保障部门之间的沟通协作
通过自动化软件交付和架构变更流程 使构建、测试、发布软件更加快捷、频繁和可靠
在DevOps中,沟通与协作是核心
Ansible是第一款可在整个IT范围读取和编写的自动化语言 唯一能够从头至尾自动化应用生命周期和持续交付管道的引擎
什么是 Ansible
Ansible 是一种简单的自动化语言 通过Playbook描述和配置IT基础架构
Ansible适用于不同生产环境下的强大自动化任务 同时对新用户友好 可以快速上手并应用到生产环境
使用场景包括OpenStack搭建与维护 OpenShift搭建与维护 Ceph集群搭建与维护
Ansible 特点
- 简单:Playbook是易于查阅、理解和更改的文本文件 无需具备编程技能
- 功能强大:支持配置管理、工作流自动化、网络自动化和应用生命周期编排
- 无代理:通过OpenSSH或WinRM连接到受管节点 推送并执行临时模块 完成后自动清理节点上的模块
- 跨平台支持:可管理Linux、UNIX、Windows以及网络设备
- 精确描述:Playbook使用YAML格式描述生产环境状态
- 版本控制:Playbook和项目均为纯文本 可存入版本控制系统
- 易于集成:与HP SA、Puppet、Jenkins、红帽卫星服务器等系统无缝对接
Ansible 概念与架构

- NODES
- 控制节点:安装Ansible软件的节点
- 受管节点:被Ansible管理的Linux、Windows或网络设备
- INVENTORY:受管主机清单
- PLAYBOOK:包含多个play 每个play在一组hosts上顺序运行一系列tasks 每个task都执行一个模块 模块是用于实现特定自动化任务的小段代码
- PLUGINS:扩展Ansible功能的代码段
Playbooks、plays和tasks均为幂等 在相同主机上多次执行只应用必要更改
Ansible Way
- Complexity Kills Productivity 复杂度会破坏效率 追求简单
- Optimize For Readability 专为易读性优化 声明式文本文件构建自动化流程
- Think Declaratively 声明式思维 表达期望状态 仅执行必要更改
Ansible 用例
- 配置管理:集中管理并部署配置文件
- 应用部署:定义应用并使用红帽Ansible Tower管理整个生命周期
- 工作流管理:简化PXE引导、kickstart安装、虚拟机或云实例调配流程
- 持续交付:借助简单自动化平台协调多团队完成CI/CD
- 安全性与合规性:将安全策略定义在Playbook中 集成扫描和修复流程
- 编排:定义多配置之间的交互 并整体管理分散资源
Ansible 部署
实验环境准备
在所有节点的 /etc/hosts
中添加
bash
10.1.8.10 controller.example.cloud controller
10.1.8.11 node1.example.cloud node1
10.1.8.12 node2.example.cloud node2
10.1.8.13 node3.example.cloud node3
10.1.8.14 node4.example.cloud node4
创建 laoma
用户 并在所有节点配置免密sudo
bash
useradd laoma
echo redhat | passwd --stdin laoma
echo 'laoma ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/laoma
生成SSH密钥并推送到受管节点
bash
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
yum install -y sshpass
for host in controller node{1..4}; do
sshpass -p redhat ssh-copy-id laoma@$host
done
验证免密登录
bash
for host in controller node{1..4}; do
ssh laoma@$host hostname
done
控制节点
控制节点用于安装Ansible 软件 受管节点无需安装Ansible
bash
yum install -y ansible
ansible --version
受管节点
Linux
- 需要安装Python以运行大多数模块
- 部分模块(如raw)不依赖Python
Windows
- 安装PowerShell 3.0及以上
- 配置PowerShell远程连接
- 安装.NET Framework 4.0及以上
更多细节可见官方文档
网络设备
Ansible通过专用网络模块配置路由器和交换机
支持Cisco IOS/IOSXR/NX-OS Juniper Junos Arista EOS VyOS等设备
Ansible 基本使用
清单
ansible 软件包中文件位置
bash
rpm -ql ansible
- /etc/ansible 配置文件目录
- /usr/bin 执行文件目录
- /usr/lib/python*/site-packages/ansible 模块库
- /usr/share/ansible/plugins 插件目录
- /usr/share/doc/ansible 文档
- /usr/share/man/man1 手册页
主机清单
Inventory定义Ansible管理的主机 可以分配到组或子组 支持变量注入
静态主机清单
使用INI或YAML格式文本文件
简单清单示例
ini
web1.example.com
web2.example.com
db1.example.com
192.0.2.42
验证
bash
ansible --list-hosts -i inventory web1.example.com
主机组
ini
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com
组嵌套
ini
[eastdc]
web1.example.com
db1.example.com
[westdc]
web2.example.com
db2.example.com
[dc:children]
eastdc
westdc
范围简写
ini
# 192.168.4.0-192.168.7.255
[priv]
192.168.[4:7].[0:255]
# host01-host20
[hosts]
host[01:20].example.com
动态主机清单
使用脚本或外部程序动态生成 清单源可来自OpenStack、Kubernetes、Zabbix等
ansible-inventory 命令
--list
以JSON或YAML输出全部清单--host
显示指定主机信息--graph
以树状结构显示组关系
bash
ansible-inventory -i inventory --graph
管理 Ansible 配置文件
配置文件位置与优先级
- 环境变量 ANSIBLE_CONFIG
- 当前目录
ansible.cfg
- 用户家目录
~/.ansible.cfg
- 全局
/etc/ansible/ansible.cfg
配置文件解析
主要节包括
ini
[defaults]
inventory = /etc/ansible/hosts
remote_user = root
host_key_checking = False
forks = 5
log_path = /var/log/ansible.log
[privilege_escalation]
become = True
become_method = sudo
become_user = root
示例配置文件
ini
[defaults]
remote_user = laoma
inventory = ./inventory
[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
ansible-config 命令
init
生成模板配置view
查看当前生效配置dump
输出所有配置包括默认值list
列出各项配置说明
bash
ansible-config init > ansible.cfg.example
ansible-config view
ansible-config dump
ansible-config list
localhost 连接
Ansible默认对localhost隐式使用local连接类型 忽略remote_user 并在本地执行命令
运行 AD HOC 命令
实验环境
bash
mkdir web && cd web
cat > ansible.cfg <<'EOF'
[defaults]
remote_user = laoma
inventory = ./inventory
[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOF
echo node1 > inventory
AD HOC 命令语法
bash
ansible host-pattern -m module [-a 'arguments'] [-i inventory]
host-pattern
必选 可为hostname、IP、组名或匹配字符串-m
指定模块-a
模块参数-i
指定清单文件
返回结果颜色说明
- 红色 表示执行异常 并中止剩余任务
- 绿色 表示目标已是预期状态 无需更改
- 黄色 表示状态发生更改 并设置为期望状态
常用模块一览
- 文件模块
copy
控制主机文件复制到受管节点file
设置文件属性lineinfile
确保文件中包含特定行synchronize
使用rsync同步文件
- 软件包模块
package
自动检测OS包管理器yum
管理YUM包apt
管理APT包pip
管理Python包
- 系统模块
ansible.posix.firewalld
管理firewalld端口和服务service
管理服务user
、group
管理用户组reboot
重启主机
- 网络与工具
get_url
下载文件nmcli
管理网络uri
与Web服务交互
ansible-doc 命令
bash
ansible-doc -l # 列出可用插件
ansible-doc -F # 列出插件及其源文件
ansible-doc user # 查看user模块文档
command 模块
在受管节点执行命令 不经过shell处理 不支持重定向或管道
bash
ansible node1 -m command -a 'hostname'
shell 模块
通过shell执行命令 支持管道、重定向、环境变量
bash
ansible node1 -m shell -a 'echo $SHELL'
raw 模块
绕过Python 直接在远端shell运行 适用于未安装Python的设备
bash
ansible node1 -m raw -a 'echo hello > /tmp/hello.txt'
AD HOC 命令选项映射
配置文件指令 | 命令行选项 |
---|---|
inventory | -i |
remote_user | -u |
ask_pass | -k, --ask-pass |
become | -b, --become |
become_method | --become-method |
become_user | --become-user |
aw -a 'echo hello > /tmp/hello.txt' |
### AD HOC 命令选项映射
| 配置文件指令 | 命令行选项 |
| --------------- | --------------------- |
| inventory | -i |
| remote_user | -u |
| ask_pass | -k, --ask-pass |
| become | -b, --become |
| become_method | --become-method |
| become_user | --become-user |
| become_ask_pass | -K, --ask-become-pass |