49.运维6-ansible

58.SSH远程连接:

0.回顾
	1) 实时同步服务原理
	   a 部署好rsync守护进程  传输数据
	   b 部署好inotify软件    监控数据变化
	   c 部署安装sersync软件  将rsync+inotify软件结合
    2) 相关软件部署安装
    3) sersync的配置过程
       rsync命令掌握sersync服务配置方法

1.远程管理服务概念介绍
    SSH     安全的远程连接    数据信息是加密的  22   SSH服务默认可以root用户远程连接         系统远程连接
	TELNET  不安全的远程连接  数据信息是明文的  23   telnet服务默认不可以让root用户远程连接  网络设备远程连接

	补充: 什么是shell
    1. 每连接登录到一个linux系统中,就是一个shell
    2. 可以一个linux系统有多个会话连接,每一个会话都是一个shell
    3. 系统中用户可以实现相互转换,每转换一个用户就是一个shell
    shell特点说明:
	1. 一般命令行临时配置的信息,只会影响当前shell
    2. 命令配置的信息如果想生效,需要切换shell	    eg: 修改主机名称

1589522214722

1589522563856

2.SSH服务连接工作原理(数据加密)
	[root@backup ~]# ssh 192.168.31.31
    [root@nfs01 ~/.ssh]# ls
    # known_hosts文件代表着你可以操控哪些主机,authorized_keys文件代表着哪些主机可以通过秘钥连接你的服务器
	authorized_keys  known_hosts	
    
    补充:加入AB两台服务器,B是服务端,A是客户端,a客户端想要通过秘钥形式连接b服务器,需要客户端将他的公钥发送给b服务端.
    
    私钥: 钥匙
	公钥: 锁头
	第一个步骤: 客户端  		    执行远程连接命令
	第二个步骤: 客户端  服务端    	  建立三次握手过程
	第三个步骤: 服务端            	让客户端进行确认是否接收服务端公钥信息
	第四个步骤: 客户端            	进行公钥确认,接收到公钥信息
	第五个步骤: 服务端            	让客户端确认登录用户密码信息
	第六个步骤: 客户端             	进行密码信息确认
	第七个步骤: 客户端  服务端    	  远程连接建立成功

	私钥和公钥作用:
	01. 利用私钥和公钥对数据信息进行加密处理
	02. 利用公钥和私钥进行用户身份认证
	
	基于密码的方式进行远程连接: 公钥和私钥只能完成数据加密过程
	基于秘钥的方式进行远程连接: 公钥和私钥可以完成身份认证工作

3.SSH远程连接的方式
    a 基于口令的方式进行远程连接  连接比较麻烦		连接不太安全
	b 基于秘钥的方式进行远程连接  连接方便    	  连接比较安全

    基于秘钥方式连接过程(原理)
	1. 客户端(管理端)    执行命令创建秘钥对
	2. 客户端(管理端)    建立远程连接(口令),发送公钥信息
	3. 客户端(管理端)    再次建立远程连接
	4. 服务端(被管理端)  发送公钥质询信息(你要是能打开我的锁头吗)
	5. 客户端(管理端)    处理公钥质询信息(钥匙将锁头打开),将质询结果返回给服务端
	6. 服务端(被管理端)  接收到质询结果,建立好远程连接
    

1589523444814

4.SSH实现基于秘钥连接的部署步骤
    准备工作:
	准备好一台管理服务器
	
	第一个历程: 管理端创建秘钥对信息
	[root@m01 ~]# ssh-keygen -t dsa
    Generating public/private dsa key pair.
    Enter file in which to save the key (/root/.ssh/id_dsa): 
    Created directory '/root/.ssh'.
    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.
	
	第二个历程: 管理端需要将公钥进行分发
	ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31
	
	第三个历程: 进行远程连接测试
	ssh 172.16.1.41   --- 不用输入密码信息可以直接连接
	
    问题: 
	01. 如何实现批量管理多台主机
	    如何编写脚本进行批量分发公钥???
        
    编写脚本最简单方式: 堆命令
	
	#!/bin/bash
	for ip in 31 7 41
    do 
	  ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.$ip
    done	
	问题: 有交互过程
	01. 需要有确认yes或no
	02. 需要输入密码信息    OK
	03. 服务端端口号变化了,如何分发公钥
	
	如何不用交互输入密码信息,进行远程连接分发公钥:
	第一步骤: 下载安装软件
	yum install -y sshpass
	
	第二步骤: 执行免交互方式分发公钥命令
	sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41
	
	如何不要输入连接yes或no的确认信息
	ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 "-o StrictHostKeyChecking=no"
	
	服务端口号发生变化,如何进行批量分发公钥
	sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 -p 52113 "-o StrictHostKeyChecking=no"

    分发公钥脚本:
	[root@m01 scripts]# vim fenfa_pub_key.sh
    #!/bin/bash
    
    for ip in {1..100}
    do
      echo "==================== host 172.16.1.$ip pub-key start fenfa ==================== "
      sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.$ip "-o StrictHostKeyChecking=no" &>/dev/null
      echo -e "host 172.16.1.$ip fenfa success."
      echo "==================== host 172.16.1.$ip fenfa end ==================== "
      echo ""
    done 

    分发公钥检查脚本(批量管理脚本)  --- 串型批量管理
    [root@m01 scripts]# cat check_pub_key.sh 
    #!/bin/bash
    CMD=$1
    for ip in {7,31,41}
    do
      echo "==================== host 172.16.1.$ip check ==================== "
      ssh 172.16.1.$ip $CMD 
      echo ""
    done 
    
