01-Ansible 自动化介绍与使用

发布于:2025-08-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

Ansible 介绍与基本使用

01-Ansible 自动化介绍

Ansible 自动化介绍

咱们可以把 Ansible 想象成一位 “超级自动化管家”,专门帮你打理一群服务器的各种琐事,而且它还有几个特别厉害的 “超能力”:

  • “隔空施法” 不装插件:别的管家要在每个服务器上装个 “对讲机” 才能指挥,Ansible 不用 —— 它靠服务器本身就有的 SSH(就像通用钥匙)远程操作,服务器上不用额外装任何东西,拿来就能用,特别省心。
  • “剧本驱动” 按章办事:你想让服务器做什么(比如装软件、改配置、启动服务),不用对着每个服务器重复喊命令,而是写一份 “剧本”(Ansible 的 Playbook),把步骤一条条列清楚。比如 “先给所有服务器装个 nginx,再把配置文件替换成这个,最后重启服务”,Ansible 会拿着剧本,自动跑到每台服务器上按顺序执行,不会漏也不会错。
  • “认亲能力” 精准定位:你有 100 台服务器,有的是 web 服务器,有的是数据库服务器,Ansible 能通过 “inventory”(主机清单)给它们分组贴标签。比如在剧本里写 “只对 web 组的服务器执行操作”,它就会乖乖只找这些 “亲戚” 干活,不会搞错对象。
  • “状态检查” 智能纠错:比如你让它 “确保 nginx 服务是启动的”,它不会不管三七二十一先重启一遍,而是先检查当前状态 —— 如果已经启动了,就啥也不做;如果没启动,才会启动。这样既高效又不会瞎折腾。
什么是 ANSIBLE?

Ansible is a simple automation language,通过Playbooks描述和配置IT基础架构。

Ansible可以管理强大的自动化任务,适用于不同的生产环境。同时,Ansible对于新用户来说,也可以很快的上手运用到生产环境。

使用案例:

  • OpenStack 搭建和维护
  • OpenShift 搭建和维护
  • ceph 搭建和维护
Ansible 特点
  • 简单:Ansible Playbooks 是一个人们非常容易查阅,理解和更改的文本文件,用户不需要具备特定的代码编写技能。

  • 功能强大:可以使用Ansible部署应用,例如配置管理,工作流自动化,网络自动化。还可用于编排整个应用生命周期。

  • 无代理:Ansible 是一个无代理的架构,通过OpenSSH或者WinRM连接到hosts,并执行任务,推送小的程序(Ansible modules)到这些主机上。这些程序用于设置系统到预期状态。在Ansible执行完成后,任何之前推送的模块,都会被删除。Ansible可以随时使用,因为被管理主机上不需要配置特定代理。正是因为这点,Ansible 才更加高效和安全。

  • 跨平台支持:可以管理Linux、UNIX、windows 和网络设备。

  • 非常准确地描述应用:Ansible Playbook使用YAML格式描述生产环境。

  • 可以通过版本控制管理:Ansible Playbooks和projects是纯文本格式,可以当作源码存放在版本控制系统中。

  • 非常容易与其他系统集成: HP SA,Puppet,Jenkins,红帽卫星服务器等。

Ansible 概念和架构

简单说,Ansible 就像一个不用你盯着、会读剧本、能精准干活、还会自己检查的 “自动化保姆”,帮你搞定服务器集群的各种重复劳动,让你从 “一台台手动操作” 解放出来,专注于写好 “剧本” 就行~

在这里插入图片描述

可以把这张图想象成 “Ansible 自动化工厂的工作流程图” ,用生活化的场景拆解每个模块,理解会更轻松:

