Orange的运维学习日记--41.Ansible基础入门

Orange的运维学习日记--41.Ansible基础入门

文章目录

手动执行任务与自动化执行任务

手动执行任务会容易遗漏某个步骤或错误地执行某个步骤 步骤是否正确或达到预期结果的验证通常有限

管理大量服务器时易出现环境差异 增加维护难度并带来错误或不稳定性

自动化执行任务通过标准化快速且正确地部署和配置所有系统

自动化完成日常重复性任务 让团队专注于更重要的事情

更快速地交付应用

良好的自动化系统支持基础架构即代码 方法使用机器可读的自动化语言来定义和描述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 配置文件

配置文件位置与优先级

  1. 环境变量 ANSIBLE_CONFIG
  2. 当前目录 ansible.cfg
  3. 用户家目录 ~/.ansible.cfg
  4. 全局 /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 管理服务
    • usergroup 管理用户组
    • 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 |
相关推荐
CIb0la2 小时前
kali linux 2025.2安装WPS并设置无报错的详细步骤
linux·运维·wps
醉方休3 小时前
Node.js 精选:50 款文件处理与开发环境工具库
linux·运维·node.js
future14123 小时前
串口通信学习
学习
sssammmm4 小时前
AI入门学习--如何写好prompt?
人工智能·学习·prompt
代码老y4 小时前
从裸机到云原生:Linux 操作系统实战进阶的“四维跃迁”
linux·运维·云原生
菜菜子爱学习4 小时前
Nginx学习笔记(二)——环境准备(VMware CentOS版)
笔记·学习·nginx·centos·运维开发
CMCST4 小时前
CentOS 7.9 升级 GLibc 2.34
linux·运维·centos
IT成长日记5 小时前
【自动化运维神器Ansible】playbook案例解析:Tags组件实现任务选择性执行
运维·自动化·ansible·playbook·tags
IT成长日记5 小时前
【自动化运维神器Ansible】playbook实践示例:HTTPD安装与卸载全流程解析
运维·自动化·ansible·playbook·httpd·案例解析