1、ansible
1、安装
配置腾讯yum源,阿里云报403,注意本地yum源也需要,有依赖
[epel]
name=epel
#baseurl=http://mirrors.aliyun.com/epel/7/x86_64
baseurl=https://mirrors.cloud.tencent.com/epel/7/x86_64/
gpgcheck=0
enable=1
yum clean all && yum makecache
yum -y install ansible
2、配置ansible管理节点和主机的连接
ssh-keygen
ssh-copy-id 20.81.11.81
ssh-copy-id 20.81.11.82
ansible all -m ping
3、ansible模块
ansible语法
ansible [主机清单] -m 模块 -a "参数"
ping模块
配置ansible主机清单
主机清单配置文件/etc/ansible/hosts
验证ansible
[root@m01 ~]# ansible oldboy -m ping
command命令模块
-a 就是基础命令模块常用命令使用
例子:
ansible [主机清单] -a "cat /etc/passwd"
shell命令模块
-m shell 对于偏复杂的命令使用,比如加cat 1|grep 1
例子:
ansible [主机清单] -m shell -a "cat 1|grep 1"
yum安装模块
-m yum 顾名思义用来安装的
参数:
name ---指定要安装的软件包名称,如果有多个,用","隔开
state ---指定使用yum的方法
installed,present ---安装软件包
removed,absent ---移除软件包
latest ---安装最新软件包
例子:
批量安装httpd和卸载
安装:ansible web -m yum -a "name=httpd state=installed"
卸载:ansible web -m yum -a "name=httpd state=removed"
copy推送文件模块
-m copy 推送文件,追加文件内容,附加文件权限
参数:
src --- 推送数据的源文件信息
dest --- 推送数据的目标路径
backup --- 对推送传输过去的文件,进行备份
content --- 直接批量在被管理端文件中添加内容
group --- 将本地文件推送到远端,指定文件属组信息
owner --- 将本地文件推送到远端,指定文件属主信息
mode --- 将本地文件推送到远端,指定文件权限信息
例子:批量推送文件
ansible [主机清单] -m copy -a "src=/fzl/1 dest=/fzl"
例子2:批量送文件并备份
ansible [主机清单] -m copy -a "scr=/fzl/1 dest=/fzl backup=yes" 如果/fzl/有1这个文件就备份
例子3:添加文件追加内容(覆盖慎用)并附带文件用户和组和权限
ansible [主机清单] -m copy -a "content='rsync_backup:1' dest=/etc/rsync.password owner=root group=root mode=600"
service模块
-m service 相当于systemctl
参数:
name # 定义要启动服务的名称
state # 指定服务状态是停止或是运行,停止和运行指令要写成过去时
started # 启动
stopped # 停止
restarted # 重启
reloaded # 重载
enabled # 是否让服务开启自启动
例子:
批量启动httpd服务,并添加一个首页,通过浏览器访问
ansible web -m service -a "name=httpd state=started enabled=yes"
group模块
-m group
- gid
设置组id
= name
需要管理的组名
- state
执行状态,absent 删除
present 创建(默认)
例1:创建组名www,并设置gid 666
[root@m01 ~]# ansible all -m group -a "name=www gid=666"
例2:修改www组的gid为888
[root@m01 ~]# ansible all -m group -a "name=www gid=888"
例3:删除www组
[root@m01 ~]# ansible all -m group -a "name=www gid=888 state=absent"
user模块
-m user
= name
用户名
- uid
uid
- group
gid或groupname
- state
执行状态,absent 删除
present 创建(默认)
- shell
登录shell,/bin/bash(默认),/sbin/nologin
- create_home
创建用户时,是否创建家目录,create_home=no
- password
用户密码,不能使用明文,需用使用openssl加密后的密码
例1:创建一个用户oldboy,指定uid 60000,gid 666,并设置密码为123
注意:password不能使用明文,需要加密,password的加密值需用使用双引号
# -1使用MD5进行加密 -stdin 非交互式
[root@m01 ~]# echo "123"| openssl passwd -1 -stdin
$1$YmQSB.yb$EeZphDZ7ror/8dASNSM.c1
[root@m01 ~]# ansible backup -m user -a 'name=oldboy uid=60000 group=666 password="$1$DlBUYXav$VhZv.G3YmzG8T85sbfP3b1"'
例2:创建一个程序用户www,指定uid666 gid666 不让登录 不创建家目录
[root@m01 ~]# ansible all -m user -a "name=www uid=666 group=666 shell=/sbin/nologin create_home=no"
file模块
= path
目标文件路径
dest(和path等价)
name(和path等价)
- src
源文件路径
- owner
属主
- group
属组
- mode
权限
- state
absent 删除
directory 创建目录
file 修改文件属性(默认)
touch 创建文件
link hard 链接
- recurse
递归
recurse=yes
例1:创建目录/data和/backup,属主666,属组666,递归
[root@m01 ~]# ansible all -m file -a "path=/data owner=666 group=666 recurse=yes state=directory"
例2:创建文件/etc/rsync.password,权限600
[root@m01 ~]# ansible all -m file -a "path=/etc/rsync.password state=touch mode=600"
例3:对/etc/hosts做个软链接,到/tmp/hosts
[root@m01 ~]# ansible all -m file -a "src=/etc/hosts path=/tmp/hosts state=link"
总结:file模块仅适合创建目录,修改所属和权限,创建链接,除开这些操作的其他文件管理都通过copy模块实现
mount模块
= path
挂载点
- src
需要挂载的设备
- fstype
挂在设备的文件系统
iso9660 光驱
ext4
xfs
nfs
cifs samba的共享文件系统
ntfs windows磁盘文件系统
- opts
挂载属性
noatime
noexec
nosuid
= state
挂载动作
present # 开机挂载,仅将挂载配置写入/etc/fstab
mounted # 挂载设备,并将配置写入/etc/fstab
unmounted # 卸载设备,不会清除/etc/fstab写入的配置
absent # 卸载设备,会清理/etc/fstab写入的配置
例1:通过nfs实现网络文件共享(综合小实验)
1)安装nfs
[root@m01 ~]# ansible nfs -m yum -a "name=nfs-utils state=installed"
2)启动服务
[root@m01 ~]# ansible nfs -m service -a "name=rpcbind state=started"
[root@m01 ~]# ansible nfs -m service -a "name=nfs state=started"
3)修改配置文件
方法一:在m01创建配置文件,使用copy模块推给nfs(建议使用)
[root@m01 ~]# mkdir -p /server/conf
[root@m01 ~]# echo '/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)' >/server/conf/exports
[root@m01 ~]# ansible nfs -m copy -a "src=/server/conf/exports dest=/etc/"
方法二:在m01上直接使用copy模块,推送文件内容
[root@m01 ~]# ansible nfs -m copy -a "content='/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)' dest=/etc/exports"
4)创建目录,用户,并修改所属
通过user group file模块来实现,参考上面的例子
5)重载配置文件
[root@m01 ~]# ansible nfs -m service -a "name=nfs state=restarted"
6)在web上挂载nfs的共享目录
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/var/www/html fstype=nfs state=mounted"
script模块
1)写个脚本,创建用户,并配置密码
[root@m01 scripts]# cat 1.sh
#!/bin/bash
useradd oldgirl
echo 123 |passwd --stdin oldgirl &>/dev/null && echo "创建密码成功"
2)运行脚本
[root@m01 ]# ansible all -m script -a "/server/scripts/1.sh"
cron模块
1)推送脚本至每台受控端
[root@m01 ]# ansible all -m file -a "path=/server/scripts state=directory mode=700"
[root@m01 ]# ansible all -m copy -a "src=/server/scripts/rsync_backup.sh dest=/server/scripts"
2)创建计划任务
- name
描述,必须要写,如果不写,默认为None,会导致无法指定删除某条计划任务
- job
任务(命令)
- state
执行状态,absent 删除
present 创建(默认)
disabled 注释定时任务
true 关闭
false 开启
- minute
Minute when the job should run ( 0-59, *, */2, etc )
[Default: *]
- hour
Hour when the job should run ( 0-23, *, */2, etc )
[Default: *]
- day
Day of the month the job should run ( 1-31, *, */2, etc )
(Aliases: dom)[Default: *]
- month
Month of the year the job should run ( 1-12, *, */2, etc )
[Default: *]
- weekday
Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )
(Aliases: dow)[Default: *]
例子:每天的凌晨1点执行rysnc_bakcup.sh [root@m01 ]# ansible all -m cron -a "name='Rsync Backup' hour=1 minute=0 job='/bin/sh /server/scripts/rsync_backup.sh &>/dev/null'" 例子:注释定时任务 ansible all -m cron -a "disabled=true job='/bin/sh /server/scripts/rsync_backup.sh &>/dev/null' name='Rsync Backup'"
unarchive模块
功能:解压缩
-m unarchive
unarchive模块有两种解压缩方式,一种是在ansible主机上解压缩后传到主机清单上的服务器。
第二种是在主机清单上解压缩。
参数:
src 需要解压缩我文件(绝对路径)
dest 解压缩后指定的目录
copy
yes
no
选择解压缩方式:一和二(上面有一和二是区别)
mode:设置解压缩后的文件权限
例子:
ansible pms -m unarchive -a 'src=/srv/tomcat8/apache-tomcat-8.0.29.tar.gz dest=/usr/local copy=no mode=0755'
wait_for模块
setup模块
fetch模块
功能:拉取被管理机的文件到本地,目前只支持单个文件
参数:
src 被管理端需要被拉取的文件
dest 管理端存放拉取到的文件位置
例子:
ansible web -m fetch -a "src=/testdir/testfile1 dest=/testdir/ansible/"
功能:
lineinfile模块用于替换文本内容和删除文本内容
参数:
path 指定要操作的文件对象
dest 指定要操作的文件对象
regexp 使用正则表达式(匹配条件,用于替换文件内容使用)
state 当需要删除对应文本时,需要设置state值absent,absent为缺席之意,表示删除,默认值present
insertbefore 在某行之前插入
insertafter 在莫行之后插入
line 要写入文件的内容
例子:
在文件末行插入文件
ansible [清单] -m lineinfile -a 'path=/root/test.txt insertafter="EOF" line="1"'
在文件首行插入文件
ansible [清单] -m lineinfile -a 'path=/root/test.txt insertbefore="BOF" line="1" state=present'
替换某行内容
ansible [清单] -m lineinfile -a 'path=/root/test.txt regexp=5 line=1'
删除某行内容
ansible [清单] -m lineinfile -a 'path=/root/test.txt regexp="1" state=absent'
synchronize模块
rsync模块
filesysten模块
功能:
在块设备上创建文件系统
参数:
dev:目标块设备
force:在一个已有文件系统 的设备上强制创建
fstype:文件系统的类型
opts:传递给mkfs命令的选项
例子:
ansible test -m filesystem -a 'fstype=ext2 dev=/dev/sdb1 force=yes'
ansible test -m filesystem -a 'fstype=ext4 dev=/dev/sdb1 opts="-cc"'
get_url模块
功能:
用于从http、ftp、https服务器上下载文件(类似于wget)
参数:
sha256sum:下载完成后进行sha256 check;
timeout:下载超时时间,默认10s
url:下载的URL
url_password、url_username:主要用于需要用户名密码进行验证的情况
use_proxy:是事使用代理,代理需事先在环境变更中定义
例子:
get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440
get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf sha256sum=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
debug模块
hostname模块
ansible web -m hostname -a "name=node"