1. 左侧:“需求发起方”

  • USERS(用户):你和同事们,是想让服务器干活的 “包工头” ,负责想清楚要做什么(比如 “给所有服务器装监控软件”“改数据库配置” )。
  • ANSIBLE PLAYBOOK(剧本文件):你写的 “施工说明书” ,把要做的事拆成具体步骤(比如 “先检查系统版本→再装软件包→最后启动服务” ),相当于给 Ansible 发的 “干活清单”。
  • PUBLIC/PRIVATE CLOUD(公有 / 私有云):服务器可能存在的 “大仓库” ,不管是 AWS、阿里云(公有云),还是公司自己建的机房(私有云),Ansible 都能从这里找服务器。
  • CMDB(配置管理数据库):额外的 “服务器档案库” ,如果公司有统一记录服务器信息的地方(比如资产系统、配置库),Ansible 可以从这里同步服务器数据,不用你手动列清单。

2. 中间:“Ansible 自动化工厂”

ANSIBLE AUTOMATION ENGINE(核心引擎):整个 “自动化工厂” 的心脏,所有逻辑都在这处理,负责把你的需求(剧本)变成实际操作,让服务器听话干活。

里面的小模块,像工厂里的 “不同车间”:

  • INVENTORY(主机清单):“服务器花名册” ,负责记录哪些服务器要干活(比如把 100 台服务器分成 “web 组”“数据库组” ),Ansible 会根据这个名单,精准找到要操作的目标。
  • CLI(命令行界面):你和工厂沟通的 “窗口” ,如果不想写复杂剧本,也能直接在这里敲命令(比如 “帮我重启所有 web 服务器的 nginx” ),让 Ansible 执行简单任务。
  • MODULES(功能模块):工厂里的 “工具车间” ,每个模块是一个 “现成工具” ,比如有专门 “装软件” 的模块、“改配置文件” 的模块、“启动服务” 的模块……Ansible 会根据剧本,自动选对应的工具干活,不用你操心底层命令。
  • PLUGINS(插件):工厂里的 “辅助小工具” ,用来优化流程(比如 “加密传输敏感信息”“自定义任务逻辑” ),让自动化更灵活、更安全。

3. 右侧:“干活的目标”

  • HOSTS(服务器主机):实际要操作的 “工人” ,可能是物理机、虚拟机,Ansible 会拿着剧本 / 命令,远程登录这些主机,帮你执行任务(比如装软件、改配置)。
  • NETWORK DEVICES(网络设备):额外的 “网络工人” ,如果你的任务涉及路由器、交换机(比如 “改防火墙规则”“配置 VPN” ),Ansible 也能通过模块管理它们,把网络设备当服务器一样自动化操作。
  • PUBLIC/PRIVATE CLOUD(公有 / 私有云):呼应左侧,说明这些服务器 / 网络设备可能存在云端,Ansible 能跨云管理。

4. 整体流程:一句话总结

你(用户)写好 “施工说明书”(Playbook),或者直接通过命令行(CLI)下指令 → 交给 Ansible 工厂(核心引擎)→ 工厂先看 “花名册”(Inventory)找到目标服务器 → 用 “工具车间”(Modules)选对应功能 → 结合 “辅助插件”(Plugins)优化流程 → 最后跑到服务器(HOSTS)上,按剧本 / 命令干活!

大白话概括:你写个 “干活剧本”,Ansible 工厂拿着 “工具” 和 “服务器名单”,自动找到目标服务器 / 网络设备,帮你远程执行任务,不管这些设备在公有云、私有云还是本地机房~

Ansible 用例
  • 配置管理:集中化配置文件管理和部署是Ansible的常见用例,很多高级用户也是通过这种方式了解Ansible自动化平台。
  • 应用部署:通过Ansible定义应用,以及使用红帽Ansible Tower管理部署时,各团队可以更加有效地管理从开发到生产的整个应用生命周期。
  • 工作流管理:Ansible 和红帽Ansible Tower有助于简化调配系统的流程,不论您是要PXE引导和kickstart安装裸机恢复服务器或虚拟机,还是从模板创建虚拟机或云实例。
  • 持续交付:创建CI/CD管道需要多个团队的协调和参与。如果没有组织内人人可用的简单自动化平台,就无法实现这个目标。Ansible Playbook让您的应用可以在整个生命周期内得到正确部署(和管理)
  • 安全性和合规性:当您在Ansible Playbook中定义安全策略时,也可以将扫描和修复整站安全策略集成到其他自动化流程中。确保安全应该是您所有部署中不可或缺的组成部分,而不是事后才去考虑的部分。
  • 编排:仅配置本身不足以定义您的环境,您还需定义多个配置间就应如何交互,并确保以整体的方式管理各类分散资源

