集群式主机控制——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"
  • 效果

image-20221019211816713

四、服务管理相关模块

  • 服务管理功能:

    • 开机自启动/不开机自动启动

    • 服务开启、关闭、重启

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

  • 剧本组成

--- name: test  #指定任务名
- hosts: web #指定执行剧本的主机列表
remote_user: root #指定以什么用户去执行playbook

tasks: #任务列表
  - name: create new file #任务名称
    file: name=/data state=directory #任务模块
  - name: create new user
    user: name=lilei shell=/sbin/nologin
  - name: install httpd
    yum: name=httpd
  - name: start service
    service: name=httpd state=started enabled=yes
  • 示例参考:

该 playbook 中包含两个 play:

  • 第一个 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