#创建秘钥 ssh-keygen -t dsa #分发公钥 ssh-copy-id -i /root/.ssh/id_dsa.pub -p 22 root@172.20.10.3 #秘钥登录测试 ssh root@172.20.10.3 "hostname -i"
#免交互创建秘钥【用于脚本创建】 ssh-keygen -t dsa -f ~/.ssh/id_rsa -N "" -q #-t指定秘钥类型 -f指定秘钥文件保存的路径 -N免交互方式指定密码信息 -q不输出信息,减少信息输出
ssh服务分发公钥执行过程
①. 管理服务器创建私钥和公钥(密钥对)
②. 将公钥文件远程传送复制到被管理服务器相应用户~/.ssh/id_dsa.pub下,并修改.ssh目录权限为700
③. 修改公钥文件文件名称为authorized_keys,授权权限为600
④. 利用ssh服务配置文件的配置参数,进行识别公钥文件authorized_keys
⑤. 进而实现基于密钥远程登录服务器(免密码登录/非交互方式登录)
sshpass -p123456 ssh-copy-id -i ~/.ssh/id_dsa.pub root@172.20.10.5 -o StrictHostKeyChecking=no
#sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码【sshpass可通过yum或编译安装】
#-p 参数指定明文密码【密码与-p之间不能有空格】
2、部署ansible
#该软件是用来对selinux进行设置的,确保即使服务器selinux服务开启,依旧能够通过ansible 软件管理 yum install libselinux-python -y #安装ansible软件 yum install ansible -y
#修改hosts文件
cat >>/etc/ansible/hosts<<EOF
[test]
172.20.10.5
172.20.10.3
EOF
hosts文件参数介绍:
1.中括号中的名字代表组名
2.主机(hosts)部分可以使用域名、主机名、IP地址表示;一般此类配置中多使用IP地址
3.组名下的主机地址就是ansible可以管理的地址
ansible部署完成!
/etc/ansible/hosts | 定义anisble软件可以管理的主机信息 |
/usr/bin/ansible | ansible执行命令 |
/usr/bin/ansible-playboot | ansible执行剧本命令 |
/etc/ansible/ansible.cfg | ansible配置文件 |
/etc/ansible/roles | 主要在自动化的时候部署多台主机时使用 |
语法:
ansible clsn -a "uptime" ansible clsn -m command -a "uptime" ansible 定义的组/单个ip/域名/all -m command -a "uptime"
说明:-m 指定使用的模块
-a 指定使用模块中相应的命令参数
命令参数只能是基本命令,并不支持管道操作
all 为hosts文件中的组全部管理
配置hosts文件时配置上密码
IP:端口 用户 密码
vim /etc/ansible/hosts [test] 172.20.10.3:50001 ansible_ssh_user=root ansible_ssh_pass=123456 172.20.10.5
指定端口 用户名
[test] www.test.com:50001 ansible_ssh_user=root
测试修改端口后的结果 使用ping 模块
[root@localhost ansible]# ansible test -m ping
172.20.10.5 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.20.10.3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
命令参数 |
参数说明 |
-m MODULE_NAME |
-module-name=MODULE_NAME module name to execute (default=command) 相应名称的模块被执行(默认模块为command ); -m后边是模块的名宇 |
-a MODULE_ARGS |
-args=MODULE_ARGS module arguments 模块参数信息 -a后面是要执行的命令;也可以写个ip ,针对台机器来执行命令 |
-C, -checks |
don't make any changes, instead, try to predict some of the changes that may occurs 不做任何改变;反而,只是尝试预言些可能出现的改变 |
-syntax-checks |
perform a syntax check on the playbook, but do not execute ii*> 执行语法检查在剧本上,但是并不执行剧本 |
参数 |
参数说明 |
chdir |
在执行命令之前,通过cd命令进入到指定目录中 # ansible clsn -m command -a "chdir=/tmp ls" |
create |
定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤 |
executable |
改变shell使用command进行执行,并且执行时要使用绝对路径 |
free_form |
命令模块采用自由形式命令运行;即可以输入任意linux命令 |
removes |
定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤 |
warn (added in 1.8) |
如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令 |
[root@localhost ~]# ansible test -m command -a "chdir=/tmp pwd"【不指定模块的时候默认使用的模块就是command】
172.20.10.5 | SUCCESS | rc=0 >>
/tmp
172.20.10.3 | SUCCESS | rc=0 >>
/tmp
3.5.1、shell模块
[root@localhost ~]# ansible test -m shell -a "/bin/bash /root/test.sh"
172.20.10.3 | SUCCESS | rc=0 >>
10.3
172.20.10.5 | SUCCESS | rc=0 >>
10.5
[root@localhost ~]# ansible test -m script -a "/root/free.sh" 172.20.10.5 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.20.10.5 closed. ", "stdout": " total used free shared buff/cache available Mem: 976M 163M 618M 7.0M 194M 645M Swap: 1.0G 0B 1.0G ", "stdout_lines": [ " total used free shared buff/cache available", "Mem: 976M 163M 618M 7.0M 194M 645M", "Swap: 1.0G 0B 1.0G" ] } 172.20.10.3 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.20.10.3 closed. ", "stdout": " total used free shared buff/cache available Mem: 976M 165M 616M 7.0M 194M 642M Swap: 1.0G 0B 1.0G ", "stdout_lines": [ " total used free shared buff/cache available", "Mem: 976M 165M 616M 7.0M 194M 642M", "Swap: 1.0G 0B 1.0G" ] }
3.5.3、copy模块 把本地文件发送到远端
选项参数 |
选项说明 |
backup(重要参数) |
在覆盖远端服务器文件之前,将远端服务器源文件备份,备份文件包含时间信息。有两个选项:yes|no |
content |
用于替代"src”,可以直接设定指定文件的值 |
dest |
必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录 |
directory_mode |
递归设定目录的权限,默认为系统默认权限 |
forces |
如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖。 如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes。别名:thirsty |
others |
所有的file模块里的选项都可以在这里使用 |
src |
被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。 |
mode |
定义文件或目录的权限;注意:是4位 |
owner |
修改属主 |
group |
修改属组 |
#使用copy模块,将free.sh文件传输到各个服务器送,权限修改为0600,属主www属组为root ansible test -m copy -a "src=/root/free.sh dest=/opt/ mode=0600 owner=www group=root" #复制远程主机上的文件remote_src=true参数 ansible test -m copy -a "src=/opt/free.sh dest=/home/www/ remote_src=true" #重新定义文件内容,类似于重定向> ansible test -m copy -a "content=test.com dest=/opt/free.sh" #查看文件内容 [root@localhost ~]# ansible test -m shell -a "cat /opt/free.sh" 172.20.10.5 | SUCCESS | rc=0 >> test.com 172.20.10.3 | SUCCESS | rc=0 >> test.com
3.5.4、file模块【设置文件属性】
常用参数:
参数 |
参数说明 |
|
owner |
设置复制传输后的数据属主信息 |
|
group |
设置复制传输后的数据属组信息 |
|
mode |
设置文件数据权限信息 |
|
dest |
要创建的文件或目录命令,以及路径信息 |
|
src |
指定要创建软链接的文件信息 |
|
state |
state参数信息 |
|
directory |
创建目录 |
|
file |
创建文件 |
|
link |
创建软链接 |
|
hard |
创建出硬链接 |
|
absent |
目录将被递归删除以及文件,而链接将被取消链接 |
|
touch |
创建文件;如果路径不存在将创建一个空文件 |
#创建目录 ansible test -m file -a "dest=/opt/test_dir state=directory" #创建文件 ansible test -m file -a "dest=/opt/test.sh state=touch" #创建软链接 ansible test -m file -a "src=/bin/bash dest=/opt/bash_link state=link" #删除目录和文件 ansible test -m file -a "dest=/opt/test_dir state=absent" #创建多级目录 ansible test -m copy -a "src=/etc/hosts dest=/opt/1/2/3/4/5/"
PS:重命名和创建多级目录不能同时实现
参数 |
参数说明 |
dest |
将远程主机拉取过来的文件保存在本地的路径信息 |
src |
指定从远程主机要拉取的文件信息,只能拉取文件 |
flat |
默认设置为no,如果设置为yes,将不显示172.16.1.8/etc/信息 |
#拉去远程主机上的文件至本地主机 [root@localhost ~]# ansible test -m fetch -a "src=/opt/abc dest=/opt/" 172.20.10.5 | SUCCESS => { "changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/opt/172.20.10.5/opt/abc", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "remote_md5sum": null } 172.20.10.3 | SUCCESS => { "changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/opt/172.20.10.3/opt/abc", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "remote_md5sum": null } #flat参数,拉去的时候不创建目录(同名文件会覆盖) [root@localhost ~]# ansible test -m fetch -a "src=/opt/abc dest=/opt/ flat=yes" 172.20.10.5 | SUCCESS => { "changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/opt/abc", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "remote_md5sum": null } 172.20.10.3 | SUCCESS => { "changed": false, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/opt/abc", "file": "/opt/abc", "md5sum": "d41d8cd98f00b204e9800998ecf8427e" }
3.5.4、mount模块【配置挂载点】
参数 |
参数说明 |
|
fstype |
指定挂载文件类型 -t nfs == fstype=nfs |
|
opts |
设定挂载的参数选项信息 -o ro == opts=ro |
|
path |
挂载点路径 path=/mnt |
|
src |
要被挂载的目录信息 src=172.16.1.31:/data |
|
state |
state状态参数 |
|
unmounted |
加载/etc/fstab文件 实现卸载 |
|
absent |
在fstab文件中删除挂载配置 |
|
present |
在fstab文件中添加挂载配置 |
|
mounted |
1.将挂载信息添加到/etc/fstab文件中 2.加载配置文件挂载 |
#挂载 [root@m01 tmp]# ansible 172.16.1.8 -m mount -a "fstype=nfs opts=rw path=/mnt/ src=172.16.1.31:/data/ state=mounted" 172.16.1.8 | SUCCESS => { "changed": true, "dump": "0", "fstab": "/etc/fstab", "fstype": "nfs", "name": "/mnt/", "opts": "rw", "passno": "0", "src": "172.16.1.31:/data/" } #卸载 [root@m01 tmp]# ansible 172.16.1.8 -m mount -a "fstype=nfs opts=rw path=/mnt/ src=172.16.1.31:/data/ state=unmounted" 172.16.1.8 | SUCCESS => { "changed": true, "dump": "0", "fstab": "/etc/fstab", "fstype": "nfs", "name": "/mnt/", "opts": "rw", "passno": "0", "src": "172.16.1.31:/data/" }
3.5.4、cron模块
参数 |
参数说明 |
|
minute 分 |
Minute when the job should run ( 0-59, *, */2, etc ) |
|
hour 时 |
Hour when the job should run ( 0-23, *, */2, etc ) |
|
day 日 |
Day of the month the job should run ( 1-31, *, */2, etc ) |
|
month 月 |
Month of the year the job should run ( 1-12, *, */2, etc ) |
|
weekday 周 |
Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc ) |
|
job |
工作 ;要做的事情 |
|
name |
定义定时任务的描述信息 |
|
disabled |
注释定时任务 |
|
state |
state 状态参数 |
|
absent |
删除定时任务 |
|
present |
创建定时任务 |
|
默认为present |
添加定时任务
[root@m01 ~]# ansible clsn -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/hostname.sh &>/dev/null' name=clsn01" 172.16.1.8 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "clsn01" ] }
删除定时任务
[root@m01 ~]# ansible clsn -m cron -a "minute=00 hour=00 job='/bin/sh /server/scripts/hostname.sh &>/dev/null' name=clsn01 state=absent" 172.16.1.8 | SUCCESS => { "changed": true, "envs": [], "jobs": [] }
只用名字就可以删除
[root@m01 ~]# ansible clsn -m cron -a "name=clsn01 state=absent" 172.16.1.31 | SUCCESS => { "changed": true, "envs": [], "jobs": [] }
注释定时任务
注意: 注释定时任务的时候必须有job的参数
[root@m01 ~]# ansible clsn -m cron -a "name=clsn01 job='/bin/sh /server/scripts/hostname.sh &>/dev/null' disabled=yes" 172.16.1.31 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "clsn01" ] }
取消注释
[root@m01 ~]# ansible clsn -m cron -a "name=clsn01 job='/bin/sh /server/scripts/hostname.sh &>/dev/null' disabled=no" 172.16.1.41 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "clsn01" ] }
参数 |
参数说明 |
name=name |
指定安装的软件 |
state=installed |
安装 |
#安装lrzsz服务 [root@localhost ~]# ansible test -m yum -a "name=lrzsz state=installed" 172.20.10.3 | SUCCESS => { "changed": true, "msg": "", "rc": 0, "results": [ "Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.tuna.tsinghua.edu.cn * updates: mirrors.tuna.tsinghua.edu.cn Resolving Dependencies --> Running transaction check ---> Package lrzsz.x86_64 0:0.12.20-36.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: lrzsz x86_64 0.12.20-36.el7 base 78 k Transaction Summary ================================================================================ Install 1 Package Total download size: 78 k Installed size: 181 k Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : lrzsz-0.12.20-36.el7.x86_64 1/1 Verifying : lrzsz-0.12.20-36.el7.x86_64 1/1 Installed: lrzsz.x86_64 0:0.12.20-36.el7 Complete! " ] }
参数 |
参数说明 |
name=service name |
服务的名称 |
state=参数 |
停止服务 服务状态信息为过去时 stared/stoped/restarted/reloaded |
enabled=yes |
设置开机自启动 |
#重启crond服务 ansible test -m service -a "name=crond state=restarted"
3.6、ansible常用模块
常用模块 |
模块说明 |
command (重要模块) |
执行命令模块,ansible命令执行默认模块 |
shell (重要模块) |
行shell脚本模块 |
script (重要模块) |
把脚本发到客户端,然后执行;执行脚本命令在远端服务器上 |
copy (重要模块) |
把本地文件发送到远端 |
file |
设定文件属性模块 |
services |
系统服务管理模块 |
cron |
计划任务管理模块 |
yum |
yum软件包安装管理模块 |
synchronize |
使用rsync同步文件模块 |
mount |
挂载模块 |
#hostname 修改主机名模块 ansible 172.20.10.5 -m hostname -a "name=test1" #selinux 管理模块 ansible 172.16.1.8 -m selinux -a "state=disabled" #get_url 模块 == 【wget】 ansible 172.16.1.8 -m get_url -a "url=http://lan.znix.top/RDPWrap-v1.6.1.zip dest=/tmp/" url=下载文件的地址dest下载到哪里 timeout 超时时间 url_password 密码 url_username 用户名