Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务
SSH远程管理服务
1. 远程管理服务知识介绍
- # 1.1 SSH远程登录服务介绍说明
- SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Working Group)制定;
- 在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全。
- SSH是专为远程登录会话和其他网络服务提供的安全性协议。
- 利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境运维工作中,
- 绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密的)等。
- 在默认状态下,SSH服务主要提供两个服务功能:
- a 一是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务;
- b 另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供更安全的SFTP服务(vsftp,proftp)。
- # 1.2 SSH远程登录服务排错思路
- 01. 检查链路是否通畅---ping(icmp协议)/tracert/traceroute
- 02. 检查链路是否阻断---将防火墙功能关闭
- 03. 检查服务是否开启---ss/netstat -lntup(服务端检查) /telnet/nmap/nc(客户端检查)
- # 远程管理服务对比说明:
- # 安装 telnet 客户端软件: yum install -y telnet
- # 安装 telnet 服务端软件(备份服务器): yum install -y telnet-server
- [root@backup ~]# yum install -y telnet-server telnet
- ...
- [root@backup ~]# cat /etc/xinetd.d/telnet
- # default: on
- # description: The telnet server serves telnet sessions; it uses \
- # unencrypted username/password pairs for authentication.
- service telnet
- {
- flags = REUSE
- socket_type = stream
- wait = no
- user = root
- server = /usr/sbin/in.telnetd
- log_on_failure += USERID
- disable = no # 把 disable 由默认的 yes 改成 no ,表示 telnet 能由 xinetd 服务
- }
- [root@backup ~]# /etc/init.d/xinetd restart # 重启 xinetd 服务
- Stopping xinetd: [ OK ]
- Starting xinetd: [ OK ]
- [root@backup ~]#
- # 此时就把 telnet 服务启动了
- Type `help' to learn how to use Xshell prompt.
- Xshell:\> telnet 10.0.0.41 # 用 telnet 连接远程服务器 (telnet 不能用 root 用户连接;使用 telnet ip 之前要先把 xinetd服务开启)
- Type `help' to learn how to use Xshell prompt.
- Xshell:\> ssh 10.0.0.41 # ssh 连接远程服务器 既可用 root 用户,也可用 普通用户
2. 远程管理服务概念详解
- 2.1 SSH远程管理服务加密技术
- ssh连接登录过程:
- ①. ssh客户端发(m01主机)出连接请求
- ②. ssh服务端会发出确认信息,询问客户端你是否真的要连接我
- ③. ssh客户端输入完成yes,会等到一个公钥信息
- [root@m01 /]# cat /root/.ssh/known_hosts
- 10.0.0.41 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxk0wkLuvRML5GrK8p+EU6yLAvLf5aOsnu2ydGzvn8mXuE4EdhGzGC1h9cwvMYwY7xD47aBRP/q+13T6Jh8/A580m6AaZmagS/OawtcVaseTMJEehysIqPBOD9xqPGOWK5c3vWFcW0yC1rp64axYAbrXgOEX8TddxF4rPAyinOpqMPe1ncF6hY8Zq3VxCDKIFJk//RPpO1eqM8eXLl7P1tLCLYHVvRWdjDQ2k275cPOAXiLr2Wc+KuzQUMAeLV0e/41DtMHHdI8bkrMfMMFXFPR04nZv+uv4DvX7Md/5NoGB6PkH9ozvDyqLFS7Z2m0hpomhqkaM5OtbN6rm+YrJXqQ==
- [root@m01 /]#
- ④. ssh服务端(如:备份服务器)将公钥信息发送给ssh客户端
- [root@backup ~]# cd /etc/ssh # 公钥、密钥存放路径
- [root@backup ssh]# ll
- total 160
- -rw-------. 1 root root 125811 Mar 22 2017 moduli
- -rw-r--r--. 1 root root 2047 Mar 22 2017 ssh_config
- -rw------- 1 root root 3876 Apr 30 18:43 sshd_config
- -rw-------. 1 root root 3879 Mar 22 2017 sshd_config.bak
- -rw-------. 1 root root 668 Oct 16 2018 ssh_host_dsa_key
- -rw-r--r--. 1 root root 590 Oct 16 2018 ssh_host_dsa_key.pub
- -rw-------. 1 root root 963 Oct 16 2018 ssh_host_key
- -rw-r--r--. 1 root root 627 Oct 16 2018 ssh_host_key.pub
- -rw-------. 1 root root 1675 Oct 16 2018 ssh_host_rsa_key
- -rw-r--r--. 1 root root 382 Oct 16 2018 ssh_host_rsa_key.pub
- [root@backup ssh]# cat ssh_host_rsa_key.pub
- ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxk0wkLuvRML5GrK8p+EU6yLAvLf5aOsnu2ydGzvn8mXuE4EdhGzGC1h9cwvMYwY7xD47aBRP/q+13T6Jh8/A580m6AaZmagS/OawtcVaseTMJEehysIqPBOD9xqPGOWK5c3vWFcW0yC1rp64axYAbrXgOEX8TddxF4rPAyinOpqMPe1ncF6hY8Zq3VxCDKIFJk//RPpO1eqM8eXLl7P1tLCLYHVvRWdjDQ2k275cPOAXiLr2Wc+KuzQUMAeLV0e/41DtMHHdI8bkrMfMMFXFPR04nZv+uv4DvX7Md/5NoGB6PkH9ozvDyqLFS7Z2m0hpomhqkaM5OtbN6rm+YrJXqQ==
- [root@backup ssh]#
- ⑤. ssh客户端利用密码进行登录
- 加密技术分为v1和v2两个版本
- sshv1版本不会经常更换锁头和钥匙,因此会有安全隐患
- sshv2版本会经常更换锁头和钥匙,因此提高了远程连接安全性
3. SSH远程管理服务认证类型
- # 基于密钥方式实现远程登录
- ①. ssh管理服务器(m01主机)上创建密钥对信息(公钥 私钥)
- ②. ssh管理服务器上将公钥发送给被管理服务器(如 备份服务器)
- ③. ssh管理服务器向被管理服务器发送连接请求
- ④. ssh被管理服务器向管理服务器发送公钥质询
- ⑤. ssh管理服务器处理公钥质询请求,将公钥质询结果发送给被管理主机
- ⑥. ssh被管理服务器接收公钥质询响应信息,从而确认认证成功
- ⑦. ssh管理服务端可以和被管理服务端建立基于密钥连接登录
4. 基于密钥登录方式部署流程
- # 第一个里程:在管理主机(如 m01主机)上创建密钥对信息
- [root@m01 ~]# ssh-keygen -t dsa <-- 创建密钥对命令 -t dsa表示指定密钥对加密类型
- Generating public/private dsa key pair.
- Enter file in which to save the key (/root/.ssh/id_dsa): <-- 确认私钥文件所保存的路径
- /root/.ssh/id_dsa already exists.
- Overwrite (y/n)? y <-- 如果已经存在了密钥对信息,是否进行覆盖
- Enter passphrase (empty for no passphrase): <-- 确认是否给私钥设置密码信息(一般为空)
- Enter same passphrase again:
- Your identification has been saved in /root/.ssh/id_dsa.
- Your public key has been saved in /root/.ssh/id_dsa.pub.
- The key fingerprint is:
- 46:c8:21:b9:99:6e:0c:59:39:66:38:7a:97:29:51:76 root@m01
- The key's randomart image is:
- +--[ DSA 1024]----+
- | o+oE |
- | +.B+ o |
- | . B Bo . |
- |. = B . |
- | . * S |
- | + . |
- | . |
- | |
- | |
- +-----------------+
- # 第二个里程:将管理主机上公钥信息发送给被管理主机
- [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 # 将管理主机上的 公钥 发送给 被管理主机上;如果管理主机想用内网连接被管理主机,则 ip 要写成内网ip,反之则用 外网ip;此时是用root身份分发公钥,所以也只能用root身份进行管理;如果想让普通用户如 oldboy 进行管理,在ip前加上 普通用户名
- The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
- RSA key fingerprint is 22:07:4d:36:3c:5e:eb:46:80:a2:ef:40:45:8c:93:46.
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added '172.16.1.31' (RSA) to the list of known hosts.
- root@172.16.1.31's password:
- Now try logging into the machine, with "ssh '172.16.1.31'", and check in:
- .ssh/authorized_keys # 公钥文件保存在了 172.16.1.31 主机 root 用户家目录下的 .ssh/ 目录下
- to make sure we haven't added extra keys that you weren't expecting.
- [root@m01 ~]#
- # 公钥文件保存在了 172.16.1.31 主机 root 用户家目录下的 .ssh/ 目录下
- [root@nfs01 ~]# cd /root/.ssh/
- [root@nfs01 .ssh]# ll
- total 4
- -rw------- 1 root root 598 May 24 14:17 authorized_keys
- [root@nfs01 .ssh]#
- # 第三个里程:进行远程管理测试(基于密钥的方式进行远程管理)
- [root@m01 ~]# ssh 172.16.1.31 # 不需要密码直接登陆被管理主机
- Last login: Fri May 24 14:15:34 2019 from 10.0.0.253
- [root@nfs01 ~]#
- [root@m01 ~]# ssh 172.16.1.31 uptime # 不登陆被管理主机 查看被管理主机的状况
- 14:31:30 up 26 min, 1 user, load average: 0.00, 0.00, 0.00
- [root@m01 ~]#
5. SSH配置文件
- # SSH服务端配置文件: /etc/ssh/sshd_config
- # SSH客户端配置文件: /etc/ssh/ssh_config
- # SSH服务端配置文件信息说明(/etc/ssh/sshd_config)
- Port 52113 <- 修改ssh服务端口号信息 (端口号要在1024之后);修改端口号的连接方式: ssh -p端口号 ip
- ListenAddress 0.0.0.0 <- 指定哪个地址建立网络连接:0.0.0.0 表示全部网卡都处于被监听状态,即都可做出响应;172.16..31 表示只有该网卡(内网网卡)处于被监听状态;主要作用提升网络连接安全性
- PS:监听地址只能配置为服务器网卡上拥有的地址
- PermitRootLogin no <- 是否允许root用户远程登陆(企业环境中一般设置为 no )
- PermitEmptyPasswords no <- 是否允许空密码
- UseDNS no <- 是否进行DNS反向解析(提升ssh远程连接效率)
- GSSAPIAuthentication no <- 是否进行远程GSSAPI认证(提升ssh远程连接效率)
- # 修改完配置文件后要重启 ssh 服务端服务: /etc/init.d/sshd restart
6. SSH远程传输方法 --- sftp
- # 命令如: sftp -oPort=52113 oldboy@10.0.0.41
- # sftp常用操作命令总结
- bye Quit sftp <-- 表示退出sftp传输模式
- cd path Change remote directory to 'path' <-- 改变远程目录信息
- pwd Display remote working directory <-- 显示远程主机当前目录信息
- lcd path Change local directory to 'path' <-- 改变本地目录路径信息
- lpwd Print local working directory <-- 输出本地目录路径信息
- get [-P] remote-path [local-path]
- Download file <-- 下载文件命令
- put [-P] local-path [remote-path] <-- 上传文件命令
- Upload file
ansible批量管理服务介绍
1. 批量管理服务知识介绍
- a. ansible是一个基于Python开发的自动化运维工具
- b. ansible是一个基于ssh协议实现远程管理的工具
- c. ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令)
- # 其它的批量管理服务: saltstack puppet
2. 批量管理服务特征介绍
- a. ansible软件服务端(管理端):不需要启动任何服务 默认服务端不需要任何的配置
- b. ansible软件客户端(受控端):没有客户端软件安装
3. ansible软件安装部署
- # 3.1 ansible软件自动化环境架构规划
- 管理主机1台:
- 10.0.0.61 主机名:m01
- 受控主机3台:
- 10.0.0.41 主机名:backup
- 10.0.0.31 主机名:nfs01
- 10.0.0.7 主机名:web01
- Linux系统 6.9
- # 3.2 ansible软件自动化部署条件
- # 建议基于ssh密钥方式建立远程连接
- 3.2.1 ssh密钥对创建(管理主机)
- ssh-keygen -t dsa # 交互式创建密钥对
- # 影响免交互创建密钥对创建因素:
- a. 需要指定私钥存放路径
- -f /root/.ssh/id_dsa # 指定私钥存放路径的参数
- b. 需要进行私钥文件密码设定
- -N 或 -P 参数是解决私钥文件密码的设定
- -N "" 或 -P "" # 免除私钥文件密码设定的参数值
- # 免交互创建密钥对方法:
- [root@m01 .ssh]# ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
- 3.2.2 分发公钥文件(管理主机进行分发)
- ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 # 交互式的分发公钥
- # 影响免交互批量分发密钥因素:
- a. 需要有确认连接过程,需要输入yes/no
- -o StrictHostKeyChecking=no # 可用于 免交互分发公钥的免除确认连接过程
- b. 需要解决密码问题
- # sshpass -p登陆密码 # 免交互公钥分发的免除密码的方式
- [root@m01 ~]# sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 # 免交互公钥分发的免除密码的方式; sshpass -p登陆密码
- Now try logging into the machine, with "ssh '172.16.1.31'", and check in:
- .ssh/authorized_keys
- to make sure we haven't added extra keys that you weren't expecting.
- # 需要先安装 sshpass
- [root@m01 ~]# yum install -y sshpass
- # 免交互分发公钥最终形式的命令:
- [root@m01 ~]# sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31" # 用的是内网ip
- Warning: Permanently added '172.16.1.31' (RSA) to the list of known hosts.
- Now try logging into the machine, with "ssh '-o StrictHostKeyChecking=no 172.16.1.31'", and check in:
- .ssh/authorized_keys
- to make sure we haven't added extra keys that you weren't expecting.
- [root@m01 ~]#
- c. 免交互批量分发公钥脚本
- #!/bin/bash
- \rm -f /root/.ssh/id_dsa* # 先把已经保存的密钥删除
- ssh-keygen -t dsa -f /root/.ssh/id_dsa -N "" # 创建新的密钥
- for ip in 7 31 41
- do
- sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip" # $ip 是变量
- done
- # 注:利用 ssh-copy-id 命令指定端口分发公钥方法:
- ssh-copy-id -i /root/.ssh/id_dsa.pub "172.16.1.31 -p52113" # -p52113 用于指定端口;把指定的端口和ip 放在一起作为一个变量
- d. 检查是否可以进行基于密钥远程管理
- [root@m01 ~]# ssh 172.16.1.31 uptime # ssh ip 命令
- # 脚本:
- #!/bin/bash
- if [ $# -ne 1 ] # 变量的数量不为1
- then
- echo "pls input one arg"
- exit 1
- fi
- for ip in 7 31 41
- do
- echo ====172.16.1.$ip info===
- ssh 172.16.1.$ip $1
- done
- # 3.3 ansible软件下载安装
- # ansible 管理主机软件安装:
- yum install -y ansible
- # ansible受控主机软件安装(可选):
- yum install -y libselinux-python # 可解决ansible管理端和被管理端由于selinux开启而引起的连接异常(所有受控端都安装)
- # 3.4 ansible软件受控主机添加配置
- # 方式一: 全部依靠密钥的方式连接被管理主机
- [root@m01 ~]# cat /etc/ansible/hosts
- [neo] # 管理分组名
- 172.16.1.7 # ip地址(分发公钥的ip)
- 172.16.1.31
- 172.16.1.41
- [root@m01 ~]# ansible neo -m command -a "hostname" # ansible 管理主机信息或者主机组信息 -m 模块名称 -a 相关模块参数
- 172.16.1.7 | SUCCESS | rc=0 >>
- web01
- 172.16.1.41 | SUCCESS | rc=0 >>
- backup
- 172.16.1.31 | SUCCESS | rc=0 >>
- nfs01
- [root@m01 ~]#
- # 方式二:个别主机依靠口令(密码)
- [root@m01 ~]# cat /etc/ansible/hosts
- [neo]
- 172.16.1.7 ansible_user=root ansible_password=123456 # 如果 172.16.1.7 这台主机没有公钥,可通过在配置文件配置用户名和密码的方式管理
- 172.16.1.31
- 172.16.1.41
- # 方式三:通过口令交互式管理单台主机
- [root@m01 ~]# ansible 172.16.1.7 -m command -a "hostname" -k # -k 参数表示交互式
- SSH password:
- 172.16.1.7 | SUCCESS | rc=0 >>
- web01
- [root@m01 ~]#
4.ansible软件应用过程
- # ansible软件模块:
- [root@m01 ~]# ansible-doc -l |wc -l
- 1852
- 语法: ansible 管理主机信息或者主机组信息 -m 模块名称 -a 相关模块参数
- 主机信息:远程主机IP地址 远程主机组名称 远程所有主机all
- -m 指定相应模块
- -a 利用模块中某些参数功能
- # 命令类型模块:
- 第一个模块:command
- 官方参考链接:http://docs.ansible.com/ansible/latest/modules/command_module.html
- 参数:chdir---在执行莫个命令前,先切换目录
- [root@m01 ~]# ansible 172.16.1.31 -m shell -a "hostname&date"
- 172.16.1.31 | SUCCESS | rc=0 >>
- Tue May 28 23:36:41 CST 2019
- nfs01
- [root@m01 ~]# ansible 172.16.1.31 -m shell -a "chdir=/tmp/ pwd"
- 172.16.1.31 | SUCCESS | rc=0 >>
- /tmp
- [root@m01 ~]#
- 参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
- [root@m01 ~]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname"
- 172.16.1.41 | SUCCESS | rc=0 >>
- skipped, since /etc/rsyncd.conf exists
- [root@m01 ~]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf.bak hostname"
- 172.16.1.41 | SUCCESS | rc=0 >>
- backup
- [root@m01 ~]#
- 参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行(存在了才会执行)
- [root@m01 ~]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname"
- 172.16.1.41 | SUCCESS | rc=0 >>
- backup
- [root@m01 ~]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf.bak hostname"
- 172.16.1.41 | SUCCESS | rc=0 >>
- skipped, since /etc/rsyncd.conf.bak does not exist
- [root@m01 ~]#
- 参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
- # 第二个模块:shell模块(万能模块)
- 参数:chdir---在执行莫个命令前,先切换目录
- 参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
- 参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
- 参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
- [root@m01 ~]# ansible 172.16.1.41 -m shell -a "ls;pwd"
- 172.16.1.41 | SUCCESS | rc=0 >>
- anaconda-ks.cfg
- data
- echotest.txt
- install.log.syslog
- /root
- [root@m01 ~]#
- # 说明:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > ; | &
- # 第三个模块:script---专门运行脚本模块;把本地的脚本在远程主机上执行
- 参数:chdir---在执行莫个命令前,先切换目录
- 参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
- 参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
- 参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
- [root@m01 ~]# ansible 172.16.1.41 -m script -a "/server/scripts/yumtest.sh"
- # 文件类型模块:
- # 第一个模块:copy----复制模块
- 参数:src---定义要推送数据信息
- 参数:dest---定义将数据推送到远程主机什么目录中
- [root@m01 ~]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/" # dest 的 /tmp 后面要加上 / ,否则ansible会把其当作一个文件
- 参数:backup---对数据信息进行备份
- [root@m01 tmp]# ansible 172.16.1.41 -m command -a "cat /tmp/file01.txt"
- 172.16.1.41 | SUCCESS | rc=0 >>
- 123456
- [root@m01 tmp]# echo 654321>file01.txt # 修改 m01 上的 file01.txt
- [root@m01 tmp]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes" # backup=yes 表示备份,其默认值为 no
- 172.16.1.41 | SUCCESS => {
- "backup_file": "/tmp/file01.txt.7138.2019-05-29@19:00:19~",
- "changed": true,
- "checksum": "1c5b0c3eedfc2539fce525f26d4f84935cb77d3c",
- "dest": "/tmp/file01.txt",
- "gid": 0,
- "group": "root",
- "md5sum": "4a62cf6ee3f8d889e65af1cc271f20fa",
- "mode": "",
- "owner": "root",
- "size": 7,
- "src": "/root/.ansible/tmp/ansible-tmp-1559127617.05-115855996071909/source",
- "state": "file",
- "uid": 0
- }
- [root@m01 tmp]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/file01*"
- 172.16.1.41 | SUCCESS | rc=0 >>
- -rw-r--r-- 1 root root 7 May 29 19:00 /tmp/file01.txt # 此文件为在 m01 上修改后的文件
- -rw-r--r-- 1 root root 7 May 29 18:48 /tmp/file01.txt.7138.2019-05-29@19:00:19~ # 此文件为原先在 172.16.1.41主机上的 file01.txt 文件(此时变成了备份文件)
- [root@m01 tmp]# ansible 172.16.1.41 -m command -a "cat /tmp/file01.txt"
- 172.16.1.41 | SUCCESS | rc=0 >>
- 654321 # 修改后的内容
- [root@m01 tmp]# ansible 172.16.1.41 -m command -a "cat /tmp/file01.txt.7138.2019-05-29@19:00:19~"
- 172.16.1.41 | SUCCESS | rc=0 >>
- 123456 # 原先的内容
- [root@m01 tmp]#
- 参数:owner---设置复制后的文件属主权限
- 参数:group---设置复制后的文件属组权限
- 参数:mode---设置复制后的文件权限(600 755)
- # 第二个模块:file----文件属性修改/目录创建/文件创建
- 参数:owner---设置复制后的文件属主权限
- 参数:group---设置复制后的文件属组权限
- 参数:mode---设置复制后的文件权限(600 755)
- [root@m01 ~]# ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt owner=oldboy group=oldboy mode=600"
- 172.16.1.41 | SUCCESS => {
- "changed": true,
- "gid": 500,
- "group": "oldboy",
- "mode": "",
- "owner": "oldboy",
- "path": "/tmp/file01.txt",
- "size": 7,
- "state": "file",
- "uid": 500
- }
- 参数:state---用于指定创建目录或文件
- # state=touch 创建文件
- [root@m01 ~]# ansible 172.16.1.41 -m file -a "dest=/tmp/file02.txt state=touch"
- 172.16.1.41 | SUCCESS => {
- "changed": true,
- "dest": "/tmp/file02.txt",
- "gid": 0,
- "group": "root",
- "mode": "",
- "owner": "root",
- "size": 0,
- "state": "file",
- "uid": 0
- }
- # state=directory 创建文件
- [root@m01 ~]# ansible 172.16.1.41 -m file -a "dest=/tmp/dir01 state=directory"
- 172.16.1.41 | SUCCESS => {
- "changed": true,
- "gid": 0,
- "group": "root",
- "mode": "",
- "owner": "root",
- "path": "/tmp/dir01",
- "size": 4096,
- "state": "directory",
- "uid": 0
- }
- # 包管理模块类型:
- # 模块:yum---安装软件包模块
- 参数 name:执行要安装软件的名称,以及软件的版本
- 参数 state:installed(安装) absent(卸载)
- [root@m01 ~]# ansible 172.16.1.41 -m yum -a "name=iftop state=installed" # 安装软件
- [root@m01 ~]# ansible 172.16.1.41 -m yum -a "name=iftop state=absent" # 卸载软件
- 参数 list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了
- [root@m01 ~]# ansible 172.16.1.41 -m yum -a "list=iftop"
- 172.16.1.41 | SUCCESS => { # 此结果表示软件没有安装
- "changed": false,
- "results": [
- {
- "arch": "x86_64",
- "envra": "0:iftop-1.0-0.14.pre4.el6.x86_64",
- "epoch": "",
- "name": "iftop",
- "release": "0.14.pre4.el6",
- "repo": "epel",
- "version": "1.0",
- "yumstate": "available" # 表示该软件在其yum源上有
- }
- ]
- }
- # 系统模块类型
- 模块:service---管理服务状态模块
- name: 指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)
- state:stopped started restarted reloaded
- enabled:yes表示服务开机自启动 no表示服务开机不要自动启动
- [root@m01 ~]# ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"
- # cron---定时任务模块
- * * * * * /bin/sh /server/scripts/test.sh &>/dev/null
- minute=0-59 * */n , - hour day month weekday job='/bin/sh /server/scripts/test.sh &>/dev/null' # job 表示定时任务的内容
- 添加定时任务:
- ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
- ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'" # name表示定时任务的名称
- 删除定时任务
- ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent"
- ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent" # state=absent 表示删除定时任务
- 注释定时任务
- ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"
- ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no" # disable=no 表示 注释掉定时任务
- # 总结ansible颜色信息:
- 绿色:查看远程主机信息,不会对远程主机系统做任何修改
- 红色:执行操作出现异常错误
- 黄色:对远程主机系统进行修改操作
- 粉色:警告或者忠告信息
ansible软件剧本
- 编写剧本规范:
- # http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
- 遵循pyyaml
- ①. - 用法说明,表示列表显示的内容
- 水果信息:
- - 苹果
- - 香蕉
- - 西瓜
- ②. : 用法说明: 类似于 NoSQL 中的 key-value
- 姓名: 张三
- 性别: 男
- 人员信息:
- - 运维人员: sa
- - 开发人员: dev
- - 存储人员: dba
- ③. 空格 用法说明:
- 对内容进行分级时,需要有两个空格表示分级
- 软件安装步骤:
- - 服务端安装步骤:
- 第一个里程碑: 检查软件是否安装
- 第二个里程碑: 编写配置文件内容
- - 客户端安装步骤:
- 补充:必须使用空格分隔ansible剧本级别,一定不要使用tab键进行分割
一键化部署rsync服务:
rsync.yaml 文件的内容如下:
- # command play-book
- - hosts: 172.16.1.41
- tasks:
- - name: step01:install rsync
- yum: name=rsync state=installed
- - name: step02:edit rsync conf file
- copy: src=/etc/ansible/conf/rsync_conf/rsyncd.conf dest=/etc/
- - name: step03:create rsync user
- user: name=rsync state=present createhome=no shell=/sbin/nologin
- - name: step04:create auth file
- copy: src=/etc/ansible/conf/rsync_conf/rsync.password dest=/etc/ mode=600
- - name: step05:create backup dir
- file: dest=/backup state=directory owner=rsync group=rsync
- - name: step06:boot rsync server
- shell: rsync --daemon creates=/var/run/rsyncd.pid
- - hosts: 172.16.1.31
- tasks:
- - name: step01:create auth file
- copy: src=/etc/ansible/conf/rsync_conf/rsync_client.password dest=/etc/rsync.password mode=600
Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务的更多相关文章
- Windows和linux虚拟机之间联网实现SSH远程连接以及VMware的3种网络模式[NAT、桥接和Host-only]
Windows和linux虚拟机之间联网实现SSH远程连接以及VMware的3种网络模式[NAT.桥接和Host-only] 作者:天齐 一.Windows和linux虚拟机之间联网实现SSH远程连接 ...
- 使用ansible批量管理远程服务器
使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ...
- 六.ansible批量管理服务
期中集群架构-第六章-ansible批量管理服务介绍====================================================================== 01. ...
- ansible批量管理服务 上
1 ansible简介 1.1 ansible批量管理服务概述 (1)是基于python语言开发的自动化软件工具(2)是基于SSH远程管理服务实现远程主机批量管理(3)并行管理,部署简单,应用也简单方 ...
- Ansible 批量管理Windows Server服务器
Ansible批量管理Windows Server Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppe ...
- Linux学习笔记19-ssh远程管理
远程管理 服务器一般运行在IDC机房中,一般都是通过远程管理方式对服务器进程控制. 常见的远程管理工具: RDP(remote desktop protocol)协议,window远程桌面管理 Tel ...
- linux运维、架构之路-ansible批量管理
一.ansible软件 1.介绍 ①ansible是一个基于Python开发的自动化运维工具 ②其功能实现基于SSH远程连接服务 ③ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量 ...
- Linux中ansible批量管理软件部署及剧本编写
服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ...
- Linux系统——Ansible批量管理工具
批量管理工具: (1)ansible 操作简单(适用于500台以下服务器) (2)saltstack 比较复杂(一般适用于1000-4w台服务器) (3)puppet超级复杂 systemctl(统一 ...
随机推荐
- hihoCoder #1079 : 离散化 (线段树,数据离散化)
题意:有一块宣传栏,高一定,给出长度,再给出多张海报的张贴位置,问还能见到几张海报(哪怕有一点被看到)?假设海报的高于宣传栏同高. 思路:问题转成“给出x轴上长为L的一条线段,再用n条线段进行覆盖上去 ...
- 将sql 查询结果导出到excel
在平时工作中经常会遇到,sql 查询数据之后需要发送给业务人员,每次都手工执行脚本然后拷贝数据到excel中,比较耗时耗力,可以考虑自动执行查询并将结果邮件发送出来. 分两步实现: 1.执行查询将结果 ...
- Entity Framework插入数据报错:Validation failed for one or more entities
www.111cn.net 编辑:lanve 来源:转载 今天在处理Entity Framework插入数据库时,报错: Validation failed for one or more entit ...
- Solr笔记(2)_Schema.xml和solrconfig.xml分析
现在我们开始研究载入的数据部分(importing data) 在正式开始前,我们先介绍一个存储了大量音乐媒体的网站http://musicbrainz.org , 这里的数据都是免费的,一个大型开放 ...
- ERROR 14856 --- [reate-882003853] com.alibaba.druid.pool.DruidDataSource : create connection error, url: jdbc:mysql://localhost:3306/xhb?useUnicode=true&characterEncoding=UTF-8, errorCode 1045, sta
ERROR 14856 --- [reate-882003853] com.alibaba.druid.pool.DruidDataSource : create connection error, ...
- k8s 创建资源的两种方式【转】
命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...
- 解决IllegalBlockSizeException:last block incomplete in decryption异常
解决IllegalBlockSizeException:last block incomplete in decryption异常分类: webkit android最近做个加解密的实现,虽然实现了, ...
- Codeforces Round #271 (Div. 2)-A. Keyboard
http://codeforces.com/problemset/problem/474/A A. Keyboard time limit per test 2 seconds memory limi ...
- fckeditor配置详解
使用配置设置: . FCKConfig.CustomConfigurationsPath = '' ; // 自定义配置文件路径和名称 . FCKConfigFCKConfig.EditorAreaC ...
- 【Java_基础】并发、并行、同步、异步、多线程的区别
1. 并发:位于同一个处理器上的多个已开启未完成的线程,在任意一时刻系统调度只能让一个线程获得CPU资源运行,虽然这种调度机制有多种形式(大多数是以时间片轮巡为主).但无论如何,都是通过不断切换需要运 ...