当前位置: 首页 > news >正文

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

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

文章目录

  • Orange的运维学习日记--41.Ansible基础入门
    • 手动执行任务与自动化执行任务
    • Ansible 与 DevOps
      • 什么是 Ansible
      • Ansible 特点
      • Ansible 概念与架构
      • Ansible Way
      • Ansible 用例
    • Ansible 部署
      • 实验环境准备
      • 控制节点
      • 受管节点
        • Linux
        • Windows
        • 网络设备
    • Ansible 基本使用
      • 清单
        • ansible 软件包中文件位置
        • 主机清单
          • 静态主机清单
            • 简单清单示例
            • 主机组
            • 组嵌套
            • 范围简写
          • 动态主机清单
        • ansible-inventory 命令
    • 管理 Ansible 配置文件
      • 配置文件位置与优先级
      • 配置文件解析
      • 示例配置文件
      • ansible-config 命令
      • localhost 连接
    • 运行 AD HOC 命令
      • 实验环境
      • AD HOC 命令语法
      • 返回结果颜色说明
      • 常用模块一览
      • ansible-doc 命令
      • command 模块
      • shell 模块
      • raw 模块
      • 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 中添加

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

useradd laoma
echo redhat | passwd --stdin laoma
echo 'laoma ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/laoma

生成SSH密钥并推送到受管节点

ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
yum install -y sshpass
for host in controller node{1..4}; dosshpass -p redhat ssh-copy-id laoma@$host
done

验证免密登录

for host in controller node{1..4}; dossh laoma@$host hostname
done

控制节点

控制节点用于安装Ansible 软件 受管节点无需安装Ansible

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 软件包中文件位置
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格式文本文件

简单清单示例
web1.example.com
web2.example.com
db1.example.com
192.0.2.42

验证

ansible --list-hosts -i inventory web1.example.com
主机组
[webservers]
web1.example.com
web2.example.com[dbservers]
db1.example.com
db2.example.com
组嵌套
[eastdc]
web1.example.com
db1.example.com[westdc]
web2.example.com
db2.example.com[dc:children]
eastdc
westdc
范围简写
# 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 以树状结构显示组关系
ansible-inventory -i inventory --graph

管理 Ansible 配置文件

配置文件位置与优先级

  1. 环境变量 ANSIBLE_CONFIG
  2. 当前目录 ansible.cfg
  3. 用户家目录 ~/.ansible.cfg
  4. 全局 /etc/ansible/ansible.cfg

配置文件解析

主要节包括

[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

示例配置文件

[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 列出各项配置说明
ansible-config init > ansible.cfg.example
ansible-config view
ansible-config dump
ansible-config list

localhost 连接

Ansible默认对localhost隐式使用local连接类型 忽略remote_user 并在本地执行命令


运行 AD HOC 命令

实验环境

mkdir web && cd webcat > ansible.cfg <<'EOF'
[defaults]
remote_user = laoma
inventory = ./inventory[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOFecho node1 > inventory

AD HOC 命令语法

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 命令

ansible-doc -l        # 列出可用插件
ansible-doc -F        # 列出插件及其源文件
ansible-doc user      # 查看user模块文档

command 模块

在受管节点执行命令 不经过shell处理 不支持重定向或管道

ansible node1 -m command -a 'hostname'

shell 模块

通过shell执行命令 支持管道、重定向、环境变量

ansible node1 -m shell -a 'echo $SHELL'

raw 模块

绕过Python 直接在远端shell运行 适用于未安装Python的设备

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 |
http://www.dtcms.com/a/327680.html

相关文章:

  • sqli-labs通关笔记-第44关 POST字符型堆叠注入(单引号闭合 手工注入+脚本注入3种方法)
  • demo 英雄热度榜 (条件筛选—高亮切换—列表渲染—日期显示)
  • Full GC 频率优化实战
  • RGWRados::get_obj_state_impl()
  • 25C机场航班调度程序(JS 100)
  • 【智能硬件】2025年儿童智能手表革命:守护隐私的科技堡垒
  • AQS的理解
  • B树索引和B+树索引有什么区别?
  • 编译 BusyBox for ARM 平台
  • 数据结构:图
  • 1、正则表达式入门
  • (LeetCode 每日一题) 2787. 将一个数字表示成幂的和的方案数(动态规划dp+01背包)
  • Python 常用的正则表达式
  • CodeRush AI 助手进驻 Visual Studio:AiGen/AiFind 亮相(五)
  • RL推理的尽头,是熵坍缩?统一SFT与强化学习的新视角
  • 零基础学Java第七讲---调试(IDEA)
  • 面试经典150题[001]:合并两个有序数组(LeetCode 88)
  • 【代码随想录day 17】 力扣 98.验证二叉搜索树
  • iis无法访问文件
  • NTP常见日志分析
  • 每日五个pyecharts可视化图表-line:从入门到精通 (4)
  • 多轮问答与指代消解
  • 测试匠谈 | AI语音合成之大模型性能优化实践
  • @JsonAnyGetter 动态表格渲染的“神”
  • 「机器学习」:金融风控贷款违约预测,天池比赛解决详细思路
  • Redis面试精讲 Day 19:Redis缓存设计模式与策略
  • 剑指offer第2版——面试题3:数组中重复的数字
  • RabbitMQ-知识技能图谱(总结篇)
  • 【时时三省】(C语言基础)建立动态链表
  • LeetCode189~191、198~214题解