目录
引言
一、Ansible简介
(一)基本概述
(二)主要特点
二、Ansible安装及基本组件
(一)yum安装
(二)编译安装
(三)基本配置信息
1.主配置文件
2.主机清单
3.角色目录
(四)Ansible相关工具
1.ansible临时工具
2.定义主机组
3.验证
三、模块
(一)Command 模块
(二)shell模块
(三)Script模块
(四)copy模块
(五)Get_url 模块
(六)Fetch 模块
(七)File模块
(八)stat模块
(九)unarchive 模块
(十)Archive模块
(十一)Cron 模块
(十二)Yum和 Apt 模块
(十三)Service 模块
(十六)mount模块
(十四)User 模块
(十五)Group 模块
(十六)Lineinfile 模块
(十七)replace 模块
(十八)setup模块
引言
在当今快速发展的IT环境中,自动化已成为运维工作的重要组成部分。Ansible作为一款强大的IT自动化工具,凭借其简洁易用的特性、无需客户端代理的架构以及丰富的模块库,逐渐成为众多企业和开发者青睐的首选解决方案。本文将带您深入探索Ansible的魅力所在,并通过实例了解如何使用它来简化和优化日常运维任务
一、Ansible简介
(一)基本概述
Ansible 是一款开源的 IT 自动化工具,主要用于配置管理、应用部署、任务执行以及多服务器间的协调工作。它由 Michael DeHaan 在 2012 年创建,并于 2015 年被 Red Hat 公司收购,目前是 Red Hat Ansible Automation Platform 的核心组件。
(二)主要特点
Ansible 的主要特点包括:
简单易用:基于 YAML 格式的 playbook 定义任务,直观且易于理解。
无代理架构:通过 SSH 连接直接在远程主机上执行任务,无需在目标机器上安装任何代理软件或守护进程。
模块化设计:提供了大量的内置模块,覆盖了操作系统配置、网络设备管理、云计算服务操作等众多领域。用户也可以自定义模块来满足特定需求。
幂等性:许多 Ansible 模块都具有幂等性,即无论执行多少次,只要系统状态达到预期,都不会再做更改,确保了系统的稳定性。
库存管理(Inventory):Ansible 使用 inventory 文件管理要操作的目标主机列表,可以灵活地根据组(groups)和主机变量进行运维操作。
角色(Roles):为了代码复用和组织结构清晰,Ansible 提供了角色的概念,用于将一组相关的任务、文件和模板打包在一起。
动态_inventory:支持从各种源获取动态主机信息,如 EC2 API、OpenStack 或者 CMDB 系统。
安全传输:通过使用 SSH 密钥对等方式保证数据的安全传输。
扩展性强:除了丰富的官方模块库,Ansible 还有一个活跃的社区,不断开发新的模块和插件以支持更多的功能。
一键回滚:部分高级特性如 ansible-bender 支持容器镜像构建时的一键回滚。
二、Ansible安装及基本组件
使用yum安装,或使用python进行编译安装
(一)yum安装
由于本地yum源中并没有Ansible的安装包,需要先下载epel源,或其它源来进行安装
yum install epel-release.noarch -y #先下载epel源
yum install ansible -y #下载ansible
使用ansible --version命令查看版本信息
(二)编译安装
由于centos7自带的python环境版本比较低,需要进行升级
首先需要升级python以及编译安装所需环境
yum install wget zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make zlib zlib-devel libffi-devel python3-devel epel-release -y
下载源码包
wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz
yum install -y python-simplejson python-paramiko python-ecdsa python-markupsafe python-yaml python-jinja2 python-pycrypto python3-setuptools
./configure --prefix=/usr/local/python
(三)基本配置信息
配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文 件
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
1.主配置文件
打开/etc/ansible/ansible.cfg文件
[defaults]
'包含Ansible的全局默认设置,如日志文件位置、模块搜索路径、连接超时时间等'
[inventory]
'关于如何解析和管理主机清单文件的设置,比如库存插件的类型、是否允许动态库存等'
[privilege_escalation]
'与权限提升相关的设置,例如sudo或su策略、密码询问等'
[paramiko_connection]
'若使用Paramiko作为连接方式,在此定义相关参数。Paramiko是一个纯Python实现的SSHv2协议库'
[ssh_connection]
'有关通过SSH连接到远程主机的配置选项,包括控制并发连接数、压缩传输数据等'
[persistent_connection]
'关于持久连接的相关设置,这种连接可以复用已建立的SSH会话以提高执行效率'
[accelerate]
'Ansible加速器相关配置,用于在代理服务器上部署加速器以提高网络性能'
[selinux]
'与SELinux安全上下文相关的设置,确保在执行任务时对SELinux标签进行正确处理'
[colors]
'Ansible输出的颜色主题设置,便于用户在终端查看更易读的彩色输出信息'
[diff]
'针对任务执行前后差异对比的设置,启用后可在更改文件或模板时显示详细的差异内容'
主要查看一下defaults的基本配置
inventory
#指定默认的主机清单文件位置,用于定义Ansible要管理的主机列表。
library
#自定义模块库路径,如果需要使用非标准模块,可以在这里指定额外的模块存放目录。
module_utils
#定义自定义模块辅助工具(Module Utilities)的位置。
remote_tmp 和 local_tmp
#分别设置远程主机和本地主机上临时文件的存储路径。
plugin_filters_cfg
#指定插件过滤器配置文件的路径。
forks
#设置并发执行任务的最大数量,即同时控制多少台主机。
poll_interval
#设置轮询间隔时间,当Ansible等待命令或任务在远程主机上完成时,每隔多久检查一次状态。
sudo_user
#默认sudo使用的用户名,如果不指定则默认为root。
ask_sudo_pass 和 ask_pass
#控制是否在运行需要sudo或直接登录密码的任务时询问密码,默认为True。
transport
#指定连接方式,默认为smart,根据实际情况选择SSH或其他方式。
remote_port
#远程主机SSH服务的端口号,默认为22。
module_lang
#与模块执行的语言环境相关,前者指定了模块运行的语言(通常为C)
module_set_locale
#后者控制是否在执行模块时设置相应的locale。
2.主机清单
用于定义和组织Ansible要管理的远程主机列表。在这个文件中,可以按照组(groups)或单个主机的方式列出目标主机,并可为每个组或主机指定特定的变量。以下是基本的可配置参数
ansible_ssh_host
#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
ansible_ssh_user
#默认的 ssh 用户名
ansible_ssh_pass
#ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
#sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适用于1.8及以上版本)
ansible_connection
#与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用
#paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist,
#来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file
#ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type
#目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为'csh' 或 'fish'.
ansible_python_interpreter
#目标主机的python路径.适用于系统中有多个Python, 或者命令路径不是"/usr/bin/python".
3.角色目录
/etc/ansible/roles/ 是Ansible 角色(Role)的默认存放位置。Ansible 角色是一种组织和复用任务、变量、文件、模板和其他资源的标准方法,它有助于保持代码结构清晰,并在多个项目间共享配置
在 /etc/ansible/roles/ 目录下,每个子目录都代表一个角色,其结构通常如下:
├── role1
│ ├── defaults
│ │ └── main.yml # 默认变量文件
│ ├── files # 需要复制到远程主机的文件
│ ├── handlers # 定义处理程序的任务文件
│ ├── meta # 角色元数据信息,如依赖的角色列表
│ ├── tasks # 角色的任务列表
│ ├── templates # Jinja2 模板文件
│ ├── tests # 测试脚本和数据
│ ├── vars # 角色特定变量文件
│ └── README.md # 角色的文档说明
├── role2
│ ... # 类似于 role1 的结构
└── ...
(四)Ansible相关工具
/usr/bin/ansible
#主程序,临时命令执行工具
/usr/bin/ansible-doc
#查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字
/usr/bin/ansible-playbook
#定制自动化任务,编排剧本工具,相当于脚本
/usr/bin/ansible-pull
#远程执行命令的工具
/usr/bin/ansible-vault
#文件加密工具
/usr/bin/ansible-console
#基于Console界面与用户交互的执行工具
/usr/bin/ansible-galaxy
#下载/上传优秀代码或Roles模块的官网平台
1.ansible临时工具
执行一次性操作,其语法为
ansible <host-pattern> [-m module_name] [-a args]
命令 主机或者清单中的组 -m 指定模块 -a 执行的任务
选项 | 作用 |
--version | 显示版本 |
-m module | 指定模块,默认为command |
-v | 详细过程 -vv -vvv更详细 |
--list-hosts | 显示主机列表,可简写 --list |
-C, --check | 检查,并不执行 |
-T, --timeout=TIMEOUT | 执行命令的超时时间,默认10s |
-k, --ask-pass | 提示输入ssh连接密码,默认Key验证 |
-u, --user=REMOTE_USER | 执行远程执行的用户,默认root |
-b, --become | 代替旧版的sudo 切换 |
--become-user=USERNAME | 指定sudo的runas用户,默认为root |
-K, --ask-become-pass | 提示输入sudo时的口令 |
-f FORKS, --forks FORKS | 指定并发同时执行ansible任务的主机数 |
2.定义主机组
定义一个主机清单,可以对多个主机同时进行操作,在/etc/ansible/hosts文件中添加主机组
语法格式为:
[组名]
ip/域名
……
在文件末尾添加下图信息
[host]
#这个组包含了两个具体的 IP 地址:192.168.83.40 和 192.168.83.50。
#当你执行针对 [host] 组的 Ansible 命令时,这些主机都会受到影响。
[hosts]
#这个组包含了一个范围表达式:192.168.83.[45:50]。
#这是一个主机列表扩展格式,表示从 192.168.83.45 到 192.168.83.50 的一系列主机
可以使用list参数列出主机
3.验证
ansible默认使用ssh协议连接,所以需要将ssh协议作为客户端配置文件的/etc/ssh/ssh_config中第35行取消注释,将默认的ask改为no,取消公钥验证。
这里进行远程连接时还需要输入密码,且同组之中的主机密码必须相同
将ansible的主配置文件中的71行取消注释,不验证密码
Ansible 在首次连接到一个新主机时不会要求用户手动确认其 SSH 主机密钥,而是直接接受任何提供的密钥。
这可以提高自动化任务执行的速度和流程,但在安全性上有所牺牲,因为它可能导致受到中间人攻击的风险增加
建议恢复默认设置,使用ssh-keygen生成公钥验证,进行免密登录
如何使用免密登录,点击下方链接进行查看
ssh远程登录协议-CSDN博客
设置完毕后,就可以直接使用ansible工具了
ansible工具还支持通配符,条件匹配等
三、模块
Ansible 模块是 Ansible 自动化运维工具的核心组件,它们是可重用的、幂等性的代码单元,执行特定的任务并报告状态。每个模块都设计为解决一个具体的系统管理任务,例如安装软件包、管理用户账户、配置服务或处理文件系统操作。
可以使用ansible-doc命令查看支持哪些模块以及模块的详细信息
使用ansible-doc 模块名称 查看某一个模块的详细信息及 使用方法
(一)Command 模块
功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
注意:此命令不支持 $VARNAME < > | ; & 等,可以用shell模块实现
注意:此模块不具有幂等性
比如在定义的host组中所有的主机的/opt目录下,建立test文件
可以在配置文件中修改默认使用的模块
(二)shell模块
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >
注意:此模块不具有幂等性
(三)Script模块
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
注意:此模块不具有幂等性
(四)copy模块
功能:从ansible服务器主控端复制文件到远程主机
注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件
相关语句
src #代表源文件路径
dest #代表文件落地路径
owner #属主
group #属组
mode #代表权限
backup #如果复制时有同名文件会先备份再复制,只在源文件做修改后生效content #指定内容,直接生成目标文件
当文件内容修改后需要再次copy到远端,建议开启备份功能
指定内容建立文件
(五)Get_url 模块
功能: 用于将文件从http、https或ftp下载到被管理机节点上
相关语句
url #下载文件的URL,支持HTTP,HTTPS或FTP协议
dest #下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名 称,如果目标设置了名称就用目标设置的名称
owner #指定属主
group #指定属组
mode #指定权限
force #如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则 只有在目标不存在时才会下载该文件
(六)Fetch 模块
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
来自不同远程主机的文件将会被分别存放在本地对应主机名的子目录下。
(七)File模块
file模块用于处理远程主机上的文件和目录操作。它主要用于创建、删除、重命名文件或目录,并可以设置权限、所有权等属性
path #指定文件路径
state #文件状态 有:新建(touch) 删除(absent) 文件夹(directory) 连接文件(link)等
src #源文件
mode #权限
owner #属主
group #属组
recurse #递归修改目录属性
在/opt/目录下建立一个kysw.txt.文件。指定属主与属组为kysw,设置权限为755
新建目录,指定state为directory
删除文件
创建链接文件,指定路径名称为/opt/kysw-link
递归修改目录的属主与属组
ansible host -m file -a 'path=/opt/kysw.d owner=kysw group=kysw state=recurse'
(八)stat模块
stat模块用于获取远程主机上文件或目录的详细状态信息。这个模块类似于Linux命令行工具stat,它不改变目标的状态,而是返回关于指定路径的属性,包括但不限于:
文件是否存在
文件大小
所有者和组
权限模式(如:0755)
最后访问、修改和更改的时间戳
是否为符号链接以及指向的位置(如果是符号链接的话)
文件类型(常规文件、目录、符号链接等)
常用的返回值判断
exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配
(九)unarchive 模块
unarchive模块用于解压缩存档文件(如.tar、.tar.gz、.tgz、.zip等格式的文件),并将其内容展开到指定的目录。
基本参数
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
实现有两种用法:
1.将ansible主机上的压缩包传到远程主机后解压至特定目录,设置copy=yes,此为默认值,可省略
2.将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
远程主机的/mnt目录下会生成解压后的文件
解压远程主机的压缩文件
(十)Archive模块
archive模块用于将一组文件或目录打包成一个存档文件(如.tar、.tar.gz、.zip等格式),并可选择性地将结果存放在远程主机上或者本地控制节点。
(十一)Cron 模块
cron模块用于在远程主机上管理cron定时任务。该模块允许您创建、更新或删除Cron条目,这对于自动化运维工作流程非常有用,特别是在需要确保多台服务器上的定时任务一致时
支持时间:minute(分),hour(时),day(日),month(月),weekday(周)
删除任务
(十二)Yum和 Apt 模块
yum和apt模块分别用于管理基于RHEL/CentOS系列(使用Yum或DNF包管理器)以及基于Debian/Ubuntu系列(使用Apt包管理器)的Linux系统的软件包。
常用参数
name 所安装的包的名称
state present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache 强制更新yum的缓存
conf_file 指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check 是否禁止GPG checking,只用于presentor latest。
disablerepo 临时禁止使用yum库。 只用于安装或更新时。
enablerepo 临时使用的yum库。只用于安装或更新时
使用yum模块,可以在远程主机上同时安装软件
使用yum模块安装
查看远程主机
ansible host -m yum -a 'name=* state=lastest exclude=kernel*,foo*'
#升级除kernel和foo开头以外的所有包
ansible host -m yum -a 'name=httpd state=absent' #删除
(十三)Service 模块
service模块的作用是管理远程主机上的服务
常用参数
name参数 #指定需要操作的服务名称,比如 nginx。
state参数 #指定服务的状态,可用值有 started(开启)、stopped(关闭)、restarted(重启)、reloaded(重新加载配置文件)。
enabled参数 #指定是否将服务设置为开机启动项, yes表示设置为开机启动,no不设置
比如管理远程主机上刚安装的nginx服务
(十六)mount模块
mount模块用于管理远程主机上的文件系统挂载。这个模块可以挂载、卸载或重新挂载文件系统,并且能够检查当前的挂载状态
ansible host -m mount -a 'path=/mnt fstype=xfs opts=noatime state=unmounted'
#解挂载
ansible host -m mount -a 'src=192.168.83.40:/data/wordpress path=/mnt opts="_netdev" state=mounted'
#永久卸载
ansible host -m mount -a 'src=192.168.83.40:/data/wordpress path=mnt state=absent'#解除永久挂载
(十四)User 模块
user模块用于管理远程主机上的用户账户。它可以创建、修改或删除用户,以及设置用户的密码、SSH密钥、sudo权限等属性。
comment #用户的描述信息
createhome #是否创建家目录
force #在使用state=absent时, 行为与userdel –force一致.
group #指定基本组
groups #指定附加组,如果指定为(groups=)表示删除所有组
home #指定用户家目录
move_home #如果设置为home=时, 试图将用户主目录移动到指定的目录
name #指定用户名
non_unique #该选项允许改变非唯一的用户ID值
password #指定用户密码,使用 SHA512 hash
remove #在使用state=absent时, 行为是与userdel –remove一致
shell #指定默认shell
state #设置帐号状态,不指定为创建,指定值为absent表示删除
system #当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid #指定用户的uid
update_ password
always 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always
on_create 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定
示例:
(十五)Group 模块
group 模块用于在远程主机上管理用户组。这个模块可以创建、更新或删除系统中的用户组
查看组文件
删除组
(十六)Lineinfile 模块
lineinfile 模块用于管理远程主机上的文本文件,并确保该文件包含或不包含特定的一行内容。这个模块常用来修改配置文件,确保某个配置项的存在、更新或删除
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
常用关键字
path #指定要操作的文件
regexp #使用正则表达式匹配对应的行
line #修改为新的内容
insertafter #将文本插入到“指定的行”之后
insertbefore #将文本插入到“指定的行”之前
state #删除对应的文本时,需要state=absent
backrefs #1.支持后向引用、2.当未匹配到内容则不操作文件
backup #是否在修改文件之前对文件进行备份
create #当要操作的文件并不存在时,是否创建对应的文件
比如:使用ansible将所有远程主机的selinux设置为默认关闭状态
删除文件中指定的内容
(十七)replace 模块
replace 模块用于查找并替换远程主机上的文本文件中的指定内容。这个模块不同于 lineinfile 模块,它根据正则表达式进行查找和替换,可以处理多行匹配的情况
path # 文件路径
regexp # 要被替换的正则表达式模式
replace # 替换为的新内容
backup # 可选参数,如果设置为yes,则在修改文件前创建一个备份
将selinux配置文件中的disabled修改为enforcing
(十八)setup模块
setup模块用于收集远程主机的信息。当执行 ansible <hostname> 或 ansible-playbook -i inventory_file playbook.yml(其中没有明确指定执行的模块)时,Ansible 默认会运行 setup 模块来获取目标主机的基本信息。
这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度
在host组中只有两台机器,就达到1664行,如果主机较多,可能会影响本地主机的运行,可以使用filter参数来指定查看远端主机信息
ansible [主机组] -m setup -a "fiter=参数"
例如查看远端主机的主机名
ansible_all_ipv4_addresse | 仅显示ipv4的信息 |
ansible_devices | 仅显示磁盘设备信息 |
ansible_distribution | 显示是什么系统,例:centos,suse等 |
ansible_distribution_version | 仅显示系统版本 |
ansible_machine | 显示系统类型,例:32位,还是64位 |
ansible_ethO | 仅显示eth0的信息 |
ansible_hostname | 仅显示主机名 |
ansible_kernel | 仅显示内核版本 |
ansible_lvm | 显示lvm相关信息 |
ansible_memtotal_mb | 显示系统总内存 |
ansible_memfree_mb | 显示可用系统内存 |
ansible_memory_mb | 详细显示内存情况 |
ansible_swaptotal_mb | 显示总的swap内存 |
ansible_swapfree_mb | 显示swap内存的可用内存 |
ansible_mounts | 显示系统磁盘挂载情况 |
ansible_processor | 显示cpu个数(具体显示每个cpu的型号) |
ansible_processor_vcpus | 显示cpu个数(只显示总的个数) |
ansible_python_version | 显示python版本 |
所收集的信息会被存储在变量中,这些变量可以在后续的任务中作为条件判断或者动态生成配置文件内容的基础