5. SSH服务配置文件
    /etc/ssh/sshd_config
	Port 22                   --- 修改服务端口信息
	ListenAddress 0.0.0.0     --- 监听地址 指定一块网卡能够接受远程访问请求  *****
	                              PS: 指定监听地址只能是本地网卡上有的地址
	PermitEmptyPasswords no   --- 是否允许远程用户使用空密码登录,默认不允许
	PermitRootLogin yes       --- 是否禁止root用户远程连接主机 建议改为no
	GSSAPIAuthentication no   --- 是否开启GSSAPI认证功能 不用的时候关闭 
	UseDNS no                 --- 是否开启反向DNS解析功能 建议进行关闭
	
							
6. SSH远程服务防范入侵的案例 http://phenixikki.blog.51cto.com/7572938/1546669
    1. 用密钥登录,不用密码登陆
	2、牤牛阵法:解决SSH安全问题
	   a.防火墙封闭SSH,指定源IP限制(局域网、信任公网)
       b.开启SSH只监听本地内网IP(ListenAddress 172.16.1.61)。
    3、尽量不给服务器外网IP
    4、最小化(软件安装-授权)  # 777这种权限不要给,
    	一台服务器劲量安装较少的服务,可以使得暴露的端口比较少
    5、给系统的重要文件或命令做一个指纹
	   /etc/passwd md5sum 11110000aaaabbbb   监控	
	   inotify /bin                          监控
    6、给他锁上 chattr +i

7. SSH相关的命令总结   
    ssh-keygen
	ssh-copy-id
	sshpass 解决交互式密码输入问题
	ssh 
	scp 
	sftp 172.16.1.41
	ls       查看远程ftp服务器信息
	cd   --- 查看远程ftp服务器信息
	lls      查看本地ftp客户端信息
	lcd  --- 查看本地ftp客户端信息
	get  --- 下载信息
	put  --- 上传信息
	help --- 查看命令帮助
	bye  --- 退出ftp连接

问题:
    1.如何实现xshell也是基于秘钥方式连接主机
    https://www.zhiniaoyun.net/help/article/84.html

59.SSH远程连接回顾:

1.回顾
	1. 远程管理服务介绍
	   ssh     数据加密  22
	   telnet  数据明文  23
	2. SSH远程管理服务工作原理
	   私钥  公钥  
	   用途1: 对数据进行加密处理
	   用途2: 对用户访问进行认证
	3. SSH远程连接的方式
	   a 基于口令的方式进行连接
	   b 基于秘钥的方式进行连接
	   
	   基于秘钥连接的工作原理
	4. 基于秘钥的连接部署方式
       第一个历程: 创建秘钥对(管理端服务器)	
	   ssh-keygen -t 秘钥的类型(dsa|rsa)
	   第二个历程: 将公钥进行分发(被管理端服务器)
       ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31
       如何批量分发公钥:
	   01. 需要输入连接确认信息 yes/no
	   ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 "-o StrictHostKeyChecking=no"
	   02. 需要第一次连接输入密码
	   yum install -y sshpass
	   sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 "-o StrictHostKeyChecking=no"
	   03. 远程服务器SSH服务端口号改动了
	   sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 -p 52113 "-o StrictHostKeyChecking=no"
       
       基于秘钥连接排错思路:
	   01. 利用命令进行连接测试
	   02. 检查公钥在被管理主机上是否存在,并且与管理端公钥信息是否相同
	   03. 利用公钥分发命令重新分发公钥
	   04. 检查脚本的编写
	   05. 调试脚本功能   sh -x 
	   
	5. SSH远程服务防范入侵案例
       
	6. SSH服务的配置文件编写
	   监听地址???
    
	7. SSH服务的相关命令总结

60.批量管理:

1589546026455

0.课程介绍部分
    1. ansible批量管理服务概念
	2. ansible批量管理服务特点 
	3. ansible批量管理服务部署
	4. ansible批量管理服务应用---模块应用
	   ansible模块命令语法
	   ansible常用模块
1.ansible批量管理服务介绍
    ansible批量管理服务意义
	01. 提高工作的效率
	02. 提高工作准确度
	03. 减少维护的成本
	04. 减少重复性工作
	ansible批量管理服务功能
	01. 可以实现批量系统操作配置
	02. 可以实现批量软件服务部署
	03. 可以实现批量文件数据分发
	04. 可以实现批量系统信息收集

2.ansible批量管理服务部署 
    管理端服务器 
	第一个历程: 安装部署软件
	yum install -y ansible     --- 需要依赖epel的yum源
	/etc/ansible/ansible.cfg   --- ansible服务配置文件
    /etc/ansible/hosts         --- 主机清单文件   定义可以管理的主机信息
    /etc/ansible/roles         --- 角色目录???

	第二个历程: 需要编写主机清单文件
    vim /etc/ansible/hosts 
	
	第三个历程: 测试是否可以管理多个主机
	脚本  hostname
	ansible all -a "hostname"
    [root@m01 scripts]# ansible all -a "hostname"
    172.16.1.41 | CHANGED | rc=0 >>
    backup
    
    172.16.1.7 | CHANGED | rc=0 >>
    web01
    
    172.16.1.31 | CHANGED | rc=0 >>
    nfs01
    
3.ansible服务架构信息
    1) 主机清单配置 
	2) 软件模块信息         OK  
	3) 基于秘钥连接主机     OK
	4) 主机需要关闭selinux  OK
	5) 软件剧本功能

4.ansible软件模块应用
    ansible官方网站: https://docs.ansible.com/
	模块的应用语法格式:
	ansible 主机名称/主机组名称/主机地址信息/all  -m(指定应用的模块信息)  模块名称  -a(指定动作信息)  "执行什么动作"    
    
