Ansible管理服务介绍
01.提高工作的效率﹐重复性完成工作︰代码上线/ web服务apache业务转换为nginx
02.提高工作准确度部署nginx nfs backup
03.减少维护的成本批量管理100台数据库服务器1个人
04.减少重复性工作实习生/初级运维ansible命令
2)批量管理服务部署
`第一个历程`:安装服务程序
[root@m01 ~]# yum -y install ansible
`第二个历程`:编写配置文件hosts
[root@m01 ~]# tail -4 /etc/ansible/hosts
172.16.1.98
172.16.1.99
172.16.1.100
"测试":
[root@m01 ~]# ansible all -m command -a "ip a s ens33"
172.16.1.98 | CHANGED | rc=0 >>
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:51:08 brd ff:ff:ff:ff:ff:ff
inet 192.168.139.98/24 brd 192.168.139.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::d5dd:30fa:929a:1eef/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::878d:767e:2bfe:1831/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::3d6a:871a:22eb:bcac/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
172.16.1.99 | CHANGED | rc=0 >>
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:34:db:d2 brd ff:ff:ff:ff:ff:ff
inet 192.168.139.99/24 brd 192.168.139.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::d5dd:30fa:929a:1eef/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::878d:767e:2bfe:1831/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::3d6a:871a:22eb:bcac/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
172.16.1.100 | CHANGED | rc=0 >>
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:d6:ad:2f brd ff:ff:ff:ff:ff:ff
inet 192.168.139.100/24 brd 192.168.139.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::878d:767e:2bfe:1831/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::d5dd:30fa:929a:1eef/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2.1)ansible管理命令应用
#·主机清单配置文件etc/ansible/hosts
#·主机清单配置文件etc/ansible/hosts#·批量管理命令使用ansible 或 ansible-playbook·如何编写剧本文件
2.2)ansible命令使用
#语法格式:ansible 管理主机信息 -m 模块信息 -a 模块指令信息
# 1 2 3
1:`管理主机信息`
方法一:设置为all:对主机清单中所有主机进行管理
方法二:设置具体IP地址:对指定主机进行管理
方法三:设置多个IP地址:对多个指定主机进行管理
方法四:设置主机组名称:对主机组进行管理
[root@m01 ~]# tail -5 /etc/ansible/hosts
[stangj]
172.16.1.98
172.16.1.99
172.16.1.100
[root@m01 ~]# ansible stangj -m command -a "ip a s ens33"
2:`设置不同应用模块`:
官方模块介绍:
https://docs.ansible.com/ansible/latest/collections/index.html#list-of-collections
查询帮助信息:
ansible-doc -l ---查看确认是否有指定模块
ansible-doc 模块信息 ---获取模块使用帮助手册
3)ansible的hosts文件编写介绍
编写方式有4种:
`方式一`:直接编写主机IP地址或者名称信息172.16.1.7
172.16.1.8web03
`方法二`:可以实现主机分组配置[oldboy]
172.16.1.7172.16.1.8172.16.1.9
`方法三`:可以设置子组信息
[summary:children]
web
db
[web]
172.16.1.7
172.16.1.8
172.16.1.9
[db]
172.16.1.5
1172.16.1.52
172.16.1.53
[lb]
172.16.1.5
172.16.1.6
`方法四`:可以定义设置变量信息
1)设置内置变量信息
172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=52113
ansible_user: 指定连接管理主机用户身份
ansible_password: 指定连接管理主机密码信息
ansible_port: 指定连接管理主机端口信息
2)批量设置内部变量信息
[oldboy]
172.16.1.7
172.16.1.8
172.16.1.9
[oldboy:vars]
ansible_user=root
ansible_password=123456
ansible_port=52113
3.1)如何使用批量管理模块功能
1) shell模块 ---万能模块
作用:可以实现批量管理主机信息
PS: command模块有缺陷,无法识别特殊符号信息: $HOME,"<",">","I"," ;" and "&"
模块常用指令参数:
creates:判断一个文件是否存在,如果存在就不执行相应命令removes:判断一个文件是否存在,如果存在就执行相应命令chdir:执行命令前,进行目录一个切换
PS:1)万能模块在使用时缺陷,不具有幂等性(第一次执行结果和多次执行结果相同)当不具有幂等性时,会对剧本编写产生问题??? 2)操作步骤可能会过于繁琐
批量执行脚本功能:
第一个历程:编写脚本
第二个历程:需要将脚本文件分发给所有主机
ansible oldboy -m shell -a " src=/server/scripts/test.sh dest=/server/scripts"
第三个历程:设置脚本文件权限
ansible oldboy -m file -a "path=/server/scripts/test.sh mode=755"
第四个历程:执行脚本文件
ansible oldboy -m shell -a " /server/scripts/test.sh"
2) script模块 ---脚本模块
作用:专门批量执行脚本功能
第一个历程:编写脚本
第二个历程:批量执行脚本
ansible oldboy -m script -a " /server/scripts/test02.sh"
3) copy模块 ---分发数据模块
作用:可以实现批量分发数据文件常用参数指令:
src:指定要分发文件数据信息
dest:将分发文件保存到哪个目标路径:如果src和dest是文件,则不会创建dest的父目录,如果该父目录不存在,则任务将失败。
owner:指定文件分发后的属主信息
group:指定文件分发后的属组信息
mode:指定文件分发后的权限属性
backup:当文件名称重复时,会将原文件备份,再进行覆盖? ? ?
m0l oldboy.txt(123) web01/backup/oldboy.txt(456) oldboy.txt(456)备份
content:在被管理主机上创建文件并设置信息内容
directory_mode:可以递归设置目录中数据权限(只是针对复制目录时)
force (了解):可以避免相同名称文件覆盖
m01 oldboy.txt( 123) web01 / backup/oldboy.txt(456)
force=yes默认设置表示会覆盖文件
force=no不会对相同文件进行覆盖
remote_src:将被管理主机上文件进行本地备份保存
validate:验证分发后的文件合法性
m01 www.conf web01 /etc/nginx/conf.d/www.conf nginx -t
实践操作:
1.批量分发文件信息,并修改文件属主属组和权限信息
[root@m01 ~]# ansible stangj -m shell -a "useradd stangg01"
[root@m01 ~]# ansible stangj -m copy -a "src=/data/stangj.txt dest=/data/ owner=stangj01 mode=666 group=stangj01"
[root@m01 ~]# ansible stangj -m shell -a "ls -l /data"
172.16.1.98 | CHANGED | rc=0 >>
-rw-rw-rw- 1 stangj01 stangj01 5 Jul 17 13:10 /data
172.16.1.99 | CHANGED | rc=0 >>
-rw-rw-rw- 1 stangj01 stangj01 5 Jul 17 13:10 /data
172.16.1.100 | CHANGED | rc=0 >>
-rw-rw-rw- 1 stangj01 stangj01 5 Jul 17 13:10 /data
2.在被管理主机上创建文件信息,并设置文件内容
[root@m01 ~]# ansible stangj -m copy -a "content=789 dest=/tmp/stangj02.txt mode=666"
[root@m01 ~]# ansible stangj -m shell -a "cat /tmp/stangj02.txt"
172.16.1.98 | CHANGED | rc=0 >>
789
172.16.1.99 | CHANGED | rc=0 >>
789
172.16.1.100 | CHANGED | rc=0 >>
789
3.将目录信息复制到被管理主机上,并且将目录以及目录下面所有内容权限统一改为777
[root@m01 /]# tree /data/
/data/
├── info
│ ├── 1.txt
│ ├── 2.txt
│ └── 3.txt
└── stangj.txt
[root@m01 /]# ansible stangj -m copy -a "src=/data/info dest=/tmp directory_mode=777 mode=777"
利用copy模块分发目录信息时:
目录后面有/表示将目录下面数据内容进行整体分发
目录后面没有/表示将目录下面数据内容以及目录本身都做分发
以上命令表示,复制分发数据时,可以在被管理自动创建所需的目录
4.将备份的数据如何实现批量还原
[root@m01 ~]# ansible stangj -m copy -a "src=/tmp/stangj02.txt dest=/tmp/stangj02.txt.bak remote_src=yes"
[root@m01 ~]# ansible stangj -m shell -a "echo 258 > /tmp/stangj02.txt"
[root@m01 ~]# ansible stangj -m shell -a "cat /tmp/stangj02.txt"
172.16.1.99 | CHANGED | rc=0 >>
258
172.16.1.98 | CHANGED | rc=0 >>
258
172.16.1.100 | CHANGED | rc=0 >>
258
[root@m01 ~]# ansible stangj -m copy -a "src=/tmp/stangj02.txt.bak dest=/tmp/stangj02.txt remote_src=yes"
[root@m01 ~]# ansible stangj -m shell -a "cat /tmp/stangj02.txt"
172.16.1.99 | CHANGED | rc=0 >>
789
172.16.1.98 | CHANGED | rc=0 >>
789
172.16.1.100 | CHANGED | rc=0 >>
789
4)将数据分发到其他主机,当有主机存在该文件时则取消对该主机的文件分发
ansible oldboy -m copy -a "src=/data/oldboy.txt dest=/tmp/oldboy.txt force=no"
4) fetch模块 ---拉取数据模块
作用:可以将被管理主机数据信息进行拉取常用指令参数:
src:被管理主机需要拉取数据信息
dest:管理主机需要存储数据目录信息
1.实践操作:实现被管理主机文件数据拉取
[root@m01 ~]# ansible stangj -m fetch -a "src=/tmp/stangj.txt dest=/data"
[root@m01 ~]# tree /data
/data
├── 172.16.1.100
│ └── tmp
│ └── stangj.txt
├── 172.16.1.98
│ └── tmp
│ └── stangj.txt
├── 172.16.1.99
│ └── tmp
│ └── stangj.txt
5) file模块 ---管理数据模块
作用说明:可以实现数据信息创建与删除/以及已有数据信息属性修改(属主属组权限)常用指令参数:
owner:修改已有文件的属主信息
group:修改己有文件的属组信息
mode:修改已有文件的权限信息
path:指定需要创建删除或者修改属性文件信息
state:可以实现数据信息创建删除
实践需求:
1.修改被管理端文件数据属性信息
[root@m01 ~]# ansible stangj -m shell -a "ls -l /tmp/stangj.txt"
172.16.1.99 | CHANGED | rc=0 >>
-rw-rw-rw- 1 stangj01 stangj01 5 Jul 17 13:43 /tmp/stangj.txt
[root@m01 ~]# ansible stangj -m file -a "path=/tmp/stangj.txt mode=777 owner=root group=root" #对文件
[root@m01 ~]# ansible stangj -m shell -a "ls -l /tmp/stangj.txt"
172.16.1.98 | CHANGED | rc=0 >>
-rwxrwxrwx 1 root root 5 Jul 17 13:43 /tmp/stangj.txt
[root@m01 ~]# ansible stangj -m file -a "path=/tmp/info mode=777 owner=stangj01 group=stangj01" #对目录
[root@m01 ~]# ansible stangj -m file -a "path=/tmp/info mode=777 owner=stangj01 group=stangj01 recurse=yes" #递归修改
2.创建数据信息
创建目录
[root@m01 ~]# ansible stangj -m file -a "path=/tmp/test/ state=directory"
创建文件
[root@m01 ~]# ansible stangj -m file -a "path=/tmp/test/test.txt state=touch"
检查文件信息是否存在:
[root@m01 ~]# ansible stangj -m file -a "path=/tmp/test/test.txt state=file"
软链接文件:
[root@m01 ~]# ansible stangj -m file -a "src=/tmp/test/test.txt dest=/tmp/test/test_soft_link state=link"
硬链文件:
[root@m01 ~]# ansible stangj -m file -a "src=/tmp/test/test.txt dest=/tmp/test/test_hard_link state=hard"
删除文件:
[root@m01 ~]# ansible stangj -m file -a "path=/tmp/test/test_hard_link state=absent"
6) archive模块 ---压缩数据模块
作用说明:可以对远程主机数据进行压缩处理
owner:指定文件压缩后的属主信息
group:指定文件压缩后的属组信息
mode:指定文件压缩后的权限信息
remove:(了解)将进行压缩后的数据删除
path:指定需要进行压缩数据信息
dest:指定压缩包文件保存路径
format:指定压缩数据
force_archive单独压缩一个文件信息时,也可以进行强制压缩处理
实践需求:需要将远程主机/tmp/info目录进行压缩处理,压缩完成将源文件删除
[root@m01 ~]# ansible stangj -m archive -a "path=/tmp/info dest=/tmp/info.tar.gz remove=yes"
7) unarchive模块 ---解压数据模块
作用说明:可以将管理端压缩包数据信息解压到被管理主机上常用指令参数:
src:指定要解压的数据信息
dest:解压教据指定路径信息
remote_src:将被管理主机上压缩包进行解压(默认为no)
[root@m01 ~]# ansible stangj -m unarchive -a "src=/tmp/info.tar.gz dest=/tmp/test/ remote_src=yes"
8) lineinfile模块 ---文件信息替换模块类似sed、
作用说明:可以实现对文件信息修改操作常用指令参数:
path:指定要修改文件信息
regexp:利用正则匹配出文件中指定行信息
line:对匹配行信息做修改
state:可以实现删除文件信息
insertafter:匹配指定信息,并在指定信息下面新起一行添加信息
insertbefore匹配指定信息,并在指定信息上面新起一行添加信息
create:在指定文件后面追加新的信息(默认为no)等价于 >>
实践操作:
1.修改文件中指定内容:将stangj开头行信息修改为dddd
[root@m01 ~]# ansible 172.16.1.100 -m shell -a "cat /tmp/test/info/1.txt"
172.16.1.100 | CHANGED | rc=0 >>
stangj
stangj010
stangj020
ffss
[root@m01 ~]# ansible 172.16.1.100 -m lineinfile -a "path=/tmp/test/info/1.txt regexp=^stangj line=dddd"
2.删除文件内中信息
[root@m01 ~]# ansible 172.16.1.100 -m lineinfile -a "path=/tmp/test/info/1.txt regexp=^stangj state=absent"
3.在文件指定行插入信息
[root@m01 ~]# ansible 172.16.1.100 -m lineinfile -a "path=/tmp/test/info/1.txt insertafter=^ffss line=stangj02" #在匹配的下一行插入
[root@m01 ~]# ansible 172.16.1.100 -m lineinfile -a "path=/tmp/test/info/1.txt insertbefore=^ffss line=stangj01" #在匹配的上一行插入
4.在文件中最后一行后面附加新的信息
[root@m01 ~]# ansible 172.16.1.100 -m lineinfile -a "path=/tmp/test/info/1.txt line=123456 create=yes"
9) cron模块 ---定时任务模块
作用说明:可以批量设置定时任务信息常用指令参数:
minute:可以设置分钟信息
hour:可以设置小时信息
day:可以设置日期信息
month:可以设置月份信息
weekday:可以设置星期信息
special_time:可以按照指定周期时间执行I
job:可以设置需要执行任务信息
name:表示给定时任务添加注释
state:表示创建或删除指定定时任务
disabled:表示将指定定时任务进行注释(默认为no不注释)
实践过程:
1.创建定时任务:每天夜里2点备份数据信息
[root@m01 ~]# ansible 172.16.1.100 -m cron -a "name=ansible_01_cron minute=0 hour=2 job='cp /tmp/stangj02.txt /tmp/stangj02.txt.bak &>/dev/null'"
[root@server01 tmp]# crontab -l
#Ansible: ansible_01_cron
0 2 * * * cp /tmp/stangj02.txt /tmp/stangj02.txt.bak &>/dev/null
2.临时关闭/开启定时任务设置
[root@server01 tmp]# ansible 172.16.1.100 -m cron -a "name=ansible_01_cron minute=0 hour=2 job='cp /tmp/stangj02.txt /tmp/stangj02.txt.bak &>/dev/null' disabled=yes" #关闭
[root@server01 tmp]# ansible 172.16.1.100 -m cron -a "name=ansible_01_cron minute=0 hour=2 job='cp /tmp/stangj02.txt /tmp/stangj02.txt.bak &>/dev/null' disabled=no" #开启
3.删除定时任务设置
[root@m01 ~]# ansible 172.16.1.100 -m cron -a "name=ansible_01_cron state=absent"
10)mount模块 ---挂载存储设备模块
作用说明:实现存储服务批量挂载以及卸载常用指令参数:
path:指定挂载点目录信息
src:指定挂载存储设备信息
fstype:指定挂载使用文件系统类型
opts指定挂载参数信息rw ro suid nosuid auto noauto ... defaults
state:指定挂载或卸载操作
实践操作:
1.主机批量挂载存储设备
[root@m01 ~]# ansible 172.16.1.100 -m mount -a "src=172.16.1.102:/data path=/mnt fstype=nfs state=present" #重启永久生效永久挂载
[root@m01 ~]# ansible 172.16.1.100 -m mount -a "src=172.16.1.102:/data path=/mnt fstype=nfs state=mounted" #立马挂载并且是永久挂载
2.主机批量卸载存储设备
[root@m01 ~]# ansible 172.16.1.100 -m mount -a "path=/mnt state=unmounted" #立即卸教但不会删除fastb挂载配置信息
[root@m01 ~]# ansible 172.16.1.100 -m mount -a "path=/mnt state=absent" #立即卸教并册除fstab挂戟配置
11) user模块 ---管理用户模块
作用说明:实现主机用户批量创建/批量删除用户常用指令参数:
name:指定创建用户名称
password:指定创建用户密码信息password=密文信息
uid:指定创建用户uid数值信息
group:指定用户所属主要组信息useradd -g
groups:指定用户附属组信息useradd -G
shell:指定创建用户登录方式/bin/bash(可以登录)/sbin/nologin(不能登录)
create_home 确认是否创建家目录默认yes创建家目录 useradd -M
remove:确认是否删除用户家目录信息默认no不删除家目录 userdel -r
state:是否创建或删除用户(默认present创建)
实践操作:
1.创建一个可以登录系统用户stj uid:6666 主组:stangj01 附属组:root
[root@m01 ~]# ansible stangj -m user -a "name=stj uid=6666 group=stangj01 groups=root "
2.给用户设置密码信息
生成密码信息:
[root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'stangj')}}"
localhost | SUCCESS => {
"msg": "$6$stangj$yUvBX8xlXAPtFSup6A4LTWjXjYhgmEpRzOxk2AjZW1ng0SQhZdSmz0tqBGe8djcr63OPdw43PAzjp3OOuAUv8."}
[root@m01 ~]# ansible stangj -m user -a 'name=stj uid=6666 group=stangj01 groups=root password="$6$stangj$yUvBX8xlXAPtFSup6A4LTWjXjYhgmEpRzOxk2AjZW1ng0SQhZdSmz0tqBGe8djcr63OPdw43PAzjp3OOuAUv8."'
3.创建虚拟用户信息
[root@m01 ~]# ansible stangj -m user -a "name=stj02 shell=/sbin/nologin create_home=no"
4.删除用户信息
[root@m01 ~]# ansible stangj -m user -a "name=stj state=absent remove=yes" #删除用户及家目录
[root@m01 ~]# ansible stangj -m user -a "name=stj state=absent" #删除用户不删家目录
group模块 ---管理用户组模块
作用说明:创建用户组信息或删除用户组信息
name:指定用户组名称信息
gid:指定用户组gid数值信息
state:是否创建或删除用户组(默认present创建)
12)yum模块 ---批量安装软件模块
作用说明:
1.下载安装/卸载删除系统软件程序包
2.可以指定下载源信息/关闭下载源校验功能yum仓库<--- /etc/ yum.repos.d/xx.repo aliyun nginx 清华源
常用指令参数介绍:
name:指定下载软件名称信息
state:指定下载或是卸载软件
installed/present:下载安装软件rsync-2.0
absent/removed:卸载软件程序
latest:更新软件程序rsync-3.0
enablerepo:指定下载源信息
disablerepo:指定不用哪个下载源
download_only:只下载软件包不进行安装(默认为false)
实践操作:
1.批量部署安装htop软件程序
[root@m01 ~]# ansible stangj -m yum -a "name=htop state=present"
2.指定下载源信息
[root@m01 ~]# ansible stangj -m yum -a "name=htop state=present enablerepo=epel"
[root@m01 ~]# ansible stangj -m yum -a "name=htop state=present disablerepo=epel"
3.只下载软件包,不进行软件包安装
[root@m01 ~]# ansible stangj -m yum -a "name=htop state=present download_only=true"
13)service模块 ---管理服务程序模块
作用说明:批量管理服务状态
常用指令参数介绍:
name:指定管理服务名称
state:指定服务运行状态((started stopped reloaded)
enabled:设置是否让服务开机自启yes-开机自启,no--开机不让自动运行
实践过程:批量管理服务状态
[root@m01 ~]# ansible oldboy -m service -a "name=nginx state=stopped enabled=no"
[root@m01 ~]# ansible oldboy -m service -a "name=nginx state=started enabled=yes"
类似模块: systemd
14) setup模块 ---收集
作用说明:可以采集被管理主机系统和硬件信息常用指令参数信息:
filter:过滤筛选想关注信息
实践过程:收集网卡信息
[root@m01 ~]# ansible 172.16.1.99 -m setup -a "filter=ansible_ens39"
PS:利用收集的信息做判断使用。
15)mysql模块
mysql_db ---可以用于创建或删除数据库
常用指令参数:
name: 定义创建或删除数据库名称信息
state: 用于创建或删除数据库,present创建,absent删除
login_user: 指定登录数据用户信息-uroot
login_password: 指定登录数据库密码信息-poldboy123
login_host: 指定要登录管理远程主机地址-h 172.16.1.51
mysql_user ---数据库中添加或删除用户信息常用指令参数:
name: 指定添加或删除用户信息
password: 指定用户密码信息
priv: 'stj.*:ALL' 指定用户管理库或表权限信息
state: present 创建用户
host: 指定数据库如何连接管理
login_user: 指定登录数据用户信息-uroot
login_password: 指定登录数据库密码信息-poldboy123
login_host: 指定要登录管理远程主机地址-h 172.16.1.51