一、目标

ansible的一些简单的命令,file模块,copy模块,shell模块的使用

二、平台

centos7.6, Ansible2.4.2.0

三、解析

1.本次实验需要三台服务器,1个主控机器,2个客户端主机。主ip:192.168.0.47,两个客户端:192.168.0.176/229
2.主要文件

  • /etc/ansible/ansible.cfg     -----> 主配置文件
  • /etc/ansible/hosts      -----> 主机列表
  • /etc/ansible/roles       -----> 角色配置文件
  • /usr/bin/ansible      -----> 主程序
  • /usr/bin/ansible-galaxy     ----->上传下载游戏啊代码或roles模块的官网平台
  • /usr/bin/ansible-playbook     ----->剧本,定制自动化任务,编排剧本工具/urs/bin/ansible-pull
  • /usr/bin/ansible-vault   ----->文件加密工具
  • /usr/bin/ansible-console   ----->基础Console界面与用户交互的执行工具
  • log_path = /var/log/ansible.log  ----->ansible配置文件中默认日志是关闭的,将注释符#去掉即可。

3.ansible的执行过程

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_学习

四、例子

1.一次性调用多个主机清单的分组(取两个组的所有主机),逻辑或

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_学习_02

ansible xdbServers:xwebServers -m ping 
#xdbServers和xwebServers是主机清单中的两个自定义主机分组,冒号:是或的意思。

2.使用通配符去调用主机清单中的所有相关分组

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_服务器_03

ansible x* -m ping
#去ping主机清单中所有以x开头的分组

3.一次性调用多个主机清单的分组(取两个组的交集主机),逻辑与

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_学习_04

ansible 'xwebServers:&xdbServers' -m ping
#去ping两个分组中的交集主机,即要是某些主机既是xwebServers成员,又是xdbServers成员才去ping

4.一次性调用多个主机清单的分组(取前一个组所有主机,但抛去交集中的主机),!逻辑与

ansible 'xweb:!xdb' -m ping
#主机得在xweb组,但要去除在xdb中的所有主机。与:&正好相反

5.综合逻辑

ansible 'xdb:xweb:&xapp:!xbak' -m ping
#要取的主机是:在xdb组中或xweb中,并且在xapp中,但又不在xbak中。

6.正则表达式的豫剧写法

ansible '~(db|web).*' -m ping
#取主机列表中,包含db或web的所有主机组

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_服务器_05

五、常用模块之command模块

1.查看所有主机的家目录

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_创建文件夹_06

ansible all -a 'ls /home'
#不加模块名默认就是command模块

2.查看所有主机的磁盘情况

ansible all -m command -a 'df -hT'
#还可以写成ansible all -a 'df -hT' ,即不加任何模块默认的就是command模块
#本命令是查看所有主机的磁盘情况

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_学习_07

2019年11月3日23:19:49

3.command模块之removes参数
如果客户端主机中文件/etc/xfile不存在,就不执行“创建文件夹test111”
反过来理解就是:如果这个文件/etc/xfile存在了,那就创建文件夹test111.

ansible all -a 'removes=/etc/xfile mkdir  /home/kahn/test111'

4.command模块之creates参数
如果客户端主机中文件/etc/xfile存在,就不执行“创建文件夹test111”
反过来理解就是:如果/etc/xfile不存在,就执行“创建文件夹test222”

ansible all -a 'creates=/etc/xfile mkdir  /home/kahn/test222'

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_学习_08

5.command模块之chdir参数
chdir是切换目录后再执行其他命令的意思

ansible all -a 'chdir=/tmp ls'
#先切换目录到/tmp,然后在ls。相当于ls /tmp

6.执行客户机上的脚本

ansible all -a '~/getHostname.sh'
#执行所有主机上的/root/getHostname.sh脚本
#注意啊,脚本getHostname.sh是放在客户端上的,而非主控端

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_服务器_09

六、常用模块之shell模块(与command模块比,shell支持更多的特殊字符)

1.查看所有主机的用户名

ansible all -m shell -a 'echo $HOSTNAME'
#使用shell模块去执行命令(带系统变量符$的),注意格式。

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_创建文件夹_10

2.更改所有主机上的用户名为kahn的密码为xpwd111

ansible all -m shell -a 'echo xpwd111 |passwd --stdin kahn'
#使用shell模块在所有客户端上执行命令,更改kahn的密码为xpwd111