5.ansible特点说明
	1) ansible服务概念介绍
	   a 批量管理多台主机
	   b 提高运维工作效率
	   c 降低运维工作难度
    2) ansible服务特点说明
	   01. 管理端不需要启动服务程序(no server)
       02. 管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
       03. 受控端不需要安装软件程序(libselinux-python)
	       被管理端selinux服务没有关闭 --- 影响ansible软件的管理
		   libselinux-python让selinux开启的状态也可以使用ansible程序
       04. 受控端不需要启动服务程序(no agent)
       05. 服务程序管理操作模块众多(module)
       06. 利用剧本编写来实现自动化(playbook)
    3) ansible服务部署安装
	   a 安装服务软件
	   b 编写主机清单
	   c 进行管理测试
	
	   补充: 远程主机无法管理问题分析
	   1. 管理端没有分发好主机的公钥
	   2. 被管理端远程服务出现问题
	   3. 被管理端进程出现僵死情况
	      /usr/sbin/sshd -D  --- 负责建立远程连接
          sshd: root@pts/0   --- 用于维护远程连接(windows--linux)
          sshd: root@notty   --- 用于维护远程连接(ansible--被管理端)
	
	4) ansible服务模块应用
	   command (默认模块) 
	   shell   (万能模块)
	   script  (脚本模块)
	   copy    (批量分发文件) 管理端 ---> 多个被管理
	   fetch   (批量拉取数据) 管理端 <--- 多个被管理
	           dest
			   src
			   ansible 172.16.1.31 -m fetch -a "src=/tmp/oldboy.txt dest=/tmp"
	   file
	     
	   补充: ansible学习帮助手册如何查看
	   ansible-doc -l         --- 列出模块使用简介
	   ansible-doc -s fetch   --- 指定一个模块详细说明
	   ansible-doc fetch      --- 查询模块在剧本中应用方法

61.ansible模块:

1.command

1.命令类型模块:
	掌握第一个模块: command (默认模块)
	command – Executes a command on a remote node
	          在一个远程主机上执行一个命令
	简单用法:
	[root@m01 scripts]# ansible 172.16.1.31 -m command -a "hostname"
    172.16.1.31 | CHANGED | rc=0 >>
    nfs01
    
2.参数:
	1) chdir  	Change into this directory before running the command.
	          在执行命令之前对目录进行切换
	   ansible 172.16.1.31 -m command -a "chdir=/tmp touch oldboy.txt"

    2) creates	If it already exists, this step won't be run.
	            如果文件存在了,不执行命令操作
       ansible 172.16.1.31 -m command -a "creates=/tmp/hosts chdir=/backup touch oldboy.txt" 
	   
    3) removes	If it already exists, this step will be run.
                如果文件存在了,	这个步骤将执行
	   ansible 172.16.1.31 -m command -a "removes=/tmp/hosts chdir=/tmp touch oldboy.txt"
    4) free_form(required)
       The command module takes a free form command to run. 
	   There is no parameter actually named 'free form'. See the examples!
	   使用command模块的时候,-a参数后面必须写上一个合法linux命令信息
   
    注意事项:
	有些符号信息无法识别:  <", ">", "|", ";" and "&"

2.shell:

1.命令类型模块:
	掌握第一个模块: command (默认模块)
	command – Executes a command on a remote node
	          在一个远程主机上执行一个命令
	简单用法:
	[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "hostname"
    172.16.1.31 | CHANGED | rc=0 >>
    nfs01
    
2.参数:
	1) chdir  	Change into this directory before running the command.
	          在执行命令之前对目录进行切换
	   ansible 172.16.1.31 -m shell -a "chdir=/tmp touch oldboy.txt"

    2) creates	If it already exists, this step won't be run.
	            如果文件存在了,不执行命令操作
       ansible 172.16.1.31 -m shell -a "creates=/tmp/hosts chdir=/backup touch oldboy.txt" 
	   
    3) removes	If it already exists, this step will be run.
                如果文件存在了,	这个步骤将执行
	   ansible 172.16.1.31 -m shell -a "removes=/tmp/hosts chdir=/tmp touch oldboy.txt"
    4) free_form(required)
       The command module takes a free form command to run. 
	   There is no parameter actually named 'free form'. See the examples!
	   使用command模块的时候,-a参数后面必须写上一个合法linux命令信息
   
    注意事项:
	有些符号信息无法识别:  <", ">", "|", ";" and "&"
        
    实践应用: 利用shell执行脚本  
    第一个步骤: 编写一个脚本
    第二个步骤: 将脚本发送到远程主机
    第三个步骤: 将脚本权限进行修改(添加执行权限)
    第四个步骤: 运行ansible命令执行脚本

3.script:

rpm -e htop -nodeps  # 删除应用
scirpt  执行管控机文件
	ansible web -m script -a "/root/m.sh"  # 执行管控机文件
    ansible web -a "ls /"
    ansible web -m script -a "removes=/root/m.sh /root/m.sh" # 用来判断被管控机上是不是存在文件,如果存在就执行,不存在就跳过
    ansible web -m script -a "creates=/root/m.sh /root/m.sh" # 用来判断被管控机上是不是存在文件,如果不存在就执行,存在就跳过(删除)

4.copy:

