yuanxiaojiang
人的放纵是本能,自律才是修行

使用Ansible前需要进行ssh密钥认证

Ansible简介

  • 自动化运维:批量管理、批量分发、批量执行
  • Ansible由python编写
批量管理工具 说明
Ansible 无客户端,基于ssh进行管理与维护
Saltstack 需要安装客户端,基于ssh进行管理与维护
Terraform tf批量管理基础设施

  Ansible管理架构⭐⭐⭐⭐

  • Host Inventory(主机清单):被管理主机的ip列表、模块
  • ad-hoc模式(点对点模式):命令行批量管理
  • playbook模式(剧本模式):将对应操作写入脚本

  部署与配置

# 部署ansible
    yum install -y ansible
    
# 修改配置文件关闭主机Host_key_checking
# 修改配置文件开启日志功能 
    [root@m01 ~]# egrep -vn '^$|#' /etc/ansible/ansible.cfg 
    10:[defaults]
    71:host_key_checking = False
    111:log_path = /var/log/ansible.log
    327:[inventory]
    340:[privilege_escalation]
    346:[paramiko_connection]
    370:[ssh_connection]
    431:[persistent_connection]
    445:[accelerate]
    460:[selinux]
    469:[colors]
    485:[diff]

Ans-inventory主机清单⭐⭐⭐

  • 主机清单:ansible被管理节点的列表
  • ansible默认读取/etc/ansible/hosts文件
# 主机清单格式
    [分类或分组名]    # 分类要体现出对应节点的作用
    ip地址/主机名/域名    # 对应的主机名需要能解析

#子组的格式
    [组名:children]
    子组名
    子组名

[root@m01 ~]# cat /etc/ansible/hosts
[web]
172.16.1.7
[backup]
172.16.1.41
[nfs]
172.16.1.31
[data:children]
[nfs]
[backup]

# 指定用户、密码、端口(不推荐,推荐先进行ssh认证,再进行管理)
    172.16.1.7 ansible_user=root ansible_password=root ansible_port=22

Ansible模块⭐⭐⭐⭐⭐

  • ansible中的模块类似于Linux中的命令
    • Linux命令管理系统
    • ansible模块实现批量管理
ansible选项 说明
-i 指定主机清单文件
-m 指定模块
-a 指定模块中的选项

  常见模块介绍 

模块分类 模块
命令和脚本   command模块:ansible默认的模块,执行简单命令,不支持特使符号
shell模块:执行命令,支持特殊符号
script模块:分发脚本命令
 文件  file模块:创建目录、文件、软连接
copy模块:远程分发文件,修改权限,所有者,备份
 服务 system模块:服务管理(旧版本的系统使用service模块)
 软件包   yum源模块:yum_repository
yum命令
get_url下载软件
 系统管理 mount模块:挂载
  cron模块:定时任务
 用户管理 group模块:管理用户组
  user模块:管理用户
调试 ping模块:检查ansible与其他节点连通性
  debug模块:用于检查/显示变量

  命令与脚本类模块

 command模块

ans默认的模块,适用于执行简单的命令,不支持特殊符号

# 案例:批量获取所有主机的主机名
    ansible all -m command -a 'hostname'
    ansible all -a 'hostname'

 shell模块

执行简单的命令,支持特殊符号

# 案例:批量删除/tm/下面所有的内容
    ansible all -m shell -a 'rm -rf /tmp/*'

# 案例:批量获取ip地址
    ansible all -m shell -a "ip address show |awk -F'[ /]+' 'NR==3{print \$3}'"

 script模块

# 案例:批量执行/server/scripts/create_distribute_keys.sh脚本
    ansible all -m script -a '/server/scripts/create_distribute_keys.sh'

  文件类模块

 template模块

  • 从模板文件生成配置文件或其他文本文件
  • template模块使用Jinja2模板引擎,可以在模板中使用变量、控制结构(如条件语句和循环)来动态生成目标文件的内容
template模块 说明
src 模板文件的源路径
dest 目标文件的路径
owner 文件所有者
group 文件所属组
mode 文件权限

 file模块

批量管理文件、目录、软连接

