Ansible模块


作用:
批量命令执行
批量安装服务
批量配置同步
批量任务执行
批量代码部署
特点:
提高工作效率
减少维护成本
提高准确性
减少重复性
读取顺序:
1、$ANSIBLE_CONFIG
2、./ansible.cfg
3、~/.ansible.cfg
4、/etc/ansible/ansible.cfg

选项作用使用方法

/etc/ansible/hosts ## 默认的存放主机信息的文件
--version #ansible版本信息
-v #显示详细信息
-i #主机清单文件路径,默认是在/etc/ansible/hosts
-m #使用的模块名称,默认使用command模块
-a #使用的模块参数,模块的具体动作
-k #提示输入ssh密码,而不使用基于ssh的密钥认证
-C #模拟执行测试,但不会真的执行
-T #执行命令的超时

Ansible ad-hoc

什么是ad-hoc?
ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存
ad-hoc模式的使用场景?
比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等

ad-hoc模式的命令使用

image-20240604144615562

返回的颜色来判断

绿色: 代表被管理端主机没有被修改 代表成功
黄色: 代表被管理端主机发现变更 代表成功
红色: 代表出现了故障,注意查看提示 代表失败

ansible的执行任务

ad-hoc linux基础命令
playbook linux的脚本

ansible查看帮助

ansible-doc + 模块名字

定义机器组(/etc/ansible/hosts)

[root@m01 ~]# cat hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[lb_group]
lb01 ansible_ssh_host=10.0.0.5
lb02 ansible_ssh_host=10.0.0.6
[lnmp:children] [标签组的名字:children]
web_group 	主机标签
lb_group 	主机标签

ad-hoc常用模块

command 		# 执行shell命令(不支持管道等特殊字符)
shell 			# 执行shell命令
scripts			# 执行shell脚本
yum_repository 	 # 配置yum仓库
yum 			# 安装软件
copy 			# 变更配置文件
file 			# 建立目录或文件
service 		# 启动与停止服务
mount 			# 挂载设备
cron 			# 定时任务
get_url 		#下载软件
firewalld 		# 防火墙
selinux 		#selinux

ansible命令模块(command,shell)

## command模块的-a动作里面 不支持特殊符号
############### command ####################
[root@m01 .ssh]# ansible all -m command -a 'free -h'
lb01 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           972M        183M        156M         31M        632M        603M
Swap:          1.0G        264K        1.0G
lb02 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           972M        182M        143M         31M        645M        603M
Swap:          1.0G        264K        1.0G

################ shell ###################
[root@m01 .ssh]# ansible all -m shell  -a 'ps aux | grep nginx'
lb01 | CHANGED | rc=0 >>
root      16198  0.0  0.1 113284  1208 pts/1    S+   14:55   0:00 /bin/sh -c ps 
root      16200  0.0  0.0 113284   188 pts/1    R+   14:55   0:00 /bin/sh -c ps 
lb02 | CHANGED | rc=0 >>
root      24766  0.0  0.1  49072  1260 ?        Ss   07:05   0:00 nginx: master 
nginx     24767  0.0  0.1  49548  1988 ?        S    07:05   0:00 nginx: worker 
root      28108  0.0  0.1 113284  1208 pts/1    S+   14:55   0:00 /bin/sh -c ps 
root      28110  0.0  0.0 113284   188 pts/1    R+   14:55   0:00 /bin/sh -c ps 

ansible执行脚本命令(script)

cat 1.sh  ####(文件存在于ansible本机)
echo $RANDOM
[root@m01 ~]# ansible all -m script -a '/root/1.sh'
lb02 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.0.0.6 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 10.0.0.6 closed."
    ], 
    "stdout": "29791\r\n", 
    "stdout_lines": [
        "29791"
    ]
}
lb01 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.0.0.5 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 10.0.0.5 closed."
    ], 
    "stdout": "21182\r\n", 
    "stdout_lines": [
        "21182"
    ]
}

file(文件管理)

动作:
src 		# 指定链接的源文件
dest		# 指定链接的目标文件
path 		# 指定文件的路径
owner 		# 文件的属主
group 		# 文件的属组
mode 		# 指定文件/目录的权限
recurse= 	# 递归   (yes/true)(no/false) 例子:recurse=yes
state=
	touch 			# 创建文件
	directory		# 创建目录
	absent 			# 删除
	link 			# 软链接
	hard 			# 硬链接
	
##### 创建目录/opt/aaa/bbb #####
[root@m01 ~]# ansible all -m file -a "path=/opt/aaa/bbb state=directory"
lb02 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/opt/aaa/bbb", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
lb01 | CHANGED => {
}

