集群式主机控制——Ansible使用
作者:Adil | 发布时间:
一、简介:
Ansible 是一款开源 IT 自动化工具,能够自动执行置备、配置管理、应用部署、编排和许多其他手动 IT 流程。与更为简易的管理工具不同,Ansible 用户(如系统管理员、开发人员和架构师)可以运用 Ansible 自动化,在整个企业范围内更高效地安装软件、自动执行日常任务、置备基础架构、提高安全性和合规性、修补系统并共享自动化。
简而言之:ansible是一款基于python的自动化运维工具,其可以实现对集群内的操作系统进行统一的控制。因其采用ssh通信的方式,所以再在受控制的终端上不需要再下载额外的客户端。
二、基本配置
第一步:
-
控制端安装按ansible(环境基于centos7,也支持ubuntu等操作系统,请自行查阅)
-
yum -y install ansible
第二步:
-
控制端向被控制端分发认证密钥,实现免密码登录被控客户端。
-
个人笔记:
第三步:
-
创建被控端主机清单的分组
-
vi/etc/ansible/hosts
[t1] #分组名,后续执行命令可以指定哪些分组执行命令
192.168.0.1 #t1组下的涵盖ip
192.168.1.20
192.168.7.9
或
[t1] #分组名,后续执行命令可以指定哪些分组执行命令
an1 #t1组下的涵盖ip,注意,此种方式需要在/etc/hosts文件中进行修改,使主机名同ip地址绑定
an2
an3
注意:使用前需要对分组下的ip进行ssh密钥分发方可正常使用,或者直接在ansible的host文件中填入主机的账号密码(不推荐)
[t2]
192.168.1.11 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='jack' ansible_sudo_pass='root_password'
ansible_ssh_host 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口 192.168.1.100:2222
ansible_ssh_user 默认的 ssh 用户名(后面ansible_su_pass 可以给root密码)
ansible_ssh_pass ssh 密码(这种方式并不安全,我们强烈建议使用 –ask-pass 或 SSH 密钥)
ansible_sudo_pass sudo 密码(这种方式并不安全,我们强烈建议使用 –ask-sudo-pass)
三、使用语法及模块
一、Ansible命令清单
-
-i#指定主机清单(一般忽略不写) -
-m#指定模块 -
-a#指定动作
使用格式:
ansible [-i host] lb -m shell -a "whoami"
一般使用:ansible lb -m shell -a "whoami"
选中lb组的主机,让其执行shell命令:whoami,然后返回结果。
语法解析
-
-i host#指定host文件(一般忽略不写) -
lb#指定主机组 -
-m shell#指定执行模块 -
-a "whoami"#指定执行动作(参数)
二、主机命令执行模块
1、command模块
-
command是ansible中的默认的模块,即不指定模块就默认使用。
-
作用:command模块适用于执行简单的命令,不支持命令中的特殊字符
ansible tt -m command -a "whoami"
等同于
ansible tt
2、shell模块
-
作用:shell模块用于执行复杂的命令,支持在命令中添加特殊字符
ansible tt -m shell -a "pa -ef | grep java" #查找主机组中所有执行Java进程的数据。
3、shell模块和commmand模块的比较
shell有效:
ansible tt -m shell -a "ps -ef |grep java "
command无效:
ansible tt -m command -a "ps -ef |grep java "
原因:command不支持特殊字段,上述命令中的 | 是特殊字段,command只能用于执行简单的命令
三、文件相关模块:
1、file模块
-
作用:文件、目录的创建、删除等操作
-
参数:
path #路径(必须写)
src #源文件,一般用于link(创建软链接模式)
state #状态
state=directory #创建目录
state=file #更新文件
state=link #创建软链接
state=touch #创建文件
-
使用示例
#对tt主机组进行文件创建,路径为/dev/test1
ansible tt -m file -a "path=/dev/test1 state=touch mode=0744 owner=root group=root"
#对tt主机组文件夹下的/dev/test1文件创建软连接,链接地址为/dev/link
ansible tt -m file -a "src=/dev/test1 dest=/dev/link state=link"
2、copy模块
-
作用:将文件由控制端集中分发到被控端
-
参数
src #用于指定需要copy的文件或目录。
dest #用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数。
content #当不使用src指定拷贝的文件时,可以使用content直接指定文件内容
force #是否覆盖文件
force=yes #覆盖远程同名文件
force=no #不覆盖远程同名文件
backup #是否备份文件
backup=yes #对远程同名文件进行备份
backup=no #不对远程同名进行备份
-
使用示例
#将当前目录下的test.txt文件分发到tt主机组下的/opt/tt.txt路径,并且设置重名文件的备份
ansible tt -m copy -a "src=test.txt dest=/opt/tt.txt backup=yes"
3、fetch模块
-
作用:用于从被控端向主机拉去文件、数据
-
参数
dest #用来存放文件的目录,
Src· #在远程拉取的文件
-
使用示例
#将tt主机组下的/opt/tt.txt文件拉取到控制端,并保存到/root/test文件夹下
ansible tt -m fetch -a "dest=/root/test src=/opt/tt.txt"
-
效果

