Ansible部署及常用模块使用
一、前期准备
1.准备三台服务器(本次环境使用的是Rokey_linux_10)
被管理端: 192.168.199.128
管理端: 192.168.199.129 # ansible 只需要在管理端安装
被管理端: 192.168.199.130
二、修改主机名并在/etc/hosts里面配置
#192.168.199.128
hostnamectl set-hostname ansible-1
#192.168.199.129
hostnamectl set-hostname ansible
#192.168.199.130
hostnamectl set-hostname ansible-2
#三台都配置
vim /etc/hosts
192.168.199.128 ansible-1
192.168.199.129 ansible
192.168.199.130 ansible-2
三、管理端安装Ansible
#安装epel源
yum install -y epel-release
#安装Ansible
dnf install -y ansible-core
#查看是否安装成功
cd /etc/ansible/
ls #目录下有ansible.cfg hosts roles
四、编辑ansible配置
1.编辑hosts
cd /etc/hosts
vim hosts
[webservers]
ansible-1
ansible-2
#如果有db的话可以配置,填IP或者主机名
[dbservers]
#192.168.199.128
2.常用内置连接变量(inventory )
ansible_host 被控机 IP / 主机名
ansible_userSSH 登录用户名
ansible_passwordSSH 密码(不推荐生产)
ansible_portSSH 端口,默认 22
ansible_ssh_private_key_file 私钥文件路径
示例:
[webservers]
192.168.226.14 ansible_user=root ansible_port=22 ansible_ssh_private_key_file=/root/id_rsa
3.配置密钥 对验证
#在管理端操作
ssh-keygen -t rsa
ssh-copy-id root@192.168.199.128
ssh-copy-id root@192.168.199.130
五、ansible 命令行模块
格式:ansible <组名> -m <模块> -a <参数列表>
查看所有已安装模块
#按q退出
ansible-doc -l
1.command 模块
(1)作用
在远程主机执行命令,不支持管道,重定向等shell的特性,直接调用二进制程序,不经过shell 解释器
(2)列出指定模块的描述信息和操作动作
ansible-doc -s command
command:
argv: #把命令以列表形式传入,不与cmd一起用
chdir: #执行命令前,先切换到指定目录
cmd: #要执行的命令字符串
creates: #如果文件已经存在,这条任务不执行
expand_argument_vars: #默认true,自动解析 $HOME、$PATH 这类系统环境变量
free_form: #直接写命令字符串
removes: #如果文件已经存在,这条任务执行
stdin: #直接给命令传入标准输入内容
stdin_add_newline: #默认 true,会在 stdin 内容末尾自动加换行
strip_empty_ends: #默认 true,自动删掉输出 stdout/stderr 末尾多余空行
(3)一些命令使用
*#指定 ip 执行 date*
ansible 192.168.199.128 -m command -a 'date'
#指定组执行 date
ansible webservers -m command -a 'date'

#all 代表所有 hosts 主机
ansible all -m command -a 'date'
#如省略 -m 模块,则默认运行 command 模块
ansible all -a 'date'
#查看所有被管理的服务器的用户有哪些
ansible all -m command -a "chdir=/home ls ./"
#查看opt下面的1.txt
ansible all -m command -a "creates=/opt/1.txt cat 1.txt"
ansible all -m command -a "removes=/opt/1.txt cat 1.txt"

2.shell 模块
(1)作用:
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
(2)列出指定模块的描述信息和操作动作
#跟command模块的参数差不多
ansible-doc -s shell
(3)一些命令使用
批量修改密码
ansible webservers -m shell -a 'echo Xr520520@ | passwd --stdin xiang'