Ansible 部署

准备实验环境

实验环境 /etc/hosts

10.1.8.10 controller.yy.cloud controller
10.1.8.11 node1.yy.cloud node1
10.1.8.12 node2.yy.cloud node2
10.1.8.13 node3.yy.cloud node3
10.1.8.14 node4.yy.cloud node4

配置控制节点 yy 用户使用yy用户免密登录所有节点,并免提sudo提权执行任何命令。

# 所有节点配置/etc/hosts
[root@all-node ~]# cat >> /etc/hosts <<EOF

################# ansible #################
10.1.8.10 controller.yy.cloud controller
10.1.8.11 node1.yy.cloud node1
10.1.8.12 node2.yy.cloud node2
10.1.8.13 node3.yy.cloud node3
10.1.8.14 node4.yy.cloud node4
EOF

# 所有节点添加用户
[root@all-node ~]# useradd yy
[root@all-node ~]# echo redhat | passwd --stdin yy

# 所有节点,配置免密提权
[root@all-node ~]# echo 'yy ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/yy

# 创建密钥对
[yy@centos7 ~]$ [ -d ~/.ssh ] || mkdir -m 700 .ssh
[yy@centos7 ~]$ ssh-keygen -t rsa -f .ssh/id_rsa -N ''

# 推送公钥到目标主机
[yy@centos7 ~]$ sudo yum install -y sshpass
[yy@centos7 ~]$ for host in controller node{1..4}
do 
  sshpass -p 123 ssh-copy-id yy@$host
done

# 验证免密登录
[yy@centos7 ~]$ for host in controller node{1..4}
do 
  ssh yy@$host hostname
done

02-Ansible 基本使用

Ansible 清单

主机清单

Inventory 定义Ansible将要管理的一批主机。这些主机也可以分配到组中,以进行集中管理 组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。

通过以下方式定义主机清单:

  • **静态主机清单:**以文本文件的方式来定义。
  • **动态主机清单:**使用外部信息提供程序通过脚本或其他程序来自动生成。目的是从启动环境中获取主机清单,例如openstack、kubernetes、zabbix等。
静态主机清单

主机清单支持多种格式,例如ini、yaml、脚本等。

本次课程使用 ini 格式。

最简单的静态清单

受管节点的主机名或IP地址的列表,每行一个。

示例:

[yy@controller ~ 14:01:22]$ cat inventory 
controller
node1
node2
node3
node4


#验证清单中是否有相应主机
[yy@controller ~ 14:05:02]$ ansible -i ./inventory --list-hosts all
  hosts (5):
    controller
    node1
    node2
    node3
    node4
[yy@controller ~ 14:08:08]$ ansible -i ./inventory --list-hosts node3
  hosts (1):
    node3

#查看清单中所有id
[yy@controller ~ 13:58:50]$ ansible all -i inventory -a id
node3 | CHANGED | rc=0 >>
uid=1000(yy) gid=1000(yy)=1000(yy),10(wheel)
node4 | CHANGED | rc=0 >>
uid=1000(yy) gid=1000(yy)=1000(yy),10(wheel)
node1 | CHANGED | rc=0 >>
uid=1000(yy) gid=1000(yy)=1000(yy),10(wheel)
node2 | CHANGED | rc=0 >>
uid=1000(yy) gid=1000(yy)=1000(yy),10(wheel)
controller | CHANGED | rc=0 >>
uid=1000(yy) gid=1000(yy)=1000(yy),10(wheel)
[yy@controller ~ 14:00:14]$ ansible node1 -i inventory -a idnode1 | CHANGED | rc=0 >>
uid=1000(yy) gid=1000(yy)=1000(yy),10(wheel)
[yy@controller ~ 14:00:43]$ ansible node1 -i ./inventory -m command -a id
node1 | CHANGED | rc=0 >>
uid=1000(yy) gid=1000(yy)=1000(yy),10(wheel)


