这里使用四台Ubuntu18.04主机(一台充当Ansible管理端服务器,另外三台充当Ansible被管理端服务器),Ansible用apt安装,版本为2.9.10,下表是它们所使用的操作系统以及IP地址。
四台Ubuntu18.04主机所使用的操作系统以及IP地址 |
||
主机名称 | 操作系统 | IP地址 |
Ansible管理端服务器 | Ubuntu18.04 | 192.168.0.132 |
Ansible被管理端服务器 | Ubuntu18.04 | 192.168.0.133 |
Ansible被管理端服务器 | Ubuntu18.04 | 192.168.0.134 |
Ansible被管理端服务器 | Ubuntu18.04 | 192.168.0.135 |
Ansible官网文档:https://docs.ansible.com
Ansible服务特点说明:
(1)管理端不需要启动服务程序(no server)
(2)管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
(3)受控端不需要安装软件程序(libselinux-python)
被管理端selinux服务没有关闭 --- 影响ansible软件的管理
libselinux-python让selinux开启的状态也可以使用ansible程序
(4)受控端不需要启动服务程序(no agent)
(5)服务程序管理操作模块众多(module)
(6)利用剧本编写来实现自动化(playbook)
提示:以下操作均在root用户下进行,如在普通用户,请自行加上sudo!
查看系统版本:
lsb_release -a
一、安装Ansible
注意:以下操作均在Ansible管理端服务器上!
官网文档截图:
依次执行以下命令,安装ansible:
apt update
apt install software-properties-common
apt-add-repository --yes --update ppa:ansible/ansible
apt install ansible
安装完成后,查看ansible的版本:
ansible --version
二、创建“密钥对”,Ansible是基于SSH远程管理服务实现远程主机批量管理的
注意:这里使用的是root用户,Ubuntu18.04默认root用户没有密码,并且不能使用SSH远程,(需要设置root密码,使用命令:sudo passwd root,需要开启root用户SSH远程权限,在配置文件/etc/ssh/sshd_config里加入PermitRootLogin yes配置,重启SSH服务生效即可)
ssh-keygen(也可以使用-t选项指定秘钥的类型,如:ssh-keygen -t rsa或ssh-keygen -t dsa)
三、使用脚本将公钥批量分发至Ansible被管理端服务器
思考,批量分发公钥时有两个问题:
1、需要输入连接确认信息 yes/no
2、需要第一次连接输入密码
解决方法:
1、使用-o StrictHostKeyChecking=no选项,即可解决第一个问题
2、使用sshpass即可解决第二个问题,sshpass用于非交互的ssh密码验证,使用-p参数指定明文密码,然后直接登录远程服务器。
安装sshpass命令,apt install sshpass
实现脚本:
for i in `seq 3 5`; do sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.13$i "-o StrictHostKeyChecking=no"; done
查看软件安装到系统里面的文件目录信息
dpkg -L ansible|egrep -v "^/usr/(share|lib)"
说明:
/etc/ansible/ansible.cfg # ansible服务配置文件
/etc/ansible/hosts # 主机清单文件,定义可以管理的主机信息
/etc/ansible/roles # 角色配置文件
四、配置主机清单文件,并测试是否可以管理多个主机
打开配置文件:vim /etc/ansible/hosts
在配置文件最后,输入所有Ansible被管理端服务器的IP地址
保存退出后,进行测试基于秘钥的SSH是否连接正常
执行下面的命令,查看Ansible被管理端服务器的主机名:
ansible all -a "hostname"
可以看到被管理端服务器主机名分别为:ceph3、ceph4、ceph2
五、Ansible模块的应用
模块的应用语法格式:
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"
命令类型模块
1、command模块(官方文档:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module)
简单用法:
查看所有在主机清单配置文件里主机的主机名
ansible all -m command -a "hostname"(command也是个Ansible默认模块,-m command可以不写)
扩展应用
官方截图:
(1)参数:chdir,在执行命令之前对目录进行切换
以下命令意思是:在所有被管理端服务器的tmp目录下创建demo.txt文件
ansible all -m command -a "chdir=/tmp touch demo.txt"
可以看到有条警告信息,如果不想再看到,根据说明进入Ansible配置文件:vim /etc/ansible/ansible.cfg,去掉command_warnings = False(188行)配置前的#即可,注意要顶格。
(2)参数:creates,如果文件存在了,不执行命令操作
以下命令意思是:如果被管理端服务器/tmp目录下没有hosts文件(注意:如果不加chdir=/tmp,默认会将文件创建到家目录下),则创建demo123.txt文件
ansible all -m command -a "creates=/tmp/hosts chdir=/tmp touch demo123.txt"
(3)参数:removes,如果文件存在了, 这个步骤将执行
以下命令意思是:如果被管理端服务器/tmp目录下有hosts文件(注意:如果不加chdir=/tmp,默认会将文件创建到家目录下),则创建demo456.txt文件
ansible all -m command -a "removes=/tmp/hosts chdir=/tmp touch demo456.txt"
注意事项:command模块有些符号信息无法识别,如:"<",">","|",";","&"
2、shell模块(官方文档:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module)
shell模块参数功能和command模块类似
简单用法:
查看所有在主机清单配置文件里主机的主机名
ansible all -m shell -a "hostname"
shell模块被称为万能模块,command模块能干的不能干的它都能干
ansible all -m shell -a "chdir=/tmp touch demo.txt"
ansible all -m shell -a "creates=/tmp/hosts chdir=/tmp touch demo123.txt"
ansible all -m shell -a "removes=/tmp/hosts chdir=/tmp touch demo456.txt"
shell模块,这些"<",">","|",";","&"符合都可以识别:
ansible all -m shell -a "echo 123 >> /tmp/hosts.bak"
ansible all -m shell -a "grep 192 /etc/hosts"
3、script模块(官方文档:https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module)
scripts模块参数功能也和command模块类似
新建demo.sh文件,写入以下脚本,脚本内容是计算1到100的累加和并将结果重定向到tmp目录的sum.txt文件:
vim /root/demo.sh
#!/bin/bash
sum=0
for i in `seq 1 100`
do
sum=$[$i+$sum]
done
echo $sum > /tmp/sum.txt
保存退出后,执行以下命令,命令意思是:在所有被管理端服务器执行demo.sh脚本
ansible all -m script -a "/root/demo.sh"
文件类型模块
1、copy模块,批量分发文件(官方文档:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module)
以下命令意思是:将管理端服务器/root目录下的demo.sh文件批量分发至所有被管理端服务器/tmp目录下
ansible all -m copy -a "src=/root/demo.sh dest=/tmp/"
扩展用法:
(1)在传输文件时修改文件的属主和属组信息,注意:指定的属主和属组必须在被管理端服务器存在,否则会报错
ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ owner=zhangsan group=zhangsan"
(2)在传输文件时修改文件的权限信息
ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ mode=777"
(3)在传输数据文件信息时对远程主机源文件进行备份,注意:文件必须有改动后再次传输才会备份,被管理端服务器的文件备份名类似这样,demo.sh.8328.2020-06-20@03:51:21~
ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ backup=yes"
(4)创建一个文件并直接编辑文件的信息
ansible all -m copy -a "content='123456' dest=/tmp/rsync.password"
复制文件时加不加“/”的区别:
ansible all -m copy -a "src=/tmp dest=/tmp/"
src后面目录没有/:将目录本身以及目录下面的内容都进行远程传输复制
ansible all -m copy -a "src=/tmp/ dest=/tmp/"
src后面目录有/:只将目录下面的内容都进行远程传输复制
2、file模块,设置文件属性信息(官方文档:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module)
基本用法:
ansible all -m file -a "dest=/tmp/demo.sh owner=zhangsan group=zhangsan mode=666"
扩展用法:
可以利用模块创建数据信息 (文件 目录 链接文件)
state 参数
=absent # 缺席/删除数据信息
=directory # 创建一个目录信息
=file # 检查创建的数据信息是否存在,绿色存在,红色不存在
=hard # 创建一个硬链接文件
=link # 创建一个软链接文件
=touch # 创建一个文件信息
创建目录信息:
ansible all -m file -a "dest=/tmp/demo/ state=directory"
ansible all -m file -a "dest=/tmp/demo/demo01/demo02 state=directory"
创建文件信息:
ansible all -m file -a "dest=/tmp/demo.py state=touch"
创建链接文件信息:
ansible all -m file -a "src=/tmp/demo.txt dest=/tmp/demo_hard.txt state=hard"
ansible all -m file -a "src=/tmp/demo.txt dest=/tmp/demo_link.txt state=link"
在被管理端服务器上验证是否为硬链接,也就是查看inode索引节点编号是否相同,相同即为硬链接:ll -i /tmp/demo_hard.txt /tmp/demo.txt
可以利用模块删除数据信息
ansible all -m file -a "dest=/tmp/demo.txt state=absent"
ansible all -m file -a "dest=/tmp/demo/ state=absent"
3、 fetch模块,批量拉取数据(官方文档:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module)
以下命令意思是:将所有被管理端服务器/tmp目录下的demo.txt文件批量拉取到管理端服务器的/tmp目录下
ansible all -m fetch -a "src=/tmp/demo.txt dest=/tmp"
拉取成功后的目录,默认以主机IP命名
包类型模块
1、apt模块(官方文档:https://docs.ansible.com/ansible/latest/modules/apt_module.html#apt-module)
批量安装apache2 :
ansible all -m apt -a "name=apache2 state=present"
ansible all -m apt -a "name=apache2 state=latest"
批量卸载apache2 :
ansible all -m apt -a "name=apache2 state=absent"
说明:
name # 指定安装软件名称
state # 指定是否安装软件
absent # 卸载
build-dep
latest # 安装最新版本
present(默认)
fixed
系统类型模块
1、service模块,被管理端服务器上服务的运行状态,停止,开启,重启(官方文档:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module)
批量停止apache2服务,并禁止开机自启动
ansible all -m service -a "name=apache2 state=stopped enabled=no"
说明:
name # 指定管理的服务名称
state # 指定服务状态
reloaded # 重新加载
restarted # 重新启动
started # 启动
stopped # 停止
enabled # 指定服务是否开机自启动
2、cron模块,批量设置多个主机的定时任务信息(官方文档:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module)
基本用法:
ansible all -m cron -a "minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1'"
说明:
* * * * * 定时任务动作
分 时 日 月 周
ansible-doc -s cron # 查看使用说明
minute # 设置分钟信息
hour # 设置小时信息
day # 设置日期信息
month # 设置月份信息
weekday # 设置周信息
job # 用于定义定时任务需要干的事情
扩展用法:
(1)给定时任务设置注释信息
ansible all -m cron -a "name='time sync' minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1'"
(3)批量注释定时任务,disabled=yes为注释,disabled=no为取消注释
ansible all -m cron -a "name='time sync' minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1' disabled=yes"
(2)删除指定定时任务
ansible all -m cron -a "name='time sync' state=absent"
注意:ansible可以删除的定时任务,只能是ansible设置好的定时任务
3、mount模块,批量进行挂载操作(官方文档:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module)
基本用法:
ansible all -m mount -a "src=192.168.0.130:/data path=/mnt fstype=nfs state=mounted"
参数:
src:需要挂载的存储设备或文件信息
path:指定目标挂载点目录
fstype:指定挂载时的文件系统类型
state
present/mounted # 进行挂载
present:不会实现立即挂载,修改fstab文件,实现开机自动挂载
mounted:会实现立即挂载,并且会修改fstab文件,实现开机自动挂载 *****
absent/unmounted # 进行卸载
absent:会实现立即卸载,并且会删除fstab文件信息,禁止开机自动挂载
unmounted:会实现立即卸载,但是不会删除fstab文件信息 *****
4、user模块,实现批量创建用户(官方文档:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module)
基本用法:
ansible all -m user -a "name=wangwu"
扩展用法:
(1)指定用户uid信息
ansible all -m user -a "name=wangwu01 uid=6666"
(2)指定用户组信息,group为指定主要组,groups为指定次要组
ansible all -m user -a "name=wangwu02 group=wangwu01"
ansible all -m user -a "name=wangwu03 groups=wangwu01"
(3)批量创建虚拟用户,create_home=no为不创建家目录
ansible all -m user -a "name=wangwu04 create_home=no shell=/sbin/nologin"
(4)给指定用户创建密码
ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
ansible all -i localhost, -m debug -a "msg={{ '密码信息' | password_hash('sha512', '加密校验信息') }}"
ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'abcdefg') }}"
ansible all -m user -a 'name=wangwu05 password=$6$abcdefg$SVqgF31LWsg8o0zQyy63h/NIcgk3RP516ZKxuWJasoxHYEkq0YWf.WgIhFz5uK19zJrEK61oiA.TFD5ROrPxH0'
六、Ansible剧本的编写方法
学习Ansible剧本编写前,需要先了解下YAML,YAML是专门用来写配置文件的语言,非常简洁和强大,远比JSON格式方便。
YAML入门教程:https://www.runoob.com/w3cnote/yaml-intro.html
如何执行剧本:
第一个步骤:检查剧本的语法格式
ansible-playbook --syntax-check rsync_server.yaml
第二个步骤:模拟执行剧本
ansible-playbook -C rsync_server.yaml
第三个步骤:直接执行剧本
ansible-playbook rsync_server.yaml
扩展
Ansible使用过程中屏幕输出颜色说明:
绿色信息:查看主机信息/对主机未做改动
黄色信息:对主机数据信息做了修改
红色信息:命令执行出错了
粉色信息:忠告信息
蓝色信息:显示ansible命令执行的过程