环境部署
m01 192.168.1.170 ansible管理端
backup 192.168.1.171 ansible受控端
nfs 192.168.1.172 ansible受控端
web01 192.168.1.173 ansible受控端
web02 192.168.1.174 ansible受控端
1、安装ansible
[root@localhost ~]# hostnameclt set-hostname m01
[root@localhost ~]# bash
[root@m01 ~]# yum install -y ansible
//查看版本
[root@m01 ~]# ansible --version
ansible 2.9.23
2、ssh部署公钥认证
利用非交互式工具实现批量分发公钥与批量管理服务器
配置所有主机相互SSH登录无密码验证
[root@m01 ~]# ssh-keygen -t rsa
[root@m01 ~]# ssh-copy-id 192.168.1.171
[root@m01 ~]# ssh-copy-id 192.168.1.172
[root@m01 ~]# ssh-copy-id 192.168.1.173
[root@m01 ~]# ssh-copy-id 192.168.1.174
3、配置ansible主机清单
[root@m01 ~]# vim /etc/ansible/hosts #编辑,在最后添加一行
写法一:
[nfzl]
192.168.1.171
192.168.1.172
192.168.1.173
192.168.1.174
写法二:
[nfzl]
192.168.1.171 ansible_ssh_pass='talent'
192.168.1.172 ansible_ssh_pass='talent'
192.168.1.173 ansible_ssh_pass='talent'
192.168.1.174 ansible_ssh_pass='talent'
[root@backup ~]# rm -rf .ssh/authorized_keys #删除公钥
写法三
[nfzl]
192.168.1.171 ansible_ssh_user=root ansible_ssh_pass='talent' ansible_ssh_port=22
192.168.1.172 ansible_ssh_pass='talent'
192.168.1.173 ansible_ssh_pass='talent'
192.168.1.174 ansible_ssh_pass='talent'
写法四_拆分密码版
[nfzl]
192.168.1.171
192.168.1.172
192.168.1.173
192.168.1.174
[nfzl:vars]
ansible_ssh_pass='talent'
写法五_建议写法
[backup]
192.168.1.171
[nfs]
192.168.1.172
[web]
192.168.1.173
192.168.1.174
[nfzl:children]
backup
nfs
web
4、测试
[root@m01 ~]# ansible nfzl -m ping
[root@m01 ~]# ansible nfs -m ping
[root@m01 ~]# ansible nfzl -m command -a "hostname"
[root@m01 ~]# ansible nfzl -m shell -a "df -h | grep /$" #shell支持管道符
[root@m01 ~]# ansible nfzl -m shell -a "df -h " -f 2 #-f:指定一次显示返回主机信息的量
[root@m01 ~]# ansible nfzl -m shell -a "echo talent | passwd --stdin nfzl" -f 2 #修改密码
5、Aansible常用模块
在linux系统里把多个命令集合写到文件里,叫做脚本 在Ansible中把多个模块集中写到文件里,叫做剧本 剧本:就是把多个模块写到一个文件里来完成一个任务
1、 Ad-Hoc:命令 -> 文件 =脚本
2、Ansible playbook:模块 -> 文件 =剧本
Ansible注意事项->提示颜色信息说明:
翔黄色:对远程节点进行相应修改
帽子绿:对远程节点不进行相应修改,或者只是对远程节点信息进行查看
深红色:操作执行命令有异常
浅紫色:表示对命令执行发出警告信息(可能存在问题,给你一下建议)
常用模块:
1、command 执行命令 command只能执行简单的命令
2、shell 执行命令 shell 可以使用管道
3、yum 安装软件模块
4、copy 配置模块
5、service 启动服务模块
6、user 用户管理
7、file 创建目录,创建文件,往文件里写内容
8、cron 定时任务
9、mount 挂载
模块动作
-a : 指定要执行的动作,如具体命令
-f:指定一次显示返回主机信息的量,如-f 1则一台主机一台主机的返回信息,-f 2则两台两台的返回主机结果信息
Examples
[root@m01 ~]# ansible nfzl -m shell -a "df -h " -f 2
5.1 yum模块
yum模块用来在远程机器上安装软件包
在用yum模块安装软件之前先保证远端机器的yum源可用
Examples
[root@m01 ~]# ansible web -m yum -a "name=httpd state=present"
name —指定要安装的软件包
state —指定使用yum的哪些方法
installed, present —安装软件包
removed, absent —移除软件包
latest —安装最新软件包
5.2 copy模块
copy模块用来把本地文件批量传输到多台服务器上
Examples
#示例一 显示黄色证明拷贝成功,如果在/etc/passwd文件没有变动的情况下再次拷贝则显示绿色表示无任何改动,只有在文件有变化的时候才会进行拷贝
[root@m01 ~]# ansible nfzl -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
#示例二 运行结果是对被管理机目标文件拷贝前的文件进行备份
[root@m01 ~]# ansible nfzl -m copy -a "src=/etc/passwd dest=/tmp/test.txt backup=yes"
#示例 三 运行结果是将用户和密码写进Rsync/etc/rsync.passwd文件中,并且指定属主和属组都为root,权限设置600
[root@m01 ~]# ansible backup -m copy -a "content='rsync_backup:talent' dest=/etc/rsync.passwd owner=root group=root mode=600"
src —— 推送数据的源文件信息
dest —— 推送数据的目标路径
backup —— 对推送传输过去的文件进行备份
content —— 直接批量在被管理段文件中添加内容
group —— 将本地文件推送到远端,指定文件属组信息
owner —— 将本地文件推送到远端,指定文件属主信息
mode —— 将本地文件推送到远端,指定文件权限信息
5.3 service模块
service是服务管理模块
Examples
[root@m01 ~]# ansible web -m service -a "name=httpd state=started enabled=yes"
name —定义要启动服务的名称
state —指定服务状态是停止或运行,停止和运行指令要写成过去时
started —启动
stopped —停止
restarted —重启
reloaded —重载
enabled —是否让服务开启自启动
5.4 script模块
执行本地脚本,不用传输到远端,执行结果会作用于远端服务器上
[root@m01 ~]#mkdir -p /server/scripts/
[root@m01 scripts]# cd /server/scripts/
[root@m01 scripts]# vim change_passwd.sh
#!/bin/bash
useradd nfzl
echo talent | passwd --stdin nfzl && echo "password create successfully"
[root@m01 scripts]# ansible nfzl -m script -a "/server/scripts/change_passwd.sh"
5.5 file模块
file模块用来创建文件或目录
Examples
#示例1 创建目录
[root@m01 ~]# ansible nfzl -m file -a "path=/server/scripts state=diretory"
#示例2 创建文件,并设定属主、属组、权限
[root@m01 ~]# ansible all -m file -a "path=/server/scripts/nfzl.txt state=touch owner=nfzl group=root mode=600"
#示例3 递归授权目录的方式
[root@m01 ~]# ansible all -m file -a "path=/var/www/html state=directory owner=root group=root mode=700"
[root@m01 ~]# ansible all -m file -a "path=/data state=directory owner=www group=www recurse=yes"
path —指定远程主机目录或文件信息
recurse —递归授权
state —
directory —在远端创建目录
touch —在远端创建文件
link —link或hard表示创建连接文件
absent —表示删除文件或目录
mode —设置文件或目录权限
owner —设置文件或目录属主信息
group —设置文件或目录属组信息
5.6 user模块
Examples
#示例一、创建joh用户,uid是1008,基本组是adm
[root@m01 ~]# ansible nfzl -m user -a "name=joh uid=1008 group=adm"
#示例二、创建jon用户,登录shell是/sbin/nologin,追加bin,sys两个附件组
[root@m01 ~]# ansible nfzl -m user -a "name=jon shell=/sbin/nologin groups=bin,sys"
#示例三、创建jsm用户,为其添加talent作为登录密码,并且创建家目录
[root@m01 ~]# ansible nfzl -m debug -a "msg={{'talent' | password_hash('sha512','salt')}}"
192.168.1.171 | SUCCESS => {
"msg": "$6$salt$MUVhjPhKyI2uE9sPg7185PcBQFlDwLGPbVTx.CsD6GXQbRGsUfmjsSfb9e9ej2.vLgmBI5CtgFq1plbD0a6tM."
}
[root@m01 ~]#ansible nfzl -m user -a "name=jsm password=$6$salt$MUVhjPhKyI2uE9sPg7185PcBQFlDwLGPbVTx.CsD6GXQbRGsUfmjsSfb9e9ej2.vLgmBI5CtgFq1plbD0a6tM create_home=yes"
#示例四、移除joh用户 (state=ansent且remove=yes,删除用户同时删除家目录)
[root@m01 ~]# ansible nfzl -m user -a "name=xuyong state=absent remove=yes"
#示例五 创建用户httpd 并用户生成 ssh 密钥对
[root@m01 ~]# ansible nfzl -m user -a 'name=httpd generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'
name -添加和删除的用户名
uid —指定用户的uid
group —指定用户的组名
groups —指定附加组名称
password —给用户添加密码
shell —指定用户登录的shell
create_home —是否创建家目录
remove -是否创建家目录yes\no
5.7 group模块
Examples
#示例一、创建news基本组,指定uid为678
[root@m01 ~]# ansible nfzl –m group –a “name=news gid=678 state=present”
#示例二、创建http系统组,指定uid为778
[root@m01 ~]# ansible nfzl –m group –a “name=http gid=778 system=true state=present”
#示例三、删除基本组news
[root@m01 ~]# ansible nfzl –m group –a “name=news state=absent”
name ——指定创建的组名
gid ——指定组的gid
state
absent ——移除远端主机的组
present ——创建远端主机的组(default)
system ——yes、no(default)是否创建系统组
5.8 cron模块
定时计划任务模块
Examples
#示例一、添加定时任务。每分钟执行一次/server/scripts/change_passwd.sh
[root@m01 ~]# ansible nfzl -m cron -a "name=job1 job='/bin/bash /server/scripts/change_passwd.sh'"
#示例二、添加定时任务。每分钟执行一次ls * * * * * ls > /dev/null
[root@m01 ~]# ansible nfzl -m cron -a "name=job2 job='ls > /dev/null'"
#示例三、添加定时任务。每天的凌晨2点和5点执行一次ls * * * * * ls > /dev/null
[root@m01 ~]# ansible nfzl -m cron -a "name=job3 minute=0 hour=5,2 job='ls > /dev/null'"
#示例四、关闭定时任务,使定时任务失效
[root@m01 ~]# ansible nfzl -m cron -a "name=job1 job='/bin/bash /server/scripts/change_passwd.sh' disabled=yes"
name ——备注计划任务,在同样一个计划任务用ansible执行第二次的时候,如果远端主机已经有该相同备注的计划任务时,会不做任何操作,如果没有该计划任务的主机时则会执行,所以一定要加name备注避免重复
disabled ——注释计划任务(yes|no)
minute ——分钟(default *)
hour ——小时(default *)
day ——日(default *)
month ——月(default *)
weekday ——周(default *)
job ——任务
分时日月周都默认为*,在需要的时候可以单独添加
5.9 mount模块
环境准备
1、将192.168.1.172作为nfs服务端,192.168.1.173、192.168.1.174作为客户端挂载
[root@m01 ~]# ansible nfs -m yum -a "name=nfs-utils state=present"
[root@m01 ~]# ansible nfs -m file -a "path=/data state=directory"
[root@m01 ~]# ansible nfs -m copy -a "content='/data 192.168.1.0/24(rw,sync)' dest=/etc/exports"
[root@m01 ~]# ansible nfs -m service -a "name=nfs state=restarted"
挂载模块
Examples
#示例一、仅将挂载的配置写入/etc/fstab, 并不会执行挂载操作
[root@m01 ~]#ansible web -m mount -a "src=192.168.1.172:/data path=/var/www/html fstype=nfs opts=defaults state=present"
#示例二、临时挂载设备,并将挂载信息写入/etc/fstab
[root@m01 ~]#ansible web -m mount -a "src=192.168.1.172:/data path=/var/www/html fstype=nfs opts=defaults state=mounted"
#示例三、临时卸载,不会清理/etc/fstab
[root@m01 ~]#ansible web -m mount -a "src=192.168.1.172:/data path=/var/www/html fstype=nfs opts=defaults state=unmounted"
#示例四、卸载,不仅临时卸载,同时会清理/etc/fstab
[root@m01 ~]#ansible web -m mount -a "src=192.168.1.172:/data path=/var/www/html fstype=nfs opts=defaults state=absent"
path ——目标挂载目录
src ——挂载源
fstype ——挂载类型
opts ——挂载选项
state ----
absent ——卸载设备,会删除/etc/fstab写入的配置
unmounted ——卸载设备,不会删除/etc/fstab写入的配置
mounted ——挂载设备,将配置写入/etc/fstab
present ——仅将配置写入/etc/fstab,不会挂载设备(开机挂载)
5.10 selinux
关闭selinux
[root@m01 ~]# ansible nfzl -m selinux -a "state=disabled"
5.11 firewalld
[root@m01 ~]# ansible nfzl -m firewalld -a "name=firewalld state=tarted"
Examples
#示例一 永久放行httpds的流量
[root@m01 ~]# ansible nfzl -m firewalld -a "zone=public service=https permanent=yes state=enabled"
#示例二 永久放行8081端口的流量,只有重启才会生效
[root@m01 ~]# ansible nfzl -m firewalld -a "zone=public prot=8080/tcp permanent=yes state=enabled"
#示例三 放行8080-8090的所有TCP端口流量,临时和永久都生效
[root@m01 ~]# ansible nfzl -m firewalld -a "zone=public prot=8080-8090/tcp permanent=yes immediate=yes state=enabled"
5.12 get_url
Examples
#示例一 下载互联网的软件至本地
[root@m01 ~]# ansible nfzl -m get_url -a "http://mirrors.aliyun.com/repo/epel-7.repo" dest=/etc/yum.repos.d/epel.repo
网友评论