#在所有目标主机上安装 vsftpd 服务
[yy@controller ~ 14:02:20]$ ansible all -i ./inventory -m yum -a 'name=vsftpd state=present' -b
#这条 Ansible 命令用于在所有目标主机上安装 vsftpd 服务,各参数含义如下:

ansible all:对 inventory 中所有主机执行操作
-i ./inventory:指定当前目录下的 inventory 文件作为主机清单
-m yum:使用 yum 模块(适用于 CentOS/RHEL 等系统的包管理)
-a 'name=vsftpd state=present':模块参数,指定安装 vsftpd 包(state=present 表示确保包存在)
-b:启用 become(提权),默认使用 sudo 获取管理员权限
主机组

还可以将受管节点组织为主机组。通过主机组,更加有效地对一系列系统运行Ansible。

格式:

[yy@controller ~ 14:11:43]$ cat inventory 
[controllers]
controller

[nodes]
node1
node2
node3
node4

#查看controllers组
[yy@controller ~ 14:11:20]$ ansible -i ./inventory --list-hosts controllers
  hosts (1):
    controller
    
#查看nodes组
[yy@controller ~ 14:11:37]$ ansible -i ./inventory --list-hosts nodes
  hosts (4):
    node1
    node2
    node3
    node4

有两个组总是存在的:

  • all:包含inventory中所有主机。
  • ungrouped:inventory中列出的,但不属于任何组的主机
主机组嵌套

一个主机组还可以属于另外一个主机组。

范围简写

通过指定主机名称或IP地址的范围来简化Ansible主机清单。您可以指定数字或字母范围。

语法:[start:end]

动态主机清单

使用外部数据提供的信息动态生成Ansible清单信

ansible-inventory 命令

通过不同的格式查看清单文件。

示例清单:

app1.example.com

[webservers]
web1.example.com
web2.example.com
192.168.3.7

[dbservers]
db1.example.com
db2.example.com
192.0.2.42

[eastdc]
web1.example.com
db1.example.com

[westdc]
web2.example.com
db2.example.com

[dc:children]
eastdc
westdc
#树形结构显示
[yy@controller ~ 14:25:16]$ ansible-inventory -i inventory --graph
@all:
  |--@dbservers:
  |  |--192.0.2.42
  |  |--db1.example.com
  |  |--db2.example.com
  |--@dc:
  |  |--@eastdc:
  |  |  |--db1.example.com
  |  |  |--web1.example.com
  |  |--@westdc:
  |  |  |--db2.example.com
  |  |  |--web2.example.com
  |--@ungrouped:
  |  |--app1.example.com
  |--@webservers:
  |  |--192.168.3.7
  |  |--web1.example.com
  |  |--web2.example.com
  


管理 ANSIBLE 配置文件

配置文件位置和优先级
  1. 环境变量 ANSIBLE_CONFIG
  2. ./ansible.cfg,当前位置中的 ansible.cfg,当前位置一般是项目目录。
  3. ~/.ansible.cfg
  4. /etc/ansible/ansible.cfg

从上到下,优先级越来越低。

建议:在当前目录下定义ansible.cfg文件。

验证优先级

#环境准备
[yy@controller ~ 14:30:37]$ mkdir web && cd web

#查看ansible命令当前使用的配置文件
[yy@controller web 14:57:29]$ ansible --version | grep 'config file'
  config file = /etc/ansible/ansible.cfg
[yy@controller web 14:58:09]$ touch ~/.ansible.cfg
[yy@controller web 14:59:06]$ ansible --version | grep 'config file'
  config file = /home/yy/.ansible.cfg
[yy@controller web 14:59:10]$ touch ansible.cfg
[yy@controller web 14:59:30]$ ansible --version | grep 'config file'
  config file = /home/yy/web/ansible.cfg
[yy@controller web 15:01:17]$ export ANSIBLE_CONFIG=/opt/ansible.cfg
[yy@controller web 15:02:26]$ sudo touch /opt/ansible.cfg
[yy@controller web 15:02:33]$ ansible --version | grep 'config file'
  config file = /opt/ansible.cfg