file模块 模块说明
path 目录/文件路径(必须要写
src source,源文件或目录(一般创建软连接时使用)
state

状态(模式):具体的操作

  • state=directory  创建目录
  • state=link  闯将软连接
  • state=touch  创建文件
  • state=abent  删除(如果是目录则递归删除目录)
  • state=file(默认)更新文件,文件不存在不会自动创建
mode mode=777 创建并修改问价
onwer onwer=root
group group=root
  • 案例:批量创建/yuan/yuanxiaojiang.txt
ansible all -m file -a 'path=/yuan/yuanxiaojiang.txt state=touch state=directory'
  • 案例:批量创建/etc/hosts的软连接到/opt下面
ansible all -m file -a 'src=/etc/hosts path=/opt/hosts state=link'
  • 案例:批量创建/backup/host/目录,所有者所属组为root,权限为700
ansible all -m file -a 'path=/backup/host/ mode=700 owner=root group=root state=directory
  • 案例:批量删除/bakcup/目录及目录下内容
ansible all -m file -a 'state=absent path=/backup'

 copy模块

批量分发(批量推送):管理节点发送文件或压缩包到被管理节点

copy模块 模块说明
src source  管理端的文件或目录
dest destination  被管理端的文件或目录
backup backup=yes  覆盖前进行备份(文件内容要求有变化)
mode 修改权限
owner 修改为指定的所有者
group 修改为指定的所属组
  • 案例:批量分发/etc/hosts文件,文件存在则自动备份
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'

  服务管理-systemd

systemd模块相当于linux中systemctl命令

systemd模块适用于目前大部分系统Linux系统

service模块适用于管理旧的Linux系统

systemd模块 说明
name 用于指定服务名称
enabled 是否开机自启动(yes/no)
state

state=started  开启

state=stopped  关闭

state=reloaded  重读配置文件(服务支持)

state=restarted  重启(关闭再开启)

daemon-reload 是否重新加载对应的服务的管理配置文件
  • 案例:批量开启crond服务并设置开机自启动
ansible all -m systemd -a 'name=crond state=started enabled=yes'
  • 案例:批量关闭firewalld服务并不让其开机自启动
ansible all -m systemd -a 'name=firewalld state=stopped enabled=no'

  软件模块

 yum模块

yum模块包含yum/apt命令

yum模块 说明
name 指定软件包名字,可以指定多个软件包(使用","分割)
state

installed  安装(也可以写成present)

removed  删除(也可以写成absent)

latest  安装或更新

update_cache 是否更新yum缓存(加速)
  • 批量安装tree,lrzsz,sshpass软件包
ansible all -m yum -a 'name=tree,lrzsz,sshpass state=present'

 get_url模块

相当于wget命令(所有主机需要能访问网络)

推荐在管理节点下载好,使用copy分发

get_url模块 说明
url 指定下载地址
dest 下载到哪个目录
  • 案例:批量下载zabbix-agent的软件包到/app/tools/下面
ansible all -m file -a 'path=/app/tools/ state=directory'
ansible all -m get_url -a 'url="https://mirrors.aliyun.com/zabbix/zabbix/6.5/rhel/7/x86_64/zabbix-agent2-7.0.0-alpha6.release2.el7.x86_64.rpm" dest=/app/tools/'

 yum_repository模块

未来将配置好的yum配置文件,通过copy分发到被管理机

yum_repository模块 说明 yum源配置
name  yum源的名字 [源名字]
decription   yum源中的注释说明 name
baseurl  yum源中的下载地址 baseurl
enabled  是否启动这个源 enabled
gpgcheck  是否启动gpgcheck功能 gpgcheck
file  指定yum源文件(自动添加.repo,默认与模块名字一致)  
  • 案例:批量给web服务器配置nginx的yum源

https://nginx.org/en/linux_packages.html#RHEL

ansible web -m yum_repository -a 'name=nginx-stable description="nginx repo" baseurl="http://nginx.org/packages/centos/$releasever/$basearch/" gpgcheck=no enabled=yes'

  用户管理模块

  • user用户管理:useradd,userdel
  • group用户组管理:groupadd

 user模块

user模块 说明
name 用户名
uid 指定uid
group 指定用户组(一般用于事先创建好了用户组)
shell 指定命令解释器:默认是/bin/bash
create_home 是否创建家目录( yes/no )
state

present  添加

absent  删除

password 后买指定的密码为加密的密码
  • 批量创建用户名为yuan_ans,uid为2000没有家目录的虚拟用户
ansible all -m user -a 'name=yuan_ans uid=2000 shell=/sbin/nologin create_home=no state=present'

批量更新用户密码

ansible all -m user -a "name=zhangsan password{{ 'zhangsan' | password_hash('sha512','zifuudanyu') }} state=present"

注意:{{ 内容 }}    # 注意空格
# 关于{{}}相关解释
    {{'root' | password_hash('sha512','suijizifu')}}
    root表示的是密码,经过管道,传递给password_hash()插件
    sha512加密算法,suijizifu(盐值)是随机字符用于生成加密后的密码

 group模块

group模块 说明
name 指定用户组名字
gid 指定组的gid
state

present  添加用户组

absent  删除用户组

  mount模块

实现mount命令进行挂载(可以指定参数修改/etc/fstab实现永久挂载)

mount模块参数 说明
fstype filesystem type:指定文件系统(xfs、ext4、iso9660、nfs)
src 源地址(eg:nfs地址  172.16.1.31/data)
path 挂载点
state

absent  卸载并修改fstab

unmounted  卸载不修改/etc/fstab

present  仅修改/etc/fstab 不挂载

mounted  挂载并修改/etc/fstab

remounted  重新挂载

  • 案例:通过ans管理在web01上挂载nfs:/data/到web01的/ans-upload/
# 检查nfs服务端配置
    ansible nfs -m shell -a 'cat /etc/exports ; ls -l / |grep "data"'

# 在web服务器上安装nfs
    ansible web -m yum -a 'name=nfs-utils state=present'

# 创建挂载点
    ansible web -m file -a 'path=/ans-upload/ state=directory'

# 挂载nfs
    ansible web -m mount -a 'src=172.16.1.31:/data/ path=/ans-upload/ fstype=nfs state=mounted'

# 检查
    ansible web -a 'df -h'
    ansible web -a 'grep upload /etc/fstab'

  cron模块

用户管理系统的定时任务,替代了crontab -e功能

cron模块选项 说明
name 定时任务的注释(必须有)
minute 分钟(minute="*/2")
hour 小时
day 日期
month 月份
week 周几
job 指定命令或脚本(定向到空)  job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null"
state

present  添加定时任务(默认)

absent  删除定时任务

  • 案例:批量创建定时任务
ansible all  -m cron -a 'name="sync time" minute="*/3" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'
  • 案例:批量删除定时任务
ansible all -m cron -a 'name="sync time" state=absent'
posted on 2024-12-08 23:19  猿小姜  阅读(137)  评论(0)    收藏  举报

levels of contents