Ansible 常用基础模块
Ansible 常用基础模块
目录
Ansible的执行
- ad-hoc
- playbook
Ansible ad-hoc
ad-hoc:简而言之就是“临时命令”,执行完即结束,并不会保存
ad-hoc模式的使用场景
比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等
ad-hoc模式的命令使用
语法:
ansible 主机名(主机清单中的主机名或主机组) -m 模块名 [-a '动作']
ad-hoc结果返回颜色
- 绿色:被管理端执行成功,代表被管理端主机没有被修改
- 黄色:被管理端执行成功,但是结果是变化的
- 红色:执行失败,注意看报错
ad-hoc常用模块
command # 执行shell命令(不支持管道等特殊字符)
shell # 执行shell命令
scripts # 执行shell脚本
yum_repository # 配置yum仓库
yum # 安装软件
copy # 变更配置文件
file # 建立目录或文件
service # 启动与停止服务
mount # 挂载设备
cron # 定时任务
get_url #下载软件
firewalld #防火墙
selinux #selinux
Ansible-doc帮助手册
ansible-doc 模块名
ansible-doc -l # 查看所有模块说明
ansible-doc copy # 查看指定模块方法
ansible-doc -s copy # 查看指定模块参数
Ansible命令模块
command模块
# 执行shell命令(不支持管道等特殊字符)
ansible web_group -m command -a '命令(不带特殊符号)'
shell模块
# 执行shell命令,如果需要一些管道操作,则使用shell
ansible web_group -m shell -a '命令'
script模块
# 在本地运行模块,等同于在远程执行脚本,不需要将脚本文件进行推送目标主机执行
[root@m01 ~]$ ansible web_group -m script -a "/root/a.sh"
# 1.管理端创建脚本
[root@m01 ~]$ vim a.sh
#!/bin/sh
echo '123' > /root/1.txt
# 2.管理端远程执行脚本(相当于在被管理端执行)
[root@m01 ~]$ ansible web_group -m script -a '/root/a.sh'
# 3.被管理端执行脚本成功
[root@web01 ~]$ cat 1.txt
123
Ansible软件管理模块
yum模块
# 远程安装tree命令
[root@m01 ~]$ ansible lb_group -m yum -a 'name=tree state=present'
# 远程检测tree命令是否安装
[root@m01 ~]$ ansible lb_group -m yum -a 'list=tree'
选项:
-name:包名
-直接指定包名: 从仓库安装(类似yum install httpd)
-http:// : 从指定的URL安装
-file:// : 从本地安装(类似:yum localinstall /root/http-1.rpm)
-state:动作,指定使用yum的方法
-absent(removed,不推荐): 卸载
-present(installed,不推荐): 安装
-latest: 安装最新版本
-download_only
-true: 只下载不安装
-false: 下载并安装
-list
-包名: 检测软件包是否安装
"yumstate": "available" 证明包可以安装但是没装
"yumstate": "installed" 已经安装了
[root@m01 ~]$ ansible-doc yum
exclude=kernel*,foo* #排除某些包
list=ansible #类似于yum list查看是否可以安装
disablerepo="epel,ol7_latest" #禁用指定的yum仓库
yum_repository模块
# 创建新的仓库配置文件,文件名和仓库名叫nginx,描述是xxxx,仓库的URL是baidu.com
[root@m01 ~]$ ansible lb_group -m yum_repository -a 'name=nginx description=xxxx baseurl=http://www.baidu.com gpgcheck=no enabled=yes'
[root@lb01 /etc/yum.repos.d]$ ll
-rw-r--r-- 1 root root 77 Aug 10 17:45 nginx.repo
# 创建新的仓库配置文件,且文件名不和仓库名一样
[root@m01 ~]$ ansible lb_group -m yum_repository -a 'name=nginx file=wj_nginx description=xxxx baseurl=http://www.baidu.com gpgcheck=no enabled=yes'
[root@lb01 /etc/yum.repos.d]$ cat wj_nginx.repo
[nginx]
baseurl = http://www.baidu.com
enabled = 1
gpgcheck = 0
name = xxxx
# 追加仓库至文件中
[root@m01 ~]$ ansible lb01 -m yum_repository -a 'name=httpd file=wj_nginx description=123456 baseurl=http://www.jd.com gpgcheck=no enabled=yes'
[root@lb01 /etc/yum.repos.d]$ cat wj_nginx.repo
[nginx]
baseurl = http://www.baidu.com
enabled = 1
gpgcheck = 0
name = xxxx
[httpd]
baseurl = http://www.jd.com
enabled = 1
gpgcheck = 0
name = 123456
# 删除仓库文件中的指定仓库,如果仓库删完,仓库文件也会消失
[root@m01 ~]$ ansible lb01 -m yum_repository -a 'name=nginx file=wj_nginx state=absent'
[root@lb01 /etc/yum.repos.d]$ cat wj_nginx.repo
[httpd]
baseurl = http://www.jd.com
enabled = 1
gpgcheck = 0
name = 123456
yum_repository模块详解
yum_repository
-name:仓库名称
-file:指定仓库的文件名
-description:仓库的描述(name)
-baseurl:仓库的url
-gpgcheck:是否检查公钥私钥
-no:不开启 0
-yes:开启 1 (不配置默认开启)
-enabled:是否开启仓库
-no:不开启 0
-yes:开启 1(不配置默认开启)
Ansible文件管理模块
对于文件管理,我们在学习Linux基础的时候,就学习了很多命令,比如创建,删除,移动,拷贝,下载等
copy模块
# 推送管理端优化文件至被管理端
[root@m01 ~]$ ansible lb01 -m copy -a 'src=/root/a.txt dest=/root'
[root@lb01 ~]$ ll
-rw-r--r-- 1 root root 7 Aug 10 18:15 a.txt
[root@lb01 ~]$ cat a.txt
123456
# 将管理端的b.txt文件也推到被管理端,并且也叫a.txt
[root@m01 ~]$ ansible lb01 -m copy -a 'src=/root/b.txt dest=/root/a.txt'
[root@lb01 ~]$ ll
-rw-r--r-- 1 root root 11 Aug 10 18:19 a.txt
## 原文件内容被覆盖
[root@lb01 ~]$ cat a.txt
xxxxxxxxxx
# 推送管理端文件至被管理端,被管理端文件名依然是a.txt,但是开启备份
[root@m01 ~]$ ansible lb01 -m copy -a 'src=/root/a.txt dest=/root/a.txt backup=yes'
[root@lb01 ~]$ ll
## 最新推送过来的文件
-rw-r--r-- 1 root root 7 Aug 10 18:23 a.txt
## 源文件被备份,以时间戳为名
-rw-r--r-- 1 root root 11 Aug 10 18:19 a.txt.98672.2021-08-10@18:23:33~
[root@lb01 ~]$ cat a.txt.98672.2021-08-10@18\:23\:33~
xxxxxxxxxx
[root@lb01 ~]$ cat a.txt
123456
# 直接推送信息到远端指定文件,原文件内容会被覆盖
[root@m01 ~]$ ansible lb01 -m copy -a "content='111111111' dest=/root/a.txt"
[root@lb01 ~]$ cat a.txt
111111111
# 推送管理端文件至被管理端,指定被管理端文件属主属组为nginx,权限是777,并且如果有重名文件就备份原文件再覆盖
[root@m01 ~]$ ansible lb01 -m copy -a 'src=/root/a.txt dest=/root owner=nginx group=nginx mode=777 backup=yes'
[root@lb01 ~]$ ll
-rwxrwxrwx 1 nginx nginx 7 Aug 10 19:47 a.txt
copy模块详解
copy
-src:指定被推送源文件的路径
-dest:指定目标路径
-owner:指定属主
-group:指定属组
-mode:指定权限
-backup:
-yes:如果目标路径,存在同名文件,就将目标文件备份
-no:不备份直接覆盖(默认)
-content:将指定文本内容覆盖到目标文件中
-remote_src:将命令变成cp,相当于将远端的源文件拷贝到远端的目标文件
-yes:将源文件,变成远端的源文件(ansible被管理端)
-no:源文件还是本地文件(ansible管理端 默认)
-follow:拷贝软连接
- yes:会将软连接一起拷贝
-no:会生成一个新的软连接文件
file模块
# 在远端创建wj_wb目录(并没有写入recurse递归创建)
[root@m01 ~]$ ansible web_group -m file -a 'path=/tmp/wj_wb/1_wb/2_wb state=directory'
## 默认目录是递归创建
[root@web01 ~]$ tree /tmp/wj_wb/
/tmp/wj_wb/
└── 1_wb
└── 2_wb
2 directories, 0 files
# 创建wj_file文件,指定权限777,属主属组是nginx
[root@m01 ~]$ ansible web_group -m file -a 'path=/tmp/wj_file state=touch mode=777 owner=nginx group=nginx'
[root@web01 ~]$ ll /tmp/wj_file
-rwxrwxrwx 1 nginx nginx 0 Aug 11 13:43 /tmp/wj_file
# 创建wj_file的软链接文件,指定软链接文件名为wj_file_link
[root@m01 ~]$ ansible web_group -m file -a 'src=/tmp/wj_file path=/tmp/wj_file_link state=link'
[root@web01 /tmp]$ ll
total 0
-rwxrwxrwx 1 nginx nginx 0 Aug 11 13:43 wj_file
lrwxrwxrwx 1 root root 12 Aug 11 13:47 wj_file_link -> /tmp/wj_file
# 删除远端指定文件
[root@m01 ~]$ ansible web_group -m file -a 'path=/tmp/wj_file_link state=absent'
# 修改远端文件的属性信息(属组属主,权限)
[root@m01 ~]$ ansible web_group -m file -a 'path=/tmp/wj_file state=file owner=root group=root mode=111'
## 修改前
[root@web01 /tmp]$ ll
-rwxrwxrwx 1 nginx nginx 0 Aug 11 13:43 wj_file
## 修改后
[root@web01 /tmp]$ ll
---x--x--x 1 root root 0 Aug 11 13:43 wj_file
file模块详解
-path:要创建的文件路径
-src:链接的源文件
-dest:链接的目标文件
-state
-link:软链接
-hard:硬链接
-touch:将path当成普通文件创建出来
-directory:将path当成目录创建出来
-absent:删除指定文件
-file:修改path指定的文件路径属性信息
-recurse:递归
-yes:开启递归
-no:默认
-owner:指定属主
-group:指定属组
-mode:权限
# 创建目录时,默认开启递归创建,并且如果创建时指定了权限及属组属主,那么也会递归修改
get_url模块
# 下载软件包到远端/tmp目录下,并指定文件权限及属主属组
[root@m01 ~]$ ansible backup -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz dest=/tmp/ owner=ftp group=ftp mode=644'
[root@backup ~]$ ll /tmp/
-rw-r--r-- 1 ftp ftp 11098483 Aug 11 16:13 wordpress-5.0.3-zh_CN.tar.gz
get_url模块详解
-url:指定安装包下载地址
-dest:指定下载的目录
-mode:指定下载后权限
-checksum:校验加密算法
-md5
-sha256
Ansible服务管理模块
service:能更改sentos6,sentos7的服务
systemd:只能更改sentos7的服务
# 关闭远端nginx服务
[root@m01 ~]$ ansible web01 -m service -a 'name=nginx state=stopped'
## 关闭前
[root@web01 ~]$ ps -fe|grep nginx
root 6709 1 0 08:06 ? 00:00:00 nginx: master process /usr/sbin/nginx
www 6710 6709 0 08:06 ? 00:00:00 nginx: worker process
root 8564 6958 0 16:16 pts/0 00:00:00 grep --color=auto nginx
## 关闭后
[root@web01 ~]$ ps -fe|grep nginx
root 8674 6958 0 16:17 pts/0 00:00:00 grep --color=auto nginx
service详解
-name:定义要更改服务的名称
-state:指定服务状态
-started:启动服务
-stopped:停止服务
-restarted:重启服务
-reloaded:重载服务配置文件
-enabled:开机自启
-yes:允许开机自启
-no:默认
Ansible用户管理模块
Ansible管理用户与组,通常使用user、group模块
group模块
# 在远端创建一个组,并指定组的gid是456
[root@m01 ~]$ ansible backup -m group -a 'name=sys gid=456'
# 移除指定的远端的组
[root@m01 ~]$ ansible backup -m group -a 'name=sys state=absent'
group模块详解
-name:指定创建的组名
-gid:指定组的gid
-state
-absent:移除远端主机的组
-present:创建远端主机的组(默认)
user模块
# 在backup上创建用户wj01,指定uid是567,指定登录的shell(无法登录),不创建家目录
[root@m01 ~]$ ansible backup -m user -a 'name=wj01 uid=567 shell=/sbin/nilogin create_home=no'
[root@backup ~]$ id wj01
uid=567(wj01) gid=1000(wj01) groups=1000(wj01)
# 删除用户及相关所有文件
[root@m01 ~]$ ansible backup -m user -a 'name=wj01 state=absent remove=yes'
[root@backup ~]$ id wj01
id: wj01: no such user
user模块详解
-name:用户名
-uid:指定uid -u
-group:指定gid或者组名 -g
-groups:指定追加附加组 -G
-append:追加,配合-G使用 -a
-shell:指定用户登录的shell -s
-comment:指定用户描述 -c
-create_home:是否创建家目录
-yes:创建(默认)
-no:不创建
-generate_ssh_key:是否创建秘钥对
-yes:创建
-no:不创建(默认)
-ssh_key_bits:私钥长度
-ssh_key_file:私钥的位置
-state:
-present:创建用户(默认)
-absent:删除用户
-remove
-yes:将用户的家目录等相关目录全部删除 -r
-no:默认
Ansible定时任务模块
cron模块
# 添加时间同步定时任务,文件中写入的信息需要引起来
[root@m01 ~]$ ansible backup -m cron -a 'name="时间同步" minute=*/2 job="/sbin/ntpdate time1.aliyun.com &>/dev/null"'
## 通过Ansible写入的定时任务会有独特的标识
[root@backup ~]$ crontab -l
# Create By:wj Time:2021-07-01 Nmae: 3 mins ntp time
*/3 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
#Ansible: 时间同步
*/2 * * * * /sbin/ntpdate time1.aliyun.com &>/dev/null
# 删除远端定时任务,通过name的配置
[root@m01 ~]$ ansible backup -m cron -a 'name="时间同步" state=absent'
cron模块详解
-name:定时任务的注释
-minute:分
-hour:时
-day:日
-month:月
-weekday:周
-job:要执行的命令
-state
-present:创建定时任务(默认)
-absent:删除定时任务(删除任务要根据name)
-user:指定定时任务的用户
Ansible磁盘挂载模块
mount模块
# 挂载远端目录至nfs共享目录中,并且将开机自动挂载文件写入/etc/fstab文件中
[root@m01 ~]$ ansible web01 -m mount -a 'path=/code/wordpress/wp-contend/uploads src=172.16.1.31:/data/wp_data fstype=nfs state=mounted'
# 卸载掉挂载点,并清除/etc/fstab写入的配置
[root@m01 ~]$ ansible web01 -m mount -a 'path=/code/wordpress/wp-contend/uploads state=absent'
mount模块详解
-path:指定挂载的路径
-src:被挂载的路径
-fstype:指定文件系统类型
-state:
-prsent:开机挂载,仅将挂载配置写入/etc/fstab,并不会立马挂载,需要重启
-absent:卸载设备,会清理/etc/fstab写入的配置
-mounted:挂载设备,并将配置写入/etc/fstab
-unmounted:卸载设备,不会清除/etc/fstab写入的配置
-opts:指定挂载的权限(可读可写)
Ansible防火墙模块
selinux模块
# 关闭远端机器selinux
[root@m01 ~]$ ansible backup -m selinux -a 'state=disabled'
-state:
-disabled:关闭selinux
firewalld模块
-service:根据服务放行端口-port: -端口/tcp-state -disabled:禁用端口 -enabled:放行指定端口
Ansible解压模块
unarchive模块
# 将管理端压缩包解压至远端指定目录下
[root@m01 ~]$ ansible backup -m unarchive -a 'src=/root/wordpress.tgz dest=/tmp'
[root@backup ~]$ ll /tmp/
total 4
drwxr-xr-x 5 666 666 4096 Jul 21 17:07 wordpress
unarchive模块详解
-src:指定压缩文件源文件
-dest:解压至的路径
-remove_src
-yes:压缩包在远端机器上
-no:默认,压缩包在管理端
# 注意:前提条件是,被管理端上必须有所有的解压命令
Ansible主机信息模块
在公司中总会有一些需求 比如:
1.根据不同主机不同IP创建对应IP的目录
2.根据不同主机不同主机名创建对应主机名的目录
3.自动化运维平台需要自动获取到主机的IP地址,内存信息,磁盘信息,主机名...等
4.如果安装数据库,分配内存为物理内存的80%,此时有3台不同物理内存的机器2G、4G、16G 写一个playbook的情况下,我需要获取到对应主机的内存并作出计算,写判断。
自动化运维setup模块
# 显示指定被管理端ipv4的信息
[root@m01 ~]$ ansible backup -m setup -a 'filter=ansible_all_ipv4_addresses'
backup | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.0.0.41",
"172.16.1.41"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
# 使用详解
ansible web01 -m setup:显示主机所有信息
## 系统内置变量
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。