四、服务管理相关模块
-
服务管理功能:
-
开机自启动/不开机自动启动
-
服务开启、关闭、重启
-
1、systemd模块
-
systemd:类似于systemctl命令
-
作用:使用守护进程,对服务进行状态配置
-
参数
name #服务名,例如crond.service,最好带上后缀.service
state #需要的操作,reloaded, restarted, started, stopped
enable #是否需要开机启动
-
使用示例
# 关闭tt主机组的防火墙服务,并且设置防火墙默认不启动
ansible tt -m systemd -a "name=firewalld.service state=stopped enabled=no"
2、yum模块
-
作用:yum模块可以帮助我们批量管理远程Linux的软件包
-
参数
name #用于指定需要管理的软件包,比如 nginx。
state #状态 present,installed,removed,latest,absent。默认为present。
installed and present等效
latest标志安装yum中最新版本
absent and removed 等效 表示删除安装包
默认情况下,执行此命令,安装过程所有选项为y
-
使用示例
#向tt主机组内的主机安装lszrz软件包,版本为最新
ansible tt -m yum -a "name=lrzsz state=latest"
3、get_url模块
-
作用:下载链接文件
-
参数
url #指定要下载的地址
dest #下载文件的保存地址及文件名
-
使用示例
#下载tt主机组下指定url的文件,并将其保存在/root目录下存为aa.py
ansible tt -m get_url -a "url=https://owncloud.gotarget.top/Data/Script/py/2to3/2to3.py dest=/root/aa.py"
五、系统管理模块
1、cron模块
-
作用:对系统内某些执行任务设置定时任务
-
参数
name #定时任务的名字
minute #分
hour #时
day #天
month #月
week #周
job #指定命令或脚本
state #状态,present(添加)、absent(删除)
disable #开启或关闭,参数有yes、no
special_time #每多久执行一次,对应参数:reboot(每次重启)、hourly(每小时)、daily(每天)、weekly(每周)、monthly(每月)
-
使用示例
#任务名称为”crontab day test”,任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出 test 字符。
ansible tt -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' "
#任务将在重启时执行,任务内容为输出 test 字符。
ansible tt -m cron -a " name='special time test' special_time=reboot job='echo test' "
-
补充
crontab -l #查看定时任务
crontab -e #删除配置文件相关任务字段,即删除定时任务
六、用户管理模块
1、group模块
-
作用:管理系统的用户组
-
参数
name #需要管理的组名,也就是要对那个组进行管理
gid #设置组id
state #执行状态
absent #删除
present #创建(默认)
-
使用示例
#在tt主机组下创建tt用户组,设置gid为777
ansible tt -m group -a "name=tt gid=777 state=present"
2、user模块
-
作用:管理系统内存在的用户
-
参数
name #用户名
uid #用户的uid
group #组id或者组名
state #执行状态
absent #删除
present #创建
create_home #创建用户时,是否创建家目录
password #用户密码,不能使用明文!!!
-
使用示例
#在tt主机组下创建tt1用户,uid为200,用户组为tt,密码为7417417741
echo "7417417741" | openssl passwd -1 -stdin #查看7417417741的加密密文,而后将其填充到password中
ansible tt -m user -a 'name=tt1 uid=200 group=tt state=present password="$1$QUFCXsJM$J/a6TI28RPVeHh3A6tEpx1"'
四、剧本
简述
ansible的剧本,可以理解为编写好的脚本,即一次编写,多次执行相同任务。
剧本格式:.yaml or .yml
-
剧本组成
--- nametest #指定任务名
hostsweb #指定执行剧本的主机列表
remote_userroot #指定以什么用户去执行playbook
tasks#任务列表
namecreate new file #任务名称
filename=/data state=directory #任务模块
namecreate new user
username=lilei shell=/sbin/nologin
nameinstall httpd
yumname=httpd
namestart service
servicename=httpd state=started enabled=yes
-
示例参考:
-
第一个 play 检查 Web 服务器软件是否为最新版本,并根据需要运行更新
-
第二个 play 检查数据库服务器软件是否为最新版本,并根据需要运行更新
--- name: update the web server
hosts: tt
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum:
name: apache
state: latest
- name: update db servers
hosts: databases
remote_user: root
tasks:
- name: ensure postgresql is at the latest version
yum:
name: postgresql
state: latest
- name: ensure that postgresql is started
service:
name: postgresql
state: started
-
剧本的检查及使用
[tt1@an_center ~]# ansible-playbook -C hello.yml #检测playbook语法
[tt1@an_center ~]# ansible-playbook hello.yml #执行playbook