linux学习26-Ansible(二)模块

Ansible模块概述:
ansible中的模块就类似于Linux中的命令,我们用Linux命令管理系统,而ansible通过模块实现批量管理;
ansible中模块的作用一般相当于Linux中的一些命令,如:yum模块,file模块,user模块;
ansible中的模块拥有不同的选项,这些选项一般都是一些单词,拥有自己的格式与要求,就类似Linux命令的参数;
查看模块的帮助,可以通过ansible-doc -s 模块名查看

[root@m01 ~]# ansible-doc -s systemd

[root@m01 ~]# ansible-doc -s file 

模块概览: 

命令和脚本模块:
command模块,ans默认的模块,执行简单命令,不支持特殊符号;
shell模块,执行命令,支持特殊符号;
script模块,分发脚本并执行;
文件模块:
file,创建目录,文件,软链接;
copy,远程分发文件,修改权限,所有者,备份;
服务模块:
systemd,服务管理;
service,服务管理(老系统用);
软件包管理模块:
yum源,yum_repository,
yum命令,
get_url下载软件;
系统管理模块:
mount模块,挂载;
cron模块,定时任务;
用户管理模块:
group模块,管理用户组;
user模块,管理用户;
用于调试模块:ping 模块检查 ,ansible与其他节点连通性。
debug模块,用于检查/显示 变量
其他Linux模块:压缩解压(unarchive),rsync模块(synchronize),数据库模块(mysql_db,mysql_user)...
其他工具模块:ansible管理docker  |  k8s  |  zabbix  |  grafana...


command模块,是ans默认的模块,适用于执行简单的命令,不支持特殊符号。
例1:批量获取所有主机的主机名,批量执行hostname命令

[root@m01 ~]# ansible all -m command -a 'hostname'
[root@m01 ~]# ansible all  -a 'hostname'


shell模块,与command模块类似,但是shell支持特殊符号;
注:shell模块不推荐执行较为复杂的指令,如果需要执行放在脚本中执行,避免因为特殊符号和引号导致的问题。

案例02:批量删除/tmp/下面所有内容
[root@m01 ~]# ansible all -m shell -a 'rm -rf /tmp/*'
#输入这个命令,会有紫色(粉红吧)的提示,告诉你这个rm是危险滴命令, 但提示归提示,还是会执行rm命令滴;
案例03,批量获取ip地址
[root@m01 ~]# ansible all -m shell -a "ip a s eth0 | awk -F'[ /]+' 'NR==3{print \$3}'"
案例04:更新yum源
[root@m01 ~]# ansible all -i /etc/ansible/allhosts -m shell -a 'curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo'
[root@m01 ~]# ansible all -i /etc/ansible/allhosts -m shell -a 'curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo'


script模块,执行流程:分发脚本(传输脚本),在被管理端运行脚本;
先随便写一个脚本,比如,输出主机名,等等,然后执行;

[root@m01 ~]# cat /server/script/ansible-test-scripts.sh
#!/bin/bash
#author: mclind
#desc: this is a ansible test scripts
hostname
hostname -I
ip a s eth0 | awk -F'[ /]' 'NR==3{priint $3}'
uptime
whoami
date +%F
sleep 10
[root@m01 ~]# ansible all -m script -a '/server/script/ansible-test-scripts.sh'


文件相关模块,这部分模块开始模块中会有较多的选项。
file模块
file模块不仅可以管理文件,还可以管理目录,管理软连接.
file模块相当于把touch命令,mkdir命令,rm命令,ln -s命令结合在一起了。
选项:
path:路径,必备选项;
src source源,源文件一般用于link(创建软连接模式) 用于指定源文件;
state:状态(模式) ,具体要做的什么,创建/删除,操作文件/操作目录
state=directory 创建目录
state=file (默认) 更新文件,如果文件不存在也不创建
state=link 创建软连接
state=touch 创建文件;
state state=absent 删除 ( 注意如果是目录递归删除目录. )
mode mode=755创建并修改权限
owner onwer=root
group group=root