基本用法:
	ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/etc/"
    172.16.1.31 | CHANGED => {       --- 对哪台主机进行操作
        "changed": true,             --- 是否对主机信息进行改变
        "checksum": "6ed7f68a1d6b4b36c1418338b2001e421eeba270",    --- 生成一个文件校验码==MD5数值
        "dest": "/etc/hosts",        --- 显示目标路径信息  
        "gid": 0,                    --- 显示复制后文件gid信息
        "group": "root",             --- 显示复制后文件属组信息
        "md5sum": "7afd7b74854f0aaab646b3e932f427c0",              --- 生成一个文件校验码==MD5数值
        "mode": "0644",              --- 显示复制后文件权限信息
        "owner": "root",             --- 显示复制后文件属主信息
        "size": 401,                 --- 显示文件的大小信息
        "src": "/root/.ansible/tmp/ansible-tmp-1557804498.23-26487341925325/source", 
        "state": "file",             --- 显示文件的类型信息
        "uid": 0                     --- 显示复制后文件uid信息
    }

    补充说明: ansible软件输出颜色说明:
	01. 绿色信息:  查看主机信息/对主机未做改动
	02. 黄色信息:  对主机数据信息做了修改
	03. 红色信息:  命令执行出错了
	04. 粉色信息:  忠告信息
	05. 蓝色信息:  显示ansible命令执行的过程???
	
	扩展用法:
	01. 在传输文件时修改文件的属主和属组信息
	ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ owner=oldboy group=oldboy"
	02. 在传输文件时修改文件的权限信息
	ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ mode=1777"
	03. 在传输数据文件信息时对远程主机源文件进行备份 
	ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ backup=yes"
    04. 创建一个文件并直接编辑文件的信息
    ansible 172.16.1.31 -m copy -a "content='oldboy123' dest=/etc/rsync.password"
	05.将管控机的文件复制到远程记得dest目录下
    ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/backup/hosts remote_src=no"
    06.将远程机的文件复制到远程机dest的目录下
    ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/backup/hosts remote_src=yes"
    
    自行研究: remote_src  directory_mode local_follow
	If no, it will search for src at originating/master machine.
	       src参数指定文件信息,会在本地管理端服务进行查找
    If yes it will go to the remote/target machine for the src. Default is no.
	       src参数指定文件信息,会从远程主机上进行查找

    PS: ansible软件copy模块复制目录信息
	ansible 172.16.1.31 -m copy -a "src=/oldboy dest=/oldboy"  
	src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制
	ansible 172.16.1.31 -m copy -a "src=/oldboy/ dest=/oldboy"  
	src后面目录有/:   只将目录下面的内容都进行远程传输复制	

5.file:

基本用法:
    ansible 172.16.1.31 -m file -a "dest=/etc/hosts owner=oldboy group=oldboy mode=666"	
	
	扩展用法:
	1. 可以利用模块创建数据信息 (文件 目录 链接文件)
	state  参数
    =absent    --- 缺席/删除数据信息
    =directory --- 创建一个目录信息
    =file      --- 检查创建的数据信息是否存在 绿色存在 红色不存在
    =hard      --- 创建一个硬链接文件
    =link      --- 创建一个软链接文件
    =touch     --- 创建一个文件信息
	
	创建目录信息:
	ansible 172.16.1.31 -m file -a "dest=/oldboy/ state=directory"
	ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy01/oldboy02/ state=directory"
    创建文件信息:
	ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy.txt state=touch"
	创建链接文件信息:
	ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy_hard.txt state=hard"
	ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy_link.txt state=link"

	2. 可以利用模块删除数据信息
	ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy.txt state=absent"
	ansible 172.16.1.31 -m file -a "dest=/oldboy/  state=absent"
	ansible 172.16.1.31 -m file -a "dest=/backup/n1 owner=xiaoming mode=755 recurse=yes" # 递归改变
	自行研究: recurse 

6.fetch:

fetch   (批量拉取数据) 管理端 <--- 多个被管理
    dest 保存到当前主机路径
    src 源文件路径
    flat 是否使用管控机主机名创建目录,放入dest的保存目录默:no(使用) yes(不使用)
ansible 172.16.1.31 -m fetch -a "src=/tmp/oldboy.txt dest=/tmp"

7.yum:

ansible 172.16.1.31 -m yum -a "name=iotop state=installed"
	name  --- 指定安装软件名称
	state --- 指定是否安装软件
	          installed   --- 安装软件
			  present	 ---和installed类型
			  latest     ---更新软件包
               absent     --- 卸载软件
               removed    --- 卸载软件 

8.service:

ervice模块: 管理服务器的运行状态  停止 开启 重启
	name:   --- 指定管理的服务名称
	state:  --- 指定服务状态
	             started   启动
				restarted 重启
				stopped   停止
                 reloaded  重新加载
	enabled --- 指定服务是否开机自启动
	ansible 172.16.1.31 -m service -a "name=nfs state=started enabled=yes"

9.cron:

cron模块: 批量设置多个主机的定时任务信息
	crontab -e 
	*   *  *  *  *  定时任务动作
	分 时 日 月 周
	
	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 )
	                       设置周信息
	name 				  设置定时任务名称
	job                    用于定义定时任务需要干的事情
    disable=yes			  注释定时任务
    state=absent		  删除定时任务
    
	基本用法:
	ansible 172.16.1.31 -m cron -a "minute=0 hour=2 data=* mouth=* weekday=* job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"

	扩展用法:
	01. 给定时任务设置注释信息
	ansible 172.16.1.31 -m cron -a "name='time sync' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
	
    02. 如何删除指定定时任务
	ansible 172.16.1.31 -m cron -a "name='time sync01' state=absent"
	PS: ansible可以删除的定时任务,只能是ansible设置好的定时任务
	
	03. 如何批量注释定时任务
	ansible 172.16.1.31 -m cron -a "name='time sync' job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1' disabled=yes"

10.mount:

mount: 批量进行挂载操作
	src:  需要挂载的存储设备或文件信息  # 需要挂载的目录,共享目录
	path: 指定目标挂载点目录  # 指定挂载到本机那个目录
	fstype: 指定挂载时的文件系统类型
	state
    present/mounted     --- 进行挂载
        present: 不会实现立即挂载,修改fstab文件,实现开机自动挂载
        mounted: 会实现立即挂载, 并且会修改fstab文件,实现开机自动挂载 *****

	absent/unmounted    --- 进行卸载
        absent:     会实现立即卸载, 并且会删除fstab文件信息,禁止开机自动挂载
        unmounted:  会实现立即卸载, 但是不会会删除fstab文件信息  *****