配置文件解析

ansible 默认配置文件 /etc/ansible/ansible.cfg。

Ansible 配置文件包括以下部分:

[yy@controller ~ 15:10:03]$grep "^\[" /etc/ansible/ansible.cfg
[defaults]
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

配置文件

指定指定当前目录下的 inventory 文件作为主机清单

[yy@controller ~ 15:12:08]$ mv inventory web/
[yy@controller ~ 15:12:13]$ cd web/
[yy@controller web 15:12:20]$ cat ansible.cfg
[yy@controller web 15:12:33]$ vim ansible.cfg
[yy@controller web 15:15:12]$ cat ansible.cfg
[defaults]
inventory =./inventory
[yy@controller web 15:15:13]$ ansible all --list-hosts
  hosts (7):
    app1.example.com
    web1.example.com
    web2.example.com
    192.168.3.7
    db1.example.com
    db2.example.com
    192.0.2.42

移走私钥配置文件导致不能正常用ansible执行命令

加上ask_pass = True后输入密码能正常使用

[yy@controller web 15:23:36]$ mv ~/.ssh/id_rsa{,.bak}
[yy@controller web 15:31:56]$ ssh node1 hostname
yy@node1's password: 
node1.yy.cloud
[yy@controller web 15:32:10]$ ansible node1 -a hostname
node1 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}

#在配置文件中加入一行
[yy@controller web 15:34:22]$ vim ansible.cfg
ask_pass      = True

#输入密码能正常使用
[yy@controller web 15:32:30]$ ansible node1 -a hostname
SSH password: 
node1 | CHANGED | rc=0 >>
node1.yy.cloud

做提权处理

[yy@controller web 15:48:33]$ ansible node1 -m yum -a 'name=httpd state=present'
node1 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "changes": {
        "installed": [
            "httpd"
        ]
    }, 
    "msg": "You need to be root to perform this command.\n", 
    "rc": 1, 
    "results": [
        "Loaded plugins: fastestmirror\n"
    ]
}
#在配置文件中做提权处理
[yy@controller web 15:59:12]$ vim ansible.cfg
[privilege_escalation]
become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
[yy@controller web 15:48:33]$ ansible node1 -m yum -a 'name=httpd state=present'
#提权后能成功下载
ansible-config 命令

用于分析ansible命令的配置。

#查看配置文件信息
[yy@controller web 16:00:13]$ ansible-config view
[defaults]
inventory =./inventory
#ask_pass      = True
remote_user = yy

[privilege_escalation]
become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

