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模式的命令使用
返回的颜色来判断
绿色: 代表被管理端主机没有被修改 代表成功
黄色: 代表被管理端主机发现变更 代表成功
红色: 代表出现了故障,注意查看提示 代表失败
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