11.user:

user模块: 实现批量创建用户
    name  			指定用户名称
    uid				指定用户uid
    group			指定用户组
    groups			指定附加组
    create_home		是否创建用户家目录(默认yes,可以改为no)
    shell			指定用户使用shell
	基本用法:
	ansible 172.16.1.31 -m user -a "name=oldboy01"
	
	扩展用法:
	1) 指定用户uid信息
	ansible 172.16.1.31 -m user -a "name=oldboy02 uid=6666"
	
	2) 指定用户组信息
	ansible 172.16.1.31 -m user -a "name=oldboy03 group=oldboy02"
	ansible 172.16.1.31 -m user -a "name=oldboy04 groups=oldboy02"
	
	3) 批量创建虚拟用户
	ansible 172.16.1.31 -m user -a "name=rsync create_home=no  shell=/sbin/nologin"
	
	4) 给指定用户创建密码
	PS: 利用ansible程序user模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置
	生成密文密码信息方法:
	方法一:
	ansible all -i localhost, -m debug -a "msg={{ '密码信息123456' | password_hash('sha512', 'oldboy') }}"
	[root@m01 tmp]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'oldboy') }}"
    localhost | SUCCESS => {
      "msg": "$6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1"
    }
	
	方法二:(忽略)
	mkpasswd --method=sha-512
	
	方法三:
    yum install -y python-pip
    pip install passlib
    python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
    Password: 
    $6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk.
	
	ansible 172.16.1.31 -m user -a 'name=oldboy08 password=$6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1'

62.ansible剧本编写规范:

1. 剧本的编写方法
    剧本的作用: 可以一键化完成多个任务
	自动化部署rsync服务:
	服务端的操作
	第一个历程安装软件:
	ansible 172.16.1.41 -m yum -a "name=rsync state=installed"
	
	第二个历程编写文件:
	ansible 172.16.1.41 -m copy -a "src=/xxx/rsyncd.conf dest=/etc/"
	
	第三个历程创建用户
	ansible 172.16.1.41 -m user -a "name=rsync create_home=no shell=/sbin/nologin"
	
	第四个历程创建目录
	ansible 172.16.1.41 -m file -a "dest=/backup state=directory owner=rsync group=rsync"
	
	第五个历程创建密码文件
	ansible 172.16.1.41 -m copy -a "content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600"
	
	第六个历程启动服务
	ansible 172.16.1.41 -m service -a "name=rsyncd state=started enabled=yes"
	
	客户端的操作:
	第一个历程: 创建密码文件
	ansible 客户端地址 -m copy -a "content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600"
	
	剧本的做成部分:
	演员信息: 男一号   hosts
	干的事情: 吻戏     tasks
	
	演员信息: 男二号
	干的事情: 看着
    
    剧本编写规范: pyyaml -- 三点要求
	1. 合理的信息缩进  两个空格表示一个缩进关系
	   标题一
	     标题二
	       标题三
	PS: 在ansible中一定不能用tab进行缩进
 
    2. 冒号的使用方法
	   hosts: 172.16.1.41
	   tasks:
	   yum: name=xx
	PS: 使用冒号时后面要有空格信息
	    以冒号结尾,冒号信息出现在注释说明中,后面不需要加上空格
		
    3. 短横线应用 -(列表功能)
	   - 张三
	     男
	       - 打游戏
		   - 运动
		      
	   - 李四
	     女
	       学习
	          湖南
	   - 王五
	     男
	       运动
	          深圳
	PS: 使用短横线构成列表信息,短横线后面需要有空格  
	   
	开始编写剧本
    mkdir /etc/ansible/ansible-playbook
    vim rsync_server.ymal
    说明: 剧本文件扩展名尽量写为yaml
    1. 方便识别文件是一个剧本文件
    2. 文件编写时会有颜色提示	
- hosts: 172.16.1.41
  tasks:
    yum: name=rsync state=installed
    copy: src=/tmp/rsyncd.conf dest=/etc/
	
	如何执行剧本:
	第一个步骤: 检查剧本的语法格式
	ansible-playbook --syntax-check  rsync_server.yaml
    第二个步骤: 模拟执行剧本
	ansible-playbook -C rsync_server.yaml
	第三个步骤: 直接执行剧本   
	ansible-playbook rsync_server.yaml   
	   
- hosts: 172.16.1.41
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-push conf file
      copy: src=/tmp/rsyncd.conf dest=/etc/

63.playbook编写:

0.回顾
	1) 将所有模块进行了讲解说明
	   command	模块: 	在远程主机上执行命令操作   默认模块
	   shell	模块:  	在远程主机上执行命令操作   万能模块
	   PS: 有时剧本不能反复执行!!!
	   script	模块: 	批量执行本地脚本
	   copy		模块:	用于批量分发传输数据信息
	   fetch	模块:	用于将远程主机数据进行拉取到本地管理主机
	   file		模块: 	修改数据属性信息/创建数据信息
	   yum		模块:	用于安装和卸载软件包
	   service	模块:	用于管理服务的运行状态 
       user		模块:	用于批量创建用户并设置密码信息
	   mount	模块:	用于批量挂载操作
	   cron		模块: 	批量部署定时任务信息
	   ping		模块:	远程管理测试模块
	   
    2) ansible服务剧本功能
       剧本的组成部分:
       剧本的语法规范:
       1) 空格规范: 实现缩进功能
       2) 冒号规范: 实现键值定义 
       3) 横线规范: 实现列表显示	   
	
