Ansible介绍

xiaolv
6
2025-11-07

一、ansible 是什么?

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远 程主机通讯的。

二、ansible 架构图

 上图中我们看到的主要模块如下:

Ansible:Ansible核心程序。 HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。 Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。 CoreModules核心模块,主要操作是通过调用核心模块来完成管理任务。 CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。 ConnectionPlugins:连接插件,Ansible和Host通信使用

三、ansible 任务执行

ansible 任务执行模式

  Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhocplaybook

  • ad-hoc模式(点对点模式) 使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。

  • playbook模式(剧本模式) 是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

ansible 执行流程

简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。

ansible 命令执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg

  2. 查找对应的主机配置文件,找到要执行的主机或者组;

  3. 加载自己对应的模块文件,如 command;

  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;

  5. 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;

  6. 给文件 +x 执行权限;

  7. 执行并返回结果;

  8. 删除临时py文件,sleep 0退出;

四、ansible 的部署和配置

(一)环境说明

ip

主机名

应用

系统版本

192.168.13.224

ansible-master

ansible管理主机

ubuntu22.04

192.168.13.225

ansible-node01

ansible被管理主机01

ubuntu22.04

192.168.13.226

ansible-node02

ansible被管理主机02

ubuntu22.04

(二)ansible-master安装Ansible

通过Apt (Ubuntu)安装最新发布版本

Ubuntu 编译版可在PPA中获得: <https://launchpad.net/~ansible/+archive/ansible>

配置PPA及安装ansible,执行如下命令:

 $ sudo apt-get install software-properties-common
 $ sudo apt-add-repository ppa:ansible/ansible
 $ sudo apt-get update
 $ sudo apt-get install ansible

在早期Ubuntu发行版中, “software-properties-common” 名为 “python-software-properties”.

也可从源码checkout中创建 Debian/Ubuntu 软件包,执行:

 $ make deb

通过Yum安装最新发布版本

通过Yum安装RPMs适用于 EPEL 6, 7, 以及仍在支持中的Fedora发行版.

托管节点的操作系统版本可以是更早的版本(如 EL5), 但必须安装 Python 2.4 或更高版本的Python.

Fedora 用户可直接安装Ansible, 但RHEL或CentOS用户,需要 配置 EPEL

 # install the epel-release RPM if needed on CentOS, RHEL, or Scientific Linux
 $ sudo yum install ansible

你也可以自己创建RPM软件包.在Ansible项目的checkout的根目录下,或是在一个tarball中,使用 make rpm 命令创建RPM软件包. 然后可分发这个软件包或是使用它来安装Ansible.在创建之前,先确定你已安装了 rpm-build, make, and python2-devel .

 $ git clone git://github.com/ansible/ansible.git
 $ cd ./ansible
 $ make rpm
 $ sudo rpm -Uvh ~/rpmbuild/ansible-*.noarch.rpm

通过 Pip 安装最新发布版本

Ansible可通过 “pip” 安装(安装和管理Python包的工具),若你还没有安装 pip,可执行如下命令安装:

 $ sudo easy_install pip

然后安装Ansible:

 $ sudo pip install ansible

如果你是在 OS X Mavericks 上安装,编译器可能或告警或报错,可通过如下设置避免这种情况:

 $ sudo CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments pip install ansible

使用 virtualenv 的读者可通过 virtualenv 安装 Ansible, 然而我们建议不用这样做,直接在全局安装 Ansible.不要使用 easy_install 直接安装 ansible.

(三)ansible 程序结构

安装目录如下(yum安装):

  配置文件目录:/etc/ansible/

  执行文件目录:/usr/bin/

  Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/

  Help文档目录:/usr/share/doc/ansible-X.X.X/

  Man文档目录:/usr/share/man/man1/

ansible配置文件查找顺序

ansible与我们其他的服务在这一点上有很大不同,这里的配置文件查找是从多个地方找的,顺序如下:

  1. 检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);

  2. ~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;

  3. /etc/ansible.cfg检查etc目录的配置文件。