3.查看所有主机的中是否包含kahn这个用户
[root@com47 ansible]# ansible xdb -a 'getent passwd kahn'

4.查看xdb中某一台主机是否有kahn这个用户

[root@com47 ansible]# ansible xdb -a 'getent passwd kahn' --limit 192.168.0.176 

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_java_11

七、常用模块之script模块

1.执行脚本对所有主机

[root@com47 script]# cat getHostname.sh 
#!/bin/bash
#file name: getHostname.sh
#获得主机名的小脚本
hostname
#grep -A2显示匹配到的结果以及它的后两行,tail -n1显示最后一行,
#cut -f1 -d '/'切片,切取第一段,要是取第二段就是f2
ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/'


[root@com47 script]# ansible all -m script -a '/root/script/getHostname.sh'

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_java_12

八、常用模块之copy模块

1.将某个文件从主控端拷贝到所有客户端(客户端不存在这个文件)

ansible all -m copy -a 'src=/root/a.txt dest=/home/kahn/'

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_java_13

2.将某个文件从主控端拷贝到所有客户端(覆盖。若客户端存在这个文件,就先备份一下)

ansible all -m copy -a 'src=/root/a.txt dest=/home/kahn/ backup=yes'
#将原文件从主控端的/root/a.txt,复制到客户端的/home/kahn/目录下,拷贝前备份一下目标文件。

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_创建文件夹_14

3.将某个文件从主控端拷贝到所有客户端,并且用其他的名字命名文件(覆盖。若客户端存在这个文件,就先备份一下,同时设置文件权限是000,所属者是kahn)

ansible all -m copy -a 'src=/root/a.txt dest=/home/kahn/x.txt backup=yes mode=000 owner=kahn'
#从主控端拷贝文件a.txt到所有客户的的/home/kahn/下,并且将文件名重命名为x.txt。
#backup=yes若客户端存在这个x.txt名字,则先备份之。
#更改文件的模式为000,own为kahn

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_创建文件夹_15

4.使用copy模块,直接生成一些简单的文字内容,在客户端机器上生成一个新文件b.txt,且生成文件前先备份b.txt

ansible all -m copy -a 'content="hello world\n kahn20191104\n" dest=/home/kahn/b.txt backup=yes'
#使用copy模块,直接生成一些简单的文字内容,在客户端机器上生成一个新文件b.txt,且生成文件前先备份b.txt

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_创建文件夹_16

5.从客户端抓取文件到主控端

ansible all -m fetch -a 'src=/var/log/dmesg dest=/data'
#使用fetch模块,去远程客户端src=/var/log/上去抓取文件dmesg,到目的地是主控端的/data目录下。
#注意,fetch目前仅支持抓取文件,不支持文件夹。

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_java_17


ansible 命令行拷贝远程文件到本地 ansible复制文件夹_客户端_18

6.将客户端的/var/log目录下的所有*.log文件打包,并抓取回主控机

#1.先打包压缩客户机上的/var/log/*.log文件
ansible all -m shell -a 'tar -czvf logs.tar.gz /var/log/*.log'
#2.将所有客户端上的/root/logs.tar.gz文件传回到主控机的/data目录下
ansible all -m fetch -a 'src=/root/logs.tar.gz dest=/data'

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_java_19

九、常用模块之file模块

1.使用file模块创建文件

ansible all -m file -a 'name=/data/xfile1 state=touch'
#使用file模块给所有主机创建个文件叫xfile1(前提是/data文件夹必须存在,否则创建失败)

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_java_20

2.使用file模块删除文件

ansible all -m file -a 'name=/data/xfile1 state=absent'
#删除所有客户端上的/data/xfile1文件。

ansible 命令行拷贝远程文件到本地 ansible复制文件夹_学习_21

3.使用file模块创建文件夹

ansible all -m file -a 'name=/data/folder1 state=directory'

4.使用file模块删除文件夹

ansible all -m file -a 'name=/data/folder1 state=absent'
#删除所有客户机上的folder1文件夹

5.使用file模块创建软连接

ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link'
或(dest和name是一样的)
ansible all -m file -a 'src=/etc/fstab name=/data/fstab2.link state=link'

6.使用file模块删除软连接

ansible all -m file -a 'name=/data/fstab2.link state=absent'
#删除名字叫fstab2.link的软链接

2019年11月5日13:47:49