###### 创建/opt/1.giao 权限007 用户nginx 组root #####
ansible all -m file -a "path=/opt/1.giao state=directory owner=nginx group=root mode=007 "
[root@m01 ~]# ansible all -m shell  -a "ls -ld /opt/1.giao "
lb01 | CHANGED | rc=0 >>
d------rwx 2 nginx root 6 Jun  4 15:11 /opt/1.giao
lb02 | CHANGED | rc=0 >>
d------rwx 2 nginx root 6 Jun  4 15:11 /opt/1.giao


###### 创建/opt/1.giao的软连接到/tmp/2.giao uid=root gid=nginx 权限=777 ########
[root@m01 ~]# ansible all -m file -a "src=/opt/1.giao dest=/tmp/2.giao state=link owner=root group=nginx mode=777 "
lb01 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/tmp/2.giao", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 11, 
    "src": "/opt/1.giao", 
    "state": "link", 
    "uid": 0
[root@m01 ~]# ansible all -m shell  -a "ls -ld /tmp/2.giao "
lb01 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 11 Jun  4 15:16 /tmp/2.giao -> /opt/1.giao
lb02 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 11 Jun  4 15:16 /tmp/2.giao -> /opt/1.giao

##### 删除软连接2.giao 和目录 /opt/aaa/ ########
ansible all -m file -a 'path=/opt/aaa state=sbsent'
[root@m01 ~]# ansible all -m shell  -a "ls -l /opt/ "
lb01 | CHANGED | rc=0 >>
total 0
drwxrwxrwx 2 root nginx 6 Jun  4 15:11 1.giao
lb02 | CHANGED | rc=0 >>
total 0
drwxrwxrwx 2 root nginx 6 Jun  4 15:11 1.giao

ansible all -m file -a 'path=/tmp/2.giao  state=sbsent'

copy(复制文件)

# 动作
src 	# 指定原文件
dest 	# 指定目标路径
owner 	# 复制过去的属主
group 	# 复制过去的属组
mode 	# 复制过去的权限
backup 备份       ### 备份原有的目标文件防止覆盖
		- yes
		- no (默认)
remote_src 		# 远端文件
		- yes/true
		- no/false (默认)
content 		# 指定内容写入文件

vim 6.giao
一giao窝里giao

######## 复制本机文件6.giao到机器组/tmp下 #########
[root@m01 ~]# ansible all -m copy -a "src=/root/6.giao dest=/tmp"
[root@m01 ~]# ansible all -m shell  -a "cat /tmp/6.giao"
lb01 | CHANGED | rc=0 >>
一giao窝里giao
lb02 | CHANGED | rc=0 >>
一giao窝里giao

###### 复制机组机器/tmp/6.giao到机器组/root/6.giao  ###########
[root@m01 ~]# ansible all -m copy -a "src=/tmp/6.giao dest=/root remote_src=yes"
[root@m01 ~]# ansible all -m shell  -a "cat /root/6.giao"
lb01 | CHANGED | rc=0 >>
一giao窝里giao
lb02 | CHANGED | rc=0 >>
一giao窝里giao

#######-复制本机hosts到/root/6.giao 备份机器组原6.giao文件-########
[root@m01 ~]# ansible all -m copy -a "src=/etc/hosts dest=/root/6.giao backup=yes"
[root@m01 ~]# ansible all -m shell  -a "cat /root/6.giao"
lb01 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4
::1         localhost localhost.localdomain localhost6 
lb02 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4
::1         localhost localhost.localdomain localhost6 
[root@m01 ~]# ansible all -m shell  -a "ls -l /root"
-rw-r--r--  1 root root  186 Jun  4 15:34 6.giao
-rw-r--r--  1 root root   18 Jun  4 15:28 6.giao.29988.2024-06-04@15:34:53~
[root@m01 ~]# ansible all -m shell  -a "cat /root/6.giao.*"
lb02 | CHANGED | rc=0 >>
一giao窝里giao
lb01 | CHANGED | rc=0 >>
一giao窝里giao

##### 复制本机/root/6.giao 到机器组/opt/ uid=nginx gid=root 权限=000 ########
[root@m01 ~]# ansible all -m copy -a "src=/root/6.giao dest=/opt owner=nginx group=root mode=000 "
[root@m01 ~]# ansible all -m shell  -a "ls -l /opt/6.giao"
lb02 | CHANGED | rc=0 >>
---------- 1 nginx root 18 Jun  4 15:45 /opt/6.giao
lb01 | CHANGED | rc=0 >>
---------- 1 nginx root 18 Jun  4 15:45 /opt/6.giao