1.rsync服务部署
	rsync	服务部署
	nfs		服务部署
	sersync 服务部署 
	全网备份项目
	
	rsync服务剧本编写:
	准备工作:
	01. 熟悉软件部署流程
	02. 熟悉ansible软件模块使用
	03. 熟悉ansible剧本编写规范
	ansible:
	ad-hoc    临时实现批量管理功能(模块)   --- 命令
	playbook  永久实现批量管理功能(剧本)   --- 脚本	

    剧本编写常见错误:
	01. 剧本语法规范是否符合(空格 冒号 短横线)
	02. 剧本中模块使用是否正确
	03. 剧本中一个name标识下面只能写一个模块任务信息
	04. 剧本中尽量不要大量使用shell模块
	

    [root@m01 ansible-playbook]# cat rsync_server.yaml 
- hosts: rsync_server
  tasks:
    - name: 01-install rsync  
      yum: name=rsync state=installed
    - name: 02-push conf file    
      copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
    - name: 03-create user
      user: name=rsync create_home=no shell=/sbin/nologin
      #shell: useradd rsync -M -s /sbin/nologin 
    - name: 04-create backup dir
      file: path=/backup state=directory owner=rsync group=rsync
    - name: 05-create password file
      copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
    - name: 06-start rsync server
      service: name=rsyncd state=started enabled=yes

- hosts: rsync_clients
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-create password file
      copy: content=oldboy123 dest=/etc/rsync.password mode=600
    - name: 03-create test file
      file: dest=/tmp/test.txt  state=touch
    - name: 04-check test
      shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
                
2.nfs服务部署  # 在65playbook进阶中最好一个
	第一个历程:创建目录
    第二个历程:编写配置文件
    第三个历程:执行yaml文件
3.sersync服务部署
全网备份项目

64.主机清单配置:

如何配置主机清单
    第一种方式: 分组配置主机信息
	[web]
    172.16.1.7
    172.16.1.8
    172.16.1.9
    
    [data]
    172.16.1.31
    172.16.1.41
	操作过程
    [root@m01 ansible-playbook]# ansible data -a "hostname"
    172.16.1.31 | CHANGED | rc=0 >>
    nfs01
    
    172.16.1.41 | CHANGED | rc=0 >>
    backup
    
    [root@m01 ansible-playbook]# ansible web -a "hostname"
    172.16.1.7 | CHANGED | rc=0 >>
    web01
	
	第二种方式: 主机名符号匹配配置
	[web]
    172.16.1.[7:9]
	[web]
    web[01:03]
	
	第三种方式: 跟上非标准远程端口
	[web]
    web01:52113    # web01在/etc/hosts文件中配置的
    172.16.1.7:52113
	
	第四种方式: 主机使用特殊的变量
    [web]
    172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
    [web]
    web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456

    第五种方式: 主机组名嵌入配置
	[rsync:children]    --- 嵌入子组信息
    rsync_server
    rsync_client
    
    [rsync_server]
    172.16.1.41
    
    [rsync_client]
    172.16.1.31
    172.16.1.7
	
	[web:vars]         --- 嵌入式变量信息
    ansible_ssh_host=172.16.1.7
    ansible_ssh_port=52113
    ansible_ssh_user=root
    ansible_ssh_pass=123456
    [web]
    web01

    主机清单的配置方法:
	https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
        
    ansible -i 指定主机清单(默认为/etc/ansible/hosts)

65.playbook进阶:

1. 编写剧本的重要功能介绍
    a 在剧本中设置变量信息  OK
	b 在剧本中设置注册信息  OK 执行剧本时,可以显示输出命令结果信息
	b 在剧本中设置判断信息  OK
	c 在剧本中设置循环信息
	d 在剧本中设置错误忽略
	d 在剧本中设置标签信息
	e 在剧本中设置触发信息
	f 在剧本中进行剧本整合
	
	
02. 在剧本中设置变量信息
    方式一:直接在剧本文件编写  
	vars:
      oldboy01: data01
      oldboy02: data02
 
    方式二:在命令行中进行指定
    ansible-playbook -e passfile=rsync.password -e backupdir=data

    方式三:在主机清单文件编写
    [rsync_server]
    [rsync_server:vars]
    passfile=rsync.password
    backupdir=data

    三种变量设置方式都配置了,三种方式的优先级???
	最优先: 命令行变量设置
	次优先: 剧本中变量设置
    最后:   主机清单变量设置

	如何全局设置变量: roles 剧本整合
	
	
3. 在剧本中设置注册信息  # 显示执行命令之后的结果
    - hosts: oldboy
      tasks:
        - name: check server port
          shell: netstat -lntup  --- 端口信息
          register: get_server_port<--端口信息  # 将这个命令进行注册
    
        - name: display port info  # 注册之后就可以获取
          d2ebug: msg={{ get_server_port.stdout_lines }}
	显示进程信息,表示服务已经正常启动
	PS: 设置变量不能有空格信息
		  
