Ansible 常用基础模块

Ansible 常用基础模块

Ansible的执行

  • ad-hoc
  • playbook

Ansible ad-hoc

ad-hoc:简而言之就是“临时命令”,执行完即结束,并不会保存

ad-hoc模式的使用场景

比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等

ad-hoc模式的命令使用

微信图片_20210810144045

语法:
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个数(只显示总的个数)。
posted @ 2021-08-16 22:04  AnOldSong  阅读(141)  评论(0编辑  收藏  举报