###### 把giao写入机器组/root/1.sh 并备份 #################
[root@m01 ~]# ansible all -m copy -a 'dest=/root/1.sh content="giao" backup=yes'


yum(软件管理)

# 安装服务
name
	服务名
	本地安装
	源安装
state 					#指定使用yum的方法
	installed present 	 #安装软件包
	removed,absent 		#移除软件包
	latest 				#安装最新软件包
	download_only 		# 只下载不安装
		- yes / true
		- no / false(默认)
		
# 安装nginx
ansible nfs -m yum -a 'name=nginx state=present'
ansible nfs -m yum -a 'name=mariadb-server state=present'

yum_repository(yum源)

## 一个标准的yum源的配置文件
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

# 动作
name 			# 仓库的名字
description 	# 仓库的描述信息
baseurl 		# 仓库的url地址
file 			# 没有指定file名字 名字和name一致
owner 			# 属主
group 			# 属组
gpgkey
gpgcheck 		# 密钥检测对
		- yes
		- no
enabled
		- yes
		- no
state
		- persent(默认) # 创建仓库
		- absent 		# 删除仓库
		
		
########### 新建nginx的官方源 ##################
ansible web01 -m yum_repository -a 'name=nginx_stabledescription=nginx_stable_repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=yesenabled=yes gpgkey=https://nginx.org/keys/nginx_signing.key file=nginx state=present'

############ 删除nginx的官方源 ##################
ansible web01 -m yum_repository -a 'name=nginx_stabledescription=nginx_stable_repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=yesenabled=yes gpgkey=https://nginx.org/keys/nginx_signing.key file=nginx state=absent'

ansible web01 -m yum_repository -a 'name=nginx_stable file=nginx state=absent'

get_url(批量下载)

url # 下载的地址
dest # 下载的路径
mode # 下载后的权限

http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz

ansible web01 -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz dest=/opt'

service(系统服务管理)

# 启停服务
name 指定服务名
state
	- started 启动服务 systemctl start...
     - stopped 停止服务 systemctl stop...
	- restarted 重启服务 systemctl restart...
	- reloaded 重载服务 systemctl reload...
# 停止nginx服务
ansible nfs -m service -a 'name=nginx enabled=yes state=stopped'
# 启动nginx服务
ansible nfs -m service -a 'name=nginx enabled=yes state=started'

systemd(系统服务管理)

# 启停服务
name 指定 服务名
state
	- started 启动服务 systemctl start...
	- stopped 停止服务 systemctl stop...
	- restarted 重启服务 systemctl restart...
	- reloaded 重载服务 systemctl reload...
enabled
	- yes
	- no (默认)
maskd 禁止服务启动
	- yes
	- no (默认)
deamon_reload 更新systemd启动脚本
	- yes
	- no (默认)
	
# 停止nginx服务
ansible nfs -m systemd -a 'name=nginx enabled=yes state=stopped'
# 启动nginx服务
ansible nfs -m systemd -a 'name=nginx enabled=yes state=started'

user(用户管理)

# 动作
name           # 用户名
comment        # 用户的描述信息
uid            # 指定用户的uid
group 			# 指定用户的gid 前提组必须存在
shell 			# 用户指定shell
append 			# -a 指定用户的附加组 追加附加组
groups 			# -G 指定用户的附加组
state
	- present(默认) # 创建用户
	- absent # 删除用户
remove
	- yes userdel -r 删除用户的家目录
	- no(默认)
ssh_key_file # 指定私钥的位置
ssh_key_bits # 创建用户的同时 创建密钥
create_home
	- yes # 创建用户的同时 创建用户家目录
	- no # 创建用户的同时 不创建家目录

www
useradd www -u 666 -g 666 -s /sbin/nologin -M

ansible nfs -m user -a 'name=www uid=666 group=666 shell=/sbin/nologin create_home=no state=present'

group(组管理)

groupadd www -g 666
# 动作
name # 组的名字
gid # 指定组的id
state
	- present(默认) # 创建组
	- absent # 删除组
ansible nfs -m group -a 'name=www gid=666 state=present state=present'

cron(定时任务)

# 管理定时任务
00 04 * * * /usr/sbin/ntpdata time1.aliyun.com &> /dev/null
# 动作
name # 定时任务的注释信息
minute 分
hour   时
day    日
mouth   月
weekday 周
job # 指定的任务
state
	- present(默认) #创建定时任务
	- absent #删除定时任务