4. 在剧本中设置判断信息
    如何指定判断条件:
	(ansible_hostname == "nfs01")
	(ansible_hostname == "web01")
	setup模块中显示被管理主机系统的详细信息

    - hosts: oldboy
      remote_user: root
      tasks:
        - name: Check File
          file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
          when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")	
	
	    - name: install httpd
		  yum: name=httpd state=installed
		  when: (系统情况 == "CentOS")
		  
		- name: install httpd2
          yum: name=httpd2 state=installed
          when: (系统情况 == "ubuntu") 

	获取内置变量方法:
	ansible rsync_server -m setup -a "filter=ansible_hostname"
    常见主机信息:
    ansible_all_ipv4_addresses:				仅显示ipv4的信息。
    ansible_devices:							仅显示磁盘设备信息。
    ansible_distribution:						显示是什么系统,例:centos,suse等。
    ansible_distribution_major_version:		显示是系统主版本。
    ansible_distribution_version:				仅显示系统版本。
    ansible_machine:							显示系统类型,例:32位,还是64位。
    ansible_eth0:								仅显示eth0的信息。
    ansible_hostname:							仅显示主机名。
    ansible_kernel:							仅显示内核版本。
    ansible_lvm:								显示lvm相关信息。
    ansible_memtotal_mb:						显示系统总内存。
    ansible_memfree_mb:						显示可用系统内存。
    ansible_memory_mb:							详细显示内存情况。
    ansible_swaptotal_mb:						显示总的swap内存。
    ansible_swapfree_mb:						显示swap内存的可用内存。
    ansible_mounts:							显示系统磁盘挂载情况。
    ansible_processor:							显示cpu个数(具体显示每个cpu的型号)。
    ansible_processor_vcpus:					显示cpu个数(只显示总的个数)。
	
	获取子信息方法:
	ansible_eth0[ipv4]

5. 在剧本中设置循环信息
    vim test04.yml
    - hosts: all
      remote_user: root
      tasks:
        - name: 02-push conf file    
          copy: src=/etc/ansible/server_file/rsync_server/ dest={ item.desc }  mode={ item.mode }
          with_items:
            - { src: "rsyncd.conf", desc: "/etc/",mode: "644" }
            - { src: "rsync.password", desc: "/etc/", mode: "600" }
    
    vim test05.yml
    - hosts: all
      remote_user: root
      tasks:
        - name: Installed Pkg
          yum: 
            name={{ item }}  state=present
          with_items:
    	    - wget
    		- tree
    		- lrzsz	
         或者是使用下面这种方式:
         yum: 
            name: [ "wget", "tree", "lrzsz" ]  
            state: present
                
6. 在剧本中设置忽略错误
    默认playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行
    可以加入ignore_errors: yes忽略错误
    vim test06.yml
    - hosts: all
      remote_user: root
      tasks:
        - name: Ignore False
          command: /bin/false
    	  ignore_errors: yes
        - name: touch new file
    	  file: path=/tmp/oldboy_ignore state=touch		

7. 在剧本中设置标签功能
    - hosts: oldboy
      ignore_errors: yes
      remote_user: root
      tasks:
        - name: Check File
          file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
          when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
		  tags: t1
    
        - name: bad thing
          command: ech 123
          #ignore_errors: yes
		  tags: t2
    
        - name: install httpd
          yum: name=httpd state=installed
          when: (ansible_all_ipv4_addresses == ["172.16.1.7","10.0.0.7"])
		  tags: t3
    
        - name: install httpd2
          yum: name=httpd2 state=installed
          when: (ansible_distribution == "ubuntu")
		  tags: t4
		  
	指定执行哪个标签任务: ansible-playbook --tags=t2 test05.yml    # 在剧本中打标签不能使用纯数字
	跳过指定标签任务:     ansible-playbook --skip-tags=t2 test05.yml 		

8. 在剧本中设置触发功能
    - hosts: backup
      remote_user: root
      tasks:
        - name: 01 Install rsync
          yum: name=rsync state=present
        
        - name: 02 push config file
          copy: src=./file/{{ item.src }} dest=/etc/{{ item.dest }} mode={{ item.mode }} 
          with_items:
            - { src: "rsyncd.conf", dest: "rsyncd.conf", mode: "0644" }
            - { src: "rsync.password", dest: "rsync.password", mode: "0600" }
          notify: restart rsync server   # 当有copy命令再次执行(使得配置文件发生改变),就发起通知

      handlers:
        - name: restart rsync server   # name必须是notify中的内容
          service: name=rsyncd state=restarted   


9. 将多个剧本进行整合
    方式一:include_tasks: f1.yml
    - hosts: all
      remote_user: root
      tasks:
        - include_tasks: f1.yml
        - include_tasks: f2.yml

    方式二:include: f1.yml
    - include:f1.yml	
    - include:f2.yml

	方式三:- import_playbook:  # 推荐
	[root@m01 ansible-playbook]# cat main.yml 
    - import_playbook: base.yml     
    - import_playbook: rsync.yml    
    - import_playbook: nfs.yml      
	- import_playbook: oxxx.yml
    - import_playbook: rsync.yml
    - import_playbook: nfs.yml
        
10 编写NFS服务剧本
   第一个历程: 创建几个目录
   [root@m01 ansible-playbook]# tree nfs-file/
   nfs-file/
   ├── nfs-client
   └── nfs-server
   
   第二个历程: 编写剧本信息
   主机清单:
   [nfs:children]
   nfs_server
   nfs_client
   [nfs_server]
   172.16.1.31
   [nfs_client]
   172.16.1.7
   #172.16.1.8
   #172.16.1.9

- hosts: nfs
  tasks:
    - name: 01-install nfs software
      yum:
        name: ['nfs-utils','rpcbind']
        state: installed

- hosts: nfs_server
  #vars:
  #  Data_dir: /data
  tasks:
    - name: 01-copy conf file
      copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc
      notify: restart nfs server
    - name: 02-create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody 
       # path: ['data01','data02','data03'] 
       # state: directory 
       # owner: nfsnobody 
       # group: nfsnobody
    - name: 03-boot server
      #service: name=rpcbind state=started enabled=yes
      #service: name=nfs state=started enabled=yes
      service: name={{ item }} state=started enabled=yes
      with_items:
        - rpcbind
        - nfs     
 
  handlers:
    - name: restart nfs server
      service: name=nfs state=restarted
       
