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 |
相关推荐
2302_799525743 分钟前
【Hadoop】Hadoop集群安装中出现的问题
linux·hadoop
MoloXuanhe8 分钟前
[TryHackMe]Wordpress: CVE-2021-29447(wp漏洞利用-SSRF+WpGetShell)
运维·网络·安全·tryhackme·thm
刘一说8 分钟前
Linux调试命令速查:Java/微服务必备
java·linux·微服务
枫の准大一19 分钟前
【Linux游记】基础指令篇
linux
wanhengidc21 分钟前
网页版的云手机都有哪些优势?
运维·网络·安全·游戏·智能手机
ypf520830 分钟前
OrbStack 配置国内镜像加速
linux
Hello.Reader36 分钟前
一文通关 Proto3完整语法与工程实践
java·linux·数据库·proto3
Hello.Reader41 分钟前
一文吃透 Protobuf “Editions” 模式从概念、语法到迁移与实战
linux·服务器·网络·protobuf·editions
陌上花开缓缓归以1 小时前
linux ubi文件系统
linux
g_i_a_o_giao1 小时前
Android8 binder源码学习分析笔记(一)
android·java·笔记·学习·binder·安卓源码分析