Ansible 是一个极其简单的 IT 自动化引擎,可自动执行云供应、配置管理、应用程序部署、服务内编排和许多其他 IT 需求。
Ansible主要功能是帮助运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提升运维工作效率。常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续集成、零宕机平滑升级等。
Ansible完全基于Python开发,而DevOps在国内已然是一种趋势,Python被逐步普及,运维人员自己开发工具的门槛逐步降低,得益于此,方便对Ansible二次开发。
Ansible丰富的内置模块,甚至还有专门为商业平台开发的功能模块,完全可以满足日常功能所需。
Ad-Hoc
利用ansible命令直接完成管理,主要用于临时命令使用场景
playbook
ansible脚本,主要用于大型项目场景,需要前期的规划
ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块
ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的
Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统下基于OpenSSH通信,Windows系统下基于PowerShell,管理端必须是Linux系统。
其与saltstack各有千秋,由于使用ssh通信,其安全性非常高,但其部署速度也相应较慢。
rhel镜像中默认不包含ansible的安装包,安装需要使用epel源。
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
dnf install ansible.noarch -y
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
dnf install ansible.noarch -y
ansible的相关文件存放在以下路径
配置文件: /etc/ansible/
执行文件目录: /usr/bin/
lib依赖库: /usr/lib/python2.7/site-packages/ansible/
help文件: /usr/lib/python2.7/site-packages/ansible
Ansible配置文件的优先级
# 常用配置参数 含义
#[default] 基本信息设定
inventory= 指定清单路径,支持多个文件、逗号分隔
remote_user= 在受管主机上登陆的用户名称,未指定使用当前用户
ask_pass= 是否提示输入SSH密码,如果公钥登陆设定为false
library= 库文件存放目录
local_tmp= 本机临时命令执行目录
remote_tmp= 远程主机临时py命令文件存放目录
forks= 默认并发数量
host_key_checking= 第一次连接受管主机时是否要输入yes建立host_key
sudo_user= 默认sudo用户
ask_sudo_pass= 每次在受控主机执行ansible命令时是否询问sudo密码
module_name= 默认模块,默认使用command,可以修改为shell
log_path= 日志文件路径
[privilege_escalation] 身份信息设定
become= 连接后是否自动切换用户
become_method= 设定切换用户的方式,通常用sudo
become_user= 在受管主机中切换到的用户,通常为root
become_ask_pass 是否需要为become_method提示输入密码,默认为false
默认清单是用hosts文件,如果自己创建一个清单文件,无法读取,需要使用-i参数指定清单文件查看清单。
指定配置文件的清单
在ansible.cfg文件内inventory项指定的路径下编写清单文件,书写格式与全局清单相同。
清单查看
ansible 清单中组名称 [-i 清单文件] - -list-hosts
#查看某个组列表中的清单,加上中括号的内容表示列出某个文件中的所有主机
ansible ungrouped - -list-hosts
#查看全局清单文件中,不属于任何组的主机
ansible all - -list-hosts
#查看全局清单文件中的全部主机列表
符号 | 含义 |
---|---|
* | 所有 |
: | 逻辑或 |
:& | 逻辑与 |
:! | 逻辑非 |
~ | 以关键字开头 |
~(str1 |str2) | 以条件1或条件2开头 |
ansible是以ssh的方式远程登录受控主机进行操作的。因此为了便于操作,可以配置当前用户到受控节点的指定用户(在ansible.cfg中的remote_user项指定)的ssh免密。
通常情况下不允许以root用户的方式直接进行连接,这是为了避免root用户的密码在网络中传输。
指定用户登录后,权限不足,需要配置受控节点的sudo,来实现到root用户的切换及权限。
ansilbe控制端,用户级配置文件内容为:
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub devops@node1
在受控节点配置devops用户的sudo:
vim /etc/sudoers
#visudo
ansible-doc #显示模块帮助的指令
语法格式: ansible-doc [参数] [模块]
常用参数
-l 列出可用模块
-s 显示指定模块的playbook片段
命令用法
ansible list -m 模块 -a 模块参数
常用参数
参数 | 含义 |
---|---|
- -version | 显示版本 |
-m module | 指定模块,默认为command模块 |
-v | 详细过程,-vv、-vvv更详细过程 |
- - list | 显示主机列表,也可以用- - list-hosts |
-k | 提示输入ssh连接密码,默认key认证 |
-C | 预执行检测 |
-T | 执行命令的超时时间,默认10s |
-u | 指定远程执行的用户 |
-b | 执行sudo切换身份操作 |
-become-user=USERNAME | 指定sudo用户 |
-K | 提示输入sudo密码 |
在运行完成之后,返回结果为绿色代表执行成功但并未对远程主机做出任何改变。黄色代表执行成功且对远程主机有一定更改。红色代表执行失败。
功能: 在远程主机执行命令,此模块为默认模块
chdir 执行命令前先进入到指定目录
cmd 运行命令指定
creates 如果文件存在将不运行
removes 如果文件存在在将运行
free_form 在远程主机中执行的命令,此参数不需要加
功能:和command功能类似,但并不完全相同
shell中支持通配符* ,command不支持通配符*
默认使用的执行环境为sh,加入executable模块,可以指定执行环境为bash
chdir 执行命令前先进入到指定目录
cmd 运行命令指定
creates 如果文件存在将不运行
removes 如果文件存在在将运行
free_form 在远程主机中执行的命令,此参数不需要加
executable 指定执行环境,默认为sh executable = /bin/bash
功能:在ansible主机中写好的脚本在受控主机中执行,在参数指定脚本位置,也支持多个参数模块。
ansible list -m script -a "test.sh"
功能:从ansible主机复制文件到受控主机,也可以直接根据内容生成指定文件
参数 | 含义 |
---|---|
src | 源文件 |
dest | 目的地文件 |
owner | 指定目的地文件所有人 |
group | 指定目的地文件的所有组 |
mode | 指定目的地文件权限 |
backup=yes | 当受控主机中存在文件时备份源文件 |
content | 指定文本内容直接在受控主机中生成文件 |
功能:从受控主机把文件复制到ansible主机,但不支持目录
参数 | 含义 |
---|---|
src | 受控主机的源文件 |
dest | 本机目录 |
flat | 基本名称功能,开启时只复制单独文件不复制目录 |
功能:设置文件的属性
参数 | 含义 |
---|---|
path | 指定文件名称 |
state | 指定操作状态 |
touch | 建立 |
absent | 删除 |
directory | 递归 |
link | 建立链接 |
mode | 设定权限 |
owner | 设定文件用户 |
group | 设定文件组 |
src | 源文件 |
dest | 目标文件 |
recurse=yes | 递归更改 |
作用: 压缩
常用参数 含义
path 打包目录名称
dest 声称打包文件名称
format 打包格式
owner 指定文件所属人
mode 指定文件权限
功能:解压缩
常用参数 含义
copy 默认为yes,从ansible主机复制文件到受控主机,设定为no时从受控主机中寻找src源文件
remote_src 功能同copy且相反,设定为yes表示包在受控主机,设定为no表示包在 ansible主机
src 包路径,可以使ansible主机也可以使受控主机
dest 受控主机目录
mode 加压后文件权限
功能: 管理主机名称
常用参数
name 指定主机名称
示例:
ansible list -m hostname -a "name=node1"
作用:计划任务
minute 分钟
hour 小时
day 天
month 月
weekday 周
name 任务名称
job 任务脚本或命令
disabled yes 禁用计划任务,no 启动计划任务 # 禁用时,会注释命令文件的对应内容
state absent 删除计划任务
作用:配置系统软件仓库源文件
name 指定仓库名称
baseurl 指定源路径
description 指定仓库描述
file 指定仓库文件名称
enabled 仓库是否启用
gpgcheck 仓库是否检测gpgkey
state 默认值present 建立,absent 为删除
作用:管理系统中的dnf仓库及管理软件
name 指定包
state 指定动作,present:安装;latest:更新;absent:删除,默认不删除依赖
list 列出指定信息
autoremove 删除时是否移除依赖性
disable_gpg_check 禁用gpgkey检测
enablerepo 指定安装包来源
disablerepo 禁用安装包来源
作用:管理系统服务状态
name 指定服务名称
state 指定对服务的动作
enabled 设定服务开机是否启动,yes开启启动,no开机不启动
作用:管理防火墙
zone 防火墙的域
service 服务名称
permanent 永久生效
state enabled允许;disabled拒绝
immediate 立即生效
作用:模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为 用户创建密钥对等操作
name 必须参数,用于指定要操作的用户名称
group 指定用户所在的基本组
gourps 指定用户所在的附加组
append 指定添加附加组默认值为no
shell 指定用户的默认 shell
uid 指定用户的 uid 号
comment 指定用户的注释信息
state 用于指定用户是否存在于远程主机;present:建立;absent:删除
#删除时添加remove参数,删除用户时删除用户家目录
password 指定密码,默认为明文,可使用openssl 生成加密字符串
openssl passwd -1 'testpasswd'
$1$C/3TWSA5$b4LuO9WQEDpF.ItZ8hLI01
作用:group 模块可以帮助我们管理远程主机上的组。
name 用于指定要操作的组名称
state 用于指定组的状态,present:建立;absent:删除
gid 用于指定组的gid
作用:此模块确保文件中存在特定行,或使用反向引用的正则表达式替换现有行。
path 指定要操作的文件
line 指定文本内容 直接使用时 追加在文件最后
regexp 使用正则表达式匹配对应的行。替换文本时如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换;
当删除文本时,如果有多行文本都能被匹配,那么这些行都会被删除
state state的默认值为present,当想要删除对应的文本时需要将state参数的值设置为absent
backrefs 默认值为no,如果该为yes,表示当内容无匹配规则时不对文件做任何更改,还有向后引用regexp变量信息的作用
insertafter 借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式
insertbefore 借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式
backup 否在修改文件之前对文件进行备份。
create 当要操作的文件并不存在时,是否创建对应的文件
作用:replace 模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。
path 指定要操作的文件
regexp 指定一个正则表达式,文件中与正则匹配的字符串将会被替换
replace 指定最终要替换成的字符串
backup 是否在修改文件之前对文件进行备份,最好设置为yes
作用:setup模块用于收集远程主机的一些基本信息
filter 用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息
ansible主机使用setup模块,ansible all -m setup可以看到受控主机的所有的信息,也可以指定查看某个信息
作用:调试模块,用于在调试中输出信息
msg 调试输出的消息
var 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity debug的级别(默认是0级,全部显示)