(四)ansible配置文件

安装的ansible配置文件为空,范例可查看ansible/examples/ansible.cfg at stable-2.9 · ansible/ansible · GitHub

 ansible 的配置文件为/etc/ansible/ansible.cfg,ansible 有许多参数,下面我们列出一些常见的参数:

 inventory = /etc/ansible/hosts          #这个参数表示资源清单inventory文件的位置
 library = /usr/share/ansible            #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
 forks = 5                               #并发连接数,默认为5
 sudo_user = root                        #设置默认执行命令的用户
 remote_port = 22                        #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
 host_key_checking = False               #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
 timeout = 60                            #设置SSH连接的超时时间,单位为秒
 log_path = /var/log/ansible.log         #指定一个存储ansible日志的文件(默认不记录日志)

(五)ansuble主机清单 --inventory

Inventory文件通常用于定义要管理的主机的认证信息,例如ssh登录用户名、密码以及key相关信息。可以同时操作一个组的多台主机,组与主机组之间的关系都是通过inventory文件配置。配置文件路径为:/etc/ansible/hosts

基于密码连接

 # 方法一
 [webserver]
 192.168.13.225 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="xiaolv@0408"
 192.168.13.226 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="xiaolv@0408"
 ​
 # 方法二
 [webserver]
 192.168.13.22[5:6] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="xiaolv@0408"
 ​
 # 方法二 
 [webserver]
 192.168.13.22[5:6]
 [webserver:vars]
 ansible_ssh_pass="xiaolv@0408"
 ​
 ​
 # 测试
 ansible all -m ping

基于密钥连接

基于秘钥连接需要先创建公钥和私钥,并发送给被管理机器

 # master执行
 ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
 ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.13.225
 ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.13.226

(六)ansible 常用命令

ansible 命令集

/usr/bin/ansible  Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行 /usr/bin/ansible-doc  Ansible 模块功能查看工具 /usr/bin/ansible-galaxy  下载/上传优秀代码或Roles模块 的官网平台,基于网络的 /usr/bin/ansible-playbook  Ansible 定制自动化的任务集编排工具 /usr/bin/ansible-pull  Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高) /usr/bin/ansible-vault  Ansible 文件加密工具 /usr/bin/ansible-console  Ansible基于Linux Consoble界面可与用户交互的命令执行工具

其中,我们比较常用的是/usr/bin/ansible/usr/bin/ansible-playbook

ansible 命令

语法格式:

 ansible <host-pattern> [-m module_name] [-a args]
 # 范例
 # 测试连接
 ansible all -m ping
 ​
 # 执行命令
 ansible webservers -m command -a "uptime"
 ​
 # 安装软件包
 ansible webservers -m apt -a "name=nginx state=present" --become

ansible的host-pattern 匹配主机的列表

All :表示所有Inventory中的所有主机

  • ansible all -m ping

* :通配符

  • ansible “” -m ping # 其中代表的意思就是all,所有的IP地址

  • ansible 192.168.1.* -m ping # 匹配1.*的IP地址

  • ansible “*srvs” -m ping

或关系

  • ansible “websrvs:appsrvs” -m ping # 或关系,取IP地址的并集

  • ansible “192.168.1.10:192.168.1.20” -m ping

  • ansible的Host-pattern

逻辑与

  • ansible “websrvs:&dbsrvs” -m ping # 与关系,取IP地址的交集

  • 在websrvs组并且在dbsrvs组中的主机

逻辑非

  • ansible ‘websrvs:!dbsrvs’ -m ping # 在websrvs中,取dbsrvs的反

  • 在websrvs组,但不在dbsrvs组中的主机

  • 注意:此处为单引号

综合逻辑

  • ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m ping

正则表达式

  • ansible “websrvs:&dbsrvs” -m ping

  • ansible “~(web|db).*.magedu.com” -m ping


动物装饰