#查看生效的配置文件,包括所有默认值
[yy@controller web 16:15:23]$ ansible-config dump
ACTION_WARNINGS(default) = True
AGNOSTIC_BECOME_PROMPT(default) = True
ALLOW_WORLD_READABLE_TMPFILES(default) = False
ANSIBLE_CONNECTION_PATH(default) = None
ANSIBLE_COW_PATH(default) = None
ANSIBLE_COW_SELECTION(default) = default
ANSIBLE_COW_WHITELIST(default) = ['bud-frogs', 'bunny', 'c
ANSIBLE_FORCE_COLOR(default) = False
ANSIBLE_NOCOLOR(default) = False
ANSIBLE_NOCOWS(default) = False
ANSIBLE_PIPELINING(default) = False

#查看所有配置参数用途,配置位置等。
[yy@controller web 16:17:58]$ ansible-config list
ACTION_WARNINGS:
  default: true
  description: [By default Ansible will issue a warning wh
      action (module or action plugin), These warnings can
      this setting to False.]
  env:
  - {name: ANSIBLE_ACTION_WARNINGS}
  ini:
  - {key: action_warnings, section: defaults}
  name: Toggle action warnings
  type: boolean
localhost 连接

默认Ansible连接到受管主机的协议为 smart (通常采用最有效的方式 - SSH)。如本地清单中并未指定localhost,Ansible会隐式设置localhost,并使用local连接类型连接localhost。

  • local连接类型会忽略remote_user的设置,并且直接在本地系统上运行命令。(remote_user 不生效)
  • 如果使用了特权提升,此时ansible将会在运行sudo时使用运行Ansible命令的账户的身份进行提权,而非remote_user所指定的账户。

更改 localhost 连接方式:清单中包涵 localhost。

运行 AD HOC 命令

ansible AD HOC 命令

命令作用

  • 快速执行单个Ansible任务,而不需要将它保存下来供以后再次运行。它们是简单的在线操作,无需编写playbook即可运行。

  • **快速测试和更改很有用。**例如,您可以使用临时命令确保一组服务器上的/ etc/hosts文件中存在某一特定的行。您可以使用另一个临时命令在许多不同的计算机上高效重启一项服务,或者确保特定的软件包为最新版本。

单次命令:一次性

脚本:重复使用

命令语法

ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
  • host-pattern,是inventory中定义的主机或主机组,可以为ip、hostname、inventory中的group组名、具有“,”或“*”或“:”等特殊字符的匹配型字符串,是必选项。
  • -m module,module是一个小程序,用于实现具体任务。
  • -a ‘module arguments’,是模块的参数。
  • -i inventory,指定inventory文件。

命令执行结果颜色说明

Ansible的返回结果都非常友好,用3种颜色来表示执行结果:

  • 红色:表示执行过程有异常,一般会中止剩余所有的任务。
  • 绿色:表示目标主机已经是预期状态,不需要更改 。
  • 黄色:表示命令执行结束后目标有状态变化,并设置为预期状态,所有任务均正常执行。

ansible的特性:幂等性(多次执行效果一致)

Ansible 部分模块

Ansible 模块存放位置:/usr/lib/python*/site-packages/ansible

  • 文件模块
    • copy: 将控制主机上的文件复制到受管节点,类似于scp
    • file: 设置文件的权限和其他属性
    • lineinfile: 确保特定行是否在文件中
    • synchronize: 使用 rsync 将控制主机上的文件同步到受管节点
  • 软件包模块
    • package: 自动检测操作系统软件包管理器
    • yum: 使用 YUM 软件包管理器管理软件包
    • apt: 使用 APT 软件包管理器管理软件包
    • gem: 管理 Rubygem
    • pip: 从 PyPI 管理 Python 软件包
  • 系统模块
    • firewalld:使用firewalld管理任意端口和服务
    • reboot: 重新启动计算机
    • service: 管理服务
    • user、group: 管理用户和组帐户
  • NetTools模块
    • get_url: 通过HTTP、HTTPS或FTP下载文件
    • nmcli: 管理网络
    • uri: 与 Web 服务交互
command 模块

command 模块允许管理员在受管节点的命令行中运行任意命令。要运行的命令通过-a选项指定为该模块的参数。

说明:

  • command 模块执行的远程命令不受受管节点上的shell处理,无法访问shell环境变量,也不能执行重定向和传送等shell操作。
  • 如果临时命令没有指定模块,Ansible默认使用command模块。
shell 模块

shell模块允许您将要执行的命令作为参数传递给该模块。 Ansible随后对受管节点远程执行该命令。与command模块不同的是, 这些命令将通过受管节点上的shell进行处理。因此,可以访问shell环境变量,也可使用重定向和管道等shell操作。

ansible AD HOC 命令选项

临时命令选项优先级高于配置文件中配置。

配置文件指令 命令行选项
inventory -i
remote_user -u
ask_pass -k, --ask-pass
become –become, -b
become_method –become_method
become_user –become-user
become_ask_pass –ask-become-pass, -K

shell 模块

shell模块允许您将要执行的命令作为参数传递给该模块。 Ansible随后对受管节点远程执行该命令。与command模块不同的是, 这些命令将通过受管节点上的shell进行处理。因此,可以访问shell环境变量,也可使用重定向和管道等shell操作。

ansible AD HOC 命令选项

临时命令选项优先级高于配置文件中配置。

配置文件指令 命令行选项
inventory -i
remote_user -u
ask_pass -k, --ask-pass
become –become, -b
become_method –become_method
become_user –become-user
become_ask_pass –ask-become-pass, -K

网站公告

今日签到

点亮在社区的每一天
去签到