案例05:创建/opt/lidao.txt
[root@m01 ~]# ansible all -m file -a 'path=/opt/haha.txt state=touch'
案例06: 创建目录/app/
[root@m01 ~]# ansible all -m file -a 'path=/app/a/b/c/d/e/g/ state=directory'
案例07: 创建软连接 /etc/hosts创建软连接到/opt/下
[root@m01 ~]# ansible all -m file -a 'path=/opt/hosts src=/etc/hosts state=link'
案例08: 创建/ans-backup/目录 所有者是mclind,权限是700
注:创建文件或目录的时候,修改权限,所有者
[root@m01 ~]# ansible all -m file -a 'path=/ans-backup/ owner=root group=root mode=700 state=directory'
案例09: 删除/oldboy/目录


copy模块
批量分发:scp,1个节点(管理节点)发送文件或压缩包到所有被管理端,注意:copy是单向的传输
选项:
src source 源文件,管理端的某个文件.
dest destination 目标,被管理端的目录/文件.
backup backup=yes 则会在覆盖前进行备份,文件内容要有变化或区别.
mode 修改权限
owner 修改为指定所有者
group 修改为指定用户组
注:
copy是推送,批量推送.
fetch是拉取,批量拉取.使用较少.


案例10: 分发书写好的/etc/hosts文件,如果文件存在则备份下:
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/tmp/hosts'


lineinfile
修改配置文件使用,类似于sed -i 'sg'和sed 'cai',会有剧本里用;


服务管理-systemd
systemd模块相当于是linux systemctl命令:开启/关闭/重启服务
选项:
name 用于指定服务名称
enabled yes开机自启动 (yes/no)
state:表示服务开,关,重启...
state=started 开启
state=stopped 关闭
state=reloaded 重读配置文件(服务支持)
state=restarted 重启(关闭再开启)
daemon-reload yes是否重新加载对应的服务的管理配置文件(未来讲解书写systemctl配置文件)
注:
systemd模块适用于目前大部分的Linux系统.
service模块适用于管理旧的Linux系统

案例11: 开启crond服务并设置开机自启动.
[root@m01 ~]# ansible all -m systemd -a 'name=crond enabled=yes state=started'
案例12: 关闭firewalld服务并不让开机自启动
[root@m01 ~]# ansible all -m systemd -a 'name=firewalld enabled=no state=stopped'
[root@m01 ~]# ansible all -m systemd -a 'name=sshd enabled=yes state=reloaded/restarted'


软件管理
yum模块;
get_url模块,wget命令;
yum_repository模块,yum源配置模块,未来可以通过copy模块分发配好的yum取代。
1)yum模块,并不只是yum命令,包含了yum/apt命令:
选项:
name 指定软件包名字,可以指定多个,通过","分割.
state
state=installed 安装(也可以写为present,默认present)
state=removed 删除 (也可以写为absent)
state=lastest 安装或更新
update_cache 可以设置为no,加速,表示不更新本地yum缓存.实际应用建议开启

案例13: 安装常用的软件htop,tree,lrzsz,sshpass
[root@m01 ~]# ansible all -m yum -a 'name=htop,tree,lrzsz,sshpass'

2)get_url模块
相当于是wget命令.所有主机能访问网络才行。
推荐在管理节点下载好,使用copy仅分发即可。
选项:
url 指定要下载的地址
dest 下载到哪个目录

案例14: 下载zabbix-agent的软包到/app/tools下面
zabbix-agent地址为:https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm
注:有时候wget下载会提示需要什么certificate,可加选项--no-check-certificate跳过认证;[root@m01 ~]# ansible all -m get_url -a 'url="https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm" dest=/tmp/'
后续可以调用yum模块安装本地的软件
name=/app/tools/xxxxx.rpm即可。