# 创建定时任务
ansible nfs -m cron -a 'name=test job="/usr/sbin/ntpdate time1.aliyun.com &>/dev/null"'

# 删除定时任务
ansible nfs -m cron -a 'name=test state=absent'

mount(挂载)

mount -t nfs 172.16.1.31:/wp_data /code/wordpress/wp-content/uploads
# 动作
path 	# 挂载路径/code/wordpress/wp-content/uploads/
src		# 挂载源 172.16.1.31:/wp_data
fstype # 文件类型
state
	- present # 只将挂载信息记录在/etc/fstab (永久挂载 开机挂载)
	- mounted # 立刻挂载 将挂载信息记录在/etc/fstab (立刻挂载)
	- umounted # 卸载设备 不会删除/etc/fstab的内容
	- absent # 卸载设备 会清除/etc/fstab内容
挂载 mounted
卸载 absent

# 挂载
ansible web01 -m mount -a 'path=/code/wordpress/wp-content/uploadssrc=172.16.1.31:/data fstype=nfs state=mounted'
# 取消挂载
ansible web01 -m mount -a 'path=/code/wordpress/wp-content/uploadssrc=172.16.1.31:/data fstype=nfs state=absent'

unarchive(解压文件)

unarchive
# 可以解压所有的包 但是对端必须有解压的命令
# 动作
src # 指定的压缩包
dest # 解压的路径
ower # 解压开之后的属主
group # 解压开之后的属组
mode # 解压开的路径
remote_src # 告诉ansible压缩包在被控端的哪个
	- yes
	- no
# 把m01的包解压到nfs的指定目录下 并且指定属主和属组(用户必须存在)
ansible nfs -m unarchive -a 'src=/root/wordpress-5.0.3-zh_CN.tar.gz dest=/code
owner=www group=www'
# 把对面nfs的包解压到对端的指定目录下 并且指定属主和属组(用户必须存在)
ansible nfs -m unarchive -a 'src=/tmp/wordpress-5.0.3-zh_CN.tar.gz dest=/test
owner=www group=www remote_src=yes'

archive(压缩模块)

### 压缩远端的文件,目录
path:    #### 压缩的路径
dest:    #### 压缩后的目标路径名称
remove:  #### 压缩后删除

mysql_user(数据库用户管理)

# 作用:管理数据库用户
mysql
grant all on *.* to wp_user@'172.16.1.%' identified by '123';
# 动作
name # 指定用户名 wp_user
host # 指定主机域 172.16.1.%
password # 指定密码 123
priv # 制定权限 '*.*:ALL'
login_user # mysql的登录用户 (如果进入数据库时直接mysql的可以不写)
login_password # mysql对应登录用户的密码(如果进入数据库时直接mysql的可以不写)
state
	- present # 创建用户
	- absent # 删除用户

############# 需要先安装 MySQL-python #####################

# 编辑yml文件
- hosts: db01
  tasks:
    - name: 创建wc_user数据库用户
	  mysql_user:
	    name: wc_user
	    host: '172.16.1.%'
	    password: '123'
	    priv: '*.*:ALL'
	    state: present
#####  mysql查看用户 : select user,host from mysql.user;

mysql_db(数据库管理)

# 管理mysql的库
create database wc
	## 数据库的备份
	- 如果没有密码
	mysqldump -B wp > /tmp/wp.sql
	- 如果有root和密码
	mysqldump -uroot -p123 -B wp > /tmp/wp.sql
	## 导入备份数据
	mysql < /tmp/wp.sql
	主机配置
	mysql -uroot -p123 < /tmp/wp.sql
	
# 动作
name 		# 指定库名 wc
target 		# 导出数据库存放的路径
login_user   # 数据库的登录用户
login_password # 数据库的登录密码
state
	- present 		# 创建库
	- absent 		# 删除库
	- dump 			# 导出数据
	- import 		# 导入数据
	
# 创建数据库的yml
- hosts: db01
  tasks:
	- name: 创建wc库
      mysql_db:
      name: wc
      state: present

# 导出库的数据
mysqldump -B wp > /tmp/wp.sql
- hosts: db01
  tasks:
    - name: 导出wc库
      mysql_db:
      name: wc
      target: /tmp/wc.sql
      state: dump


# 导入数据
导入wc库 需要MySQL-python程序
- hosts: nfs
  tasks:
    - name: 安装python连接数据库
      yum:
      name: MySQL-python
      state: present
    - name: 导入wc库
      mysql_db:
      name: wecenter
      target: /tmp/wc.sql
      state: import

selinux(selinux控制)

selinux
  state: 
	disabled
	enabled