- hosts: nfs_client
  #vars:
  #  Data_dir: /data
  tasks:
    - name: 01-mount
      mount: src=172.16.1.31:{{ Data_dir }} path=/mnt fstype=nfs state=mounted
    - name: 02-check mount info
      shell: df -h|grep /data
      register: mount_info
    - name: display mount info
      debug: msg={{ mount_info.stdout_lines }}      
   第三个历程: 进行剧本测试

66.playbook优化:

10. ansible程序roles --- 规范
    剧本编写完问题:
    1. 目录结构不够规范            OK
    2. 编写好的任务如何重复调用
    3. 服务端配置文件改动,客户端参数信息也自动变化
    4. 汇总剧本中没有显示主机角色信息
    5. 一个剧本内容信息过多,不容易进行阅读,如何进行拆分	 OK
	
	第一个历程: 规范目录结构
	cd /etc/ansible/roles
	mkdir {rsync,nfs}   --- 创建相应角色目录
	mkdir {nfs,rsync}/{vars,tasks,templates,handlers,files}  --- 创建角色目录下面的子目录
	[root@m01 roles]# tree 
    .
    ├── nfs
    │   ├── files       --- 保存需要分发文件目录 
    │   ├── handlers	--- 保存触发器配置文件信息
    │   ├── tasks       --- 保存要执行的动作信息文件   ok
    │   ├── templates   --- 保存需要分发模板文件 模板文件中可以设置变量信息
    │   └── vars        --- 保存变量信息文件
    └── rsync
        ├── files
        ├── handlers
        ├── tasks
        ├── templates
        └── vars
	
    第二个历程: 在roles目录中创建相关文件
	编写文件流程图:
	1) 编写tasks目录中的main.yml文件
	- name: 01-copy conf file
      copy: src=exports dest=/etc
      notify: restart nfs server
    - name: 02-create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody   
      # path: ['data01','data02','data03']    
      # state: directory    
      # owner: nfsnobody    
      # group: nfsnobody
    - name: 03-boot server
      service: name={{ item }} state=started enabled=yes
      with_items:
        - rpcbind
        - nfs
  	
    # 将上面的任务拆分成多个yaml文件,通过main文件导入
	vim main.yml
	- include_tasks: copy_info.yml
	- include_tasks: create_dir.yml
	- include_tasks: boot_server.yml
	
    vim copy_info.yml 	
	- name: 01-copy conf file
      copy: src=exports dest=/etc
      notify: restart nfs server

    vim create_dir.yml
    - name: 02-create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody 

    vim boot_server.yml
    - name: 03-boot server
      service: name={{ item }} state=started enabled=yes
      with_items:
        - rpcbind
        - nfs	

	2) 编写vars目录中的main.yml文件 
	[root@m01 vars]# vim main.yml
    Data_dir: /data
	
	3) 编写files目录中的文件
	[root@m01 files]# ll
    total 4
    -rw-r--r-- 1 root root 29 May 17 15:23 exports
	
	4) 编写handlers目录中的main.yml文件
	vim main.yml
    - name: restart nfs server
    service: name=nfs state=restarted
	
	目录中文件编写好汇总结构
	[root@m01 nfs]# tree
    .
    ├── files
    │   └── exports
    ├── handlers
    │   └── main.yml
    ├── tasks
    │   └── main.yml
    ├── templates
    └── vars
        └── main.yml
		
    第三个历程: 编写一个主剧本文件
	[root@m01 roles]# cat site.yml 
    - hosts: nfs_server
      roles:
        - nfs-server
    
    - hosts: rsync_server
      roles:
        - rsync

rsync:

- hosts: 172.16.1.41
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-copy rsyncd.conf
      copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
    - name: 03-create user
      user: name=rsync create_home=no shell=/sbin/nologin
    - name: 04-create baskup dir
      file: dest=/backup state=directory owner=rsync group=rsync
    - name: 05-create password file
      copy: dest=/etc/rsync.password content=rsync_backup:oldboy123 mode=600
    - name: 06-start rsync server
      service: name=rsyncd enabled=yes state=started


- hosts: 172.16.1.31,172.16.1.7
  tasks:
    - name: 01-yum rsync 
      yum: name=rsync state=installed
    - name: 02-create password file
      copy: dest=/etc/rsync.password content=oldboy123 mode=600
    - name: 03-check test backup data
      file: dest=/tmp/test.txt state=touch
    - name: 04-check-test
      shell: rsync -az /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

nfs:

- hosts: nfs
  tasks: 
    - name: 01-install nfs software
      yum: name={{ item }} state=installed
      with_items:
        - nfs-utils
        - rpcbind

- hosts: nfs_server
  vars:
    data_dir: /data
  tasks:
    - name: 01-copy conf file
      copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc/
      notify: restart nfs server
    - name: 02-create data dir
      file: dest={{ data_dir }} state=directory owner=nfsnobody group=nfsnobody
    - name: 03-boot server
      service: name=rpcbind state=started enabled=yes
      # service: name=nfs state=started enabled=yes
      with_items:
        - rpcbind
        - nfs 
           
  handlers:
   - name: restart nfs server
     service: name=nfs state=restarted  

- hosts: nfs_client
  vars:
    data_dir: /data
  tasks:
    - name: 01-mount
      mount: src=172.16.1.31:{{ data_dir }} path=/mnt fstype=nfs state=mounted
    - name: 02-check mount info
      shell: df -h|grep /data
      register: mount_info
    - name: 03-display mount info
      debug: msg={{ mount_info.stdout_lines }}
      tags: t1
posted @ 2020-05-31 14:27  楠海  阅读(192)  评论(0编辑  收藏  举报