yum_repository模块
未来书写好yum配置文件,copy分发过去即可。
选项:
name yum源中名字 类似配置文件中的[epel]
description yum源的注释说明 对应源yum配置文件事是name的内容
baseurl yum源中 baseurl 下载地址
enabled 是否启动这个源 yes/no
gpgcheck 是否启动gpgcheck功能 no
file 指定yum源的文件 自动添加 .repo 默认与模块名字一致。

[root@m01 ~]# -m yum_repository -a 'name=epel description="Extra Packages for Enterprise Linux 7 - $basearch" baseurl="http://mirrors.aliyun.com/epel/7/$basearch" enabled=yes gpgcheck=no'


用户管理
user用户管理 : useradd,userdel
group用户组管理 : groupadd
user模块
选项:
name,例 wwww 用户名
uid 指定uid
group 指定用户组,一般用于事先创建好了用户组,通过选项指定下.
shell 指定命令解释器:默认是/bin/bash /sbin/nologin
create_home 是否创建家目录(yes/no)
state=present 添加
state=absent 删除
password 加密的密码
group模块
选项:
name 指定用户组名字
gid 指定组的gid
state=present添加
state=absent 删除

案例15: 创建www-ans用户uid 2000虚拟用户
[root@m01 ~]# ansible all -m user -a 'name=www-ans uid=2000 shell=/sbin/nologin create_home=no state=present'
案例16: 批量更新密码
[root@m01 ~]# ansible all -m shell -a 'echo 1 | passwd --stdin mclind'
[root@m01 ~]# ansible all -m user -a "name=mclind password={{ '1' | password_hash('sha512','suiyi') }} state=present"
注:关于{{ '1' | password_hash('sha512', 'suiyi') }}相关的解释
表示1是密码,经过管道,传递给了password_hash()插件, 运用sha512加密算法加密,suiyi是随机字符,当slat用,用于生成随机加密后的密码


mount模块
实现mount命令进行挂载,可以修改/etc/fstab实现永久挂载
选项:
fstype filesystem type指定文件系统,xfs,ext4,iso9660,nfs
src 源地址(nfs地址 eg 172.16.1.31:/data )
path 注意这里不是dest,挂载点(要把源挂载到哪里)
state
state=absent 卸载并修改fstab
state=unmounted 卸载不修改/etc/fstab
state=present 仅修改/etc/fstab 不挂载
state=mounted 挂载并修改/etc/fstab
state=remounted 重新挂载

案例17: 通过ans管理在web01上挂载nfs:/data挂载到web01的/ans-upload/
#在web服务器上安装nfs
[root@m01 ~]# ansible web -m yum -a 'name=nfs-utils state=present'
#创建挂载点
[root@m01 ~]# ansible web -m file -a 'path=/ans-upload/ state=directory'
#挂载nfs
[root@m01 ~]# ansible web -m mount -a 'src=172.16.1.31:/data/ path=/ans-upload/ fstype=nfs state=mounted'
#检查
[root@m01 ~]# ansible web  -a 'df -h'
[root@m01 ~]# ansible web  -a 'grep upload /etc/fstab'


cron模块
用于管理系统的定时任务,替代了crontab -e功能。
选项:
name 定时任务名字(一定要加上), 对应下面 注释 的内容
minute 分钟 minute="*/2"
hour 小时
day 日期
month 月份
week 周几
job 指定命令或脚本(定向到空) job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null"
state=present 添加定时任务(默认)
state=absent 删除

案例18: 每3分钟同步时间。
#清理已有定时任务,如果没有,会报错提示没有此文件或目录
[root@m01 ~]# ansible all -a "sed -i '/ntpdate/d' /var/spool/cron/root"
#重新创建定时同步时间任务
[root@m01 ~]# ansible all -m cron -a 'name="sync time by mclind" minute="*/3" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'
#删除定时任务
[root@m01 ~]# ansible all -m cron -a 'name="sync time by mclind" state=absent'

你可能感兴趣的:(linux,ansible,linux)