#查看IP地址
ansible webservers -m shell -a 'echo $(ifconfig ens160 | awk "NR==2 {print $2}") | cut -d " " -f2'
5
ansible webservers -m shell -a 'echo $(ifconfig ens160 | awk "NR==2 {print \$2}")'
3.cron 模块
(1)作用:
在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除,批量管理 Linux 定时任务
(2)列出指定模块的描述信息和操作动作
ansible-doc -s cron
cron:
backup: #true:修改 crontab 前自动备份原文件
cron_file: #单独管理 `/etc/cron.d/` 下独立定时文件*
day: #每月几号,1~31
disabled: #仅 state=present 生效;true 代表注释掉这条定时任务
env:
hour: #小时,0~23,`2` 凌晨 2 点、`*/2` 每 2 小时
insertafter:
insertbefore:
job: #定时要执行的命令,不能带换行(state=present 时必填)
minute: #分钟,0~59,`*/5` 每 5 分钟、`10` 第 10 分、`*` 每分钟
month: #月份,1~12
name: #定时任务的唯一标识 / 注释名称(必填)
special_time: #快捷内置定时(不用写分时分日月周),可选值:`hourly`每小时、`daily`每天、`weekly`每周、`monthly`每月、`reboot`开机执行
state: #`present`:确保这条定时任务存在(新增 / 修改)
#`absent`:删除这条定时任务
user: #操作哪个用户的定时任务,默认root
weekday: #星期,0 = 周日~6 = 周六
(3)一些命令的使用
#添加计划
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'
#查看计划
ansible webservers -a 'crontab -l'
#移除计划任务,假如该计划任务没有取名字,name=None即可
ansible webservers -m cron -a 'name="test crontab" state=absent'
ansible webservers -a 'crontab -l'
4.user模块
(1)作用
用户管理模块
(2)列出指定模块的描述信息和操作动作
ansible-doc -s user
comment 用户注释 / 描述
shell 指定登录 shell,
home自定义家目录路径,默认 /home/用户名
create_home默认 true,创建用户时自动生成家目录;
move_home搭配 home使用,修改用户家目录时,把旧目录文件迁移到新路径。
uid手动指定用户 UID,数字唯一。
systemtrue 创建系统用户,UID 偏小、不自动创建家目录、无登录 shell,用于进程服务(nginx/mysql)。
skeleton自定义家目录模板目录,需要 create_home=true
group指定主组(一个用户只能有一个主组)。
groups附加附属组,多个用逗号隔开 groups=wheel,nginx
append
false(默认):用户只保留 groups 里的组,清空其他附属组
true:在原有附属组基础上追加新组,不删除已有组
(3)一些命令的使用
#批量创建cyj用户
ansible webservers -m user -a 'name="cyj" state=present system="yes" uid=27 shell="/sbin/nologin" move_home=no '
#查看是否创建成功
ansible webservers -m command -a 'tail /etc/passwd'
#批量删除任务
ansible webservers -m user -a 'name="cyj" state=absent'
5.group 模块
(1)作用:
用户组管理模块:用于批量管理 Linux 用户组,对应底层命令 groupadd / groupmod / groupdel
(2)列出指定模块的描述信息和操作动作
ansible-doc -s group
name: 要操作的组名称,唯一标识
state: present:确保组存在(不存在则创建,存在则修改属性)
absent:删除该用户组
gid: 手动指定组 ID(GID),数字
system: yes 代表创建系统组
force: 仅删除组时生效(state=absent),普通情况下,如果该组是某个用户的主组,groupdel 会报错删不掉;设置 force=yes 强制删除,等同于 groupdel --force。
local: 集中认证环境(LDAP 等)专用,强制操作本地 /etc/group 本地组,使用 lgroupadd/lgroupdel,不操作远端统一账号组。
non_unique: 搭配 gid 使用,允许给多个组设置同一个 GID(GID 重复);macOS、BusyBox 不支持该参数。
(3)一些命令的使用
ansible webservers -m group -a 'name=nginx gid=27 system=yes'
ansible webservers -a 'tail /etc/group'
ansible webservers -m user -a 'name="xiang" system=yes uid=27 group=nginx'
ansible webservers -a 'tail /etc/passwd'
ansible webservers -a 'id xiang'
6.copy模块
(1)作用:用于复制指定主机文件到远程主机
(2)列出指定模块的描述信息和操作动作
ansible-doc -s copy
dest:指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容
src:指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
mode:指出复制时,目标文件的权限
owner:指出复制时,目标文件的属主
group:指出复制时,目标文件的属组
content:指出复制到目标主机上的内容,不能与src一起使用 (如果文件存在,将覆盖原有内容)
(3)一些命令使用
ansible webservers -m copy -a "src=/opt/xiang.txt dest=/opt/xiang.txt group=nginx mode=664 owner=root"
ansible webservers -a 'ls -l /opt'
ansible webservers -a 'cat /opt/xiang.txt'
ansible webservers -m copy -a 'content=xiangbi dest=/opt/xiang.txt'
ansible webservers -a 'cat /opt/xiang.txt'
7.file模块
(1)作用:创建 / 删除文件、目录、软链接,修改权限属主
(2)列出指定模块的描述信息和操作动作
ansible-doc -s file
path :指定要操作的文件 / 目录 / 软链接路径 (必填)
state: 决定你要创建 / 删除什么,最关键参数:
touch:创建空文件(不存在则新建,存在则更新时间戳)
directory:创建文件夹(不存在自动递归创建)
link:创建软链接,必须搭配 src 参数
hard:创建硬链接
absent:删除文件 / 目录 / 链接(递归删除目录里所有内容)
file:确保路径是普通文件,不存在会报错
owner:设置文件 / 目录所属用户(root、xiang 等)
group:设置文件 / 目录所属组
mode:设置权限,数字权限(644、755、777),推荐加引号 "0644" 避免进制问题
src:仅 state=link / hard 时使用:软 / 硬链接的源文件路径。
force创建软链接时使用:
force=yes:如果目标路径已存在,强制覆盖旧链接 / 文件- 默认 no,存在则报错
(3)一些命令
#创建空文件
ansible all -m file -a "path=/opt/test.txt state=touch mode=644"
#创建软链接
ansible all -m file -a "path=/opt/soft.link state=link src=/opt/test.txt force=yes"
#删除文件
ansible webservers -m file -a "path=/opt/test state=absent"
8.yum 模块
(1)作用:在远程主机上安装与卸载软件包
(2)列出指定模块的描述信息和操作动作
ansible-doc -s yum
name:(必填)指定软件包名称,支持单个包、多个包(逗号分隔)、包版本、组包。
state:控制安装 / 卸载状态
present(默认)安装软件,已存在则不操作
latest安装 / 升级到最新版本
absent卸载软件
removed等同于 absent,卸载
enablerepo:临时启用指定 yum 源仓库安装包,多个仓库逗号分隔。
disablerepo:临时禁用某个 yum 源,避免冲突。
download_only:yes:只下载安装包,不安装,包默认存 /var/cache/yum。
download_dir:搭配 download_only,自定义 rpm 下载保存目录。
exclude:升级时排除指定包,防止更新。
list只查询包信息,不安装 / 卸载,可选值:
installed:列出已安装包available:列出可安装包updates:列出可升级包
(3)一些使用命令
ansible webservers -m yum -a 'name=tree'
#安装nginx
ansible webservers -m yum -a 'name=nginx state=present'
#卸载nginx
ansible webservers -m yum -a 'name=nginx state=absent'
9.systemd 模块
(1)作用:
用于管理远程主机上的管理服务的运行状态
(2)列出指定模块的描述信息和操作动作
ansible-doc -s systemd
name:(必填)服务名称,和系统 systemctl 服务名一致,不用加 .service。示例:name=nginx、name=firewalld
masked:是否屏蔽服务(mask 后无法手动启动):
yes:mask 屏蔽服务no:unmask 解除屏蔽
enabled:控制开机是否自启:
yes:设置开机自动启动no:关闭开机自启
state:控制服务运行状态,可选值:
started:启动服务,已运行则不操作stopped:停止服务restarted:重启服务(不管当前状态,强制重启)reloaded:重载配置(不中断服务,仅加载新配置,服务必须支持 reload)
daemon_reload:yes:执行 systemctl daemon-reload,重新加载 systemd 单元配置
场景:修改了 /usr/lib/systemd/system/ 自定义服务文件后必须执行。
force:配合 masked=yes,强制屏蔽服务。
runlevel:如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动
(3)一些使用命令
#查看web服务器httpd运行状态
ansible webservers -a 'systemctl status httpd'
#启动httpd服务,设置开机自启
ansible webservers -m service -a 'enabled=yes name=httpd state=started'
#修改配置后重载服务
ansible webservers -m systemd -a "name=nginx state=reloaded daemon_reload=no"
10.setup 模块
(1)作用:
facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息
(2)列出指定模块的描述信息和操作动作
ansible-doc -s setup
filter:过滤只输出指定信息,支持通配符 *
gather_subset :采集子集(控制采集范围,提速)控制收集哪一类信息,多个用逗号分隔,常用值:
all:采集全部信息(默认)min:最小基础信息(主机名、系统版本)hardware:硬件信息(CPU、内存、磁盘)network:网卡、IP 地址virtual:虚拟化信息(物理机 / 虚拟机、云厂商)!hardware:排除硬件信息(!代表不采集)
(3)一些常用命令
ansible webservers -m setup #获取主机的facts信息
ansible dbservers -m setup -a 'filter=*ipv4' #使用filter可以筛选指定的facts信息

浙公网安备 33010602011771号