ansible模块命令详解

1、ping 模块
#ansible-doc -s ping
​​​ansible模块命令详解_第1张图片
在这里插入图片描述
对于ping 我们还可以设置data参数,来作为对ping的响应值
ansible模块命令详解_第2张图片

2、Command 模块:
远程主机运行命令(比如我们在远程主机上创建一个目录,任何你写执行的命令都可以)
比如在每一台被管理的主机上的tmp下创建一个临时文件
Ansible all -m command
Ansible-doc -s command
Chdir:命令需不需要切换到某个目录
对于command模块 本身来讲,比较独特之处在于,使用“-a”时,要运行哪个命令,后面直接跟命令就行
举例:
#ansible all -m command -a ‘mktemp /tmp/file.xxxx’ 在tmp下创建临时文件,叫做file.xxxx
#ansible all -m command -a ‘useradd user5’ 在被管理的主机上分别创建用户
在这里插入图片描述在这里插入图片描述

验证:
在这里插入图片描述
ansible模块命令详解_第3张图片注:再次执行这一条命令就会报错,我们之前提过,对于ansible来讲,我们要确认它是幂等的,如果执行一次或者执行n次,结果都不报错,要确保结果是一样的才可以,但是现在报错,这也就意味着,我们必须要要加条件确保它不会报错才可以,因为有些命令自身不具有幂等性的,所以需要我们加一些条件,转为在ansible是幂等的,才能在ansible上使用。这里应该不存在在创建。
加条件以后,还是报错了,“||”无法识别
在这里插入图片描述
举例:
在这里插入图片描述
“{}”这个符号在shell中的作用就是解释器,也就是你的命令会自动知道这个意思是什么,不是命令知道,而且发起执行命令的shell知道,所以你把{1…5}传给echo之前就被shell转成了 1 2 3 4 5了,同样这个“||”也是shell,如果这个命令不通过是shell,而是直接执行,那这个解析就不能做了。其实command所执行的命令是直接发给目标主机,而不是由shell解析过的。命令运行有两种方式:一,直接提交给内核运行;二,在内核上提交运行shell进程,由shell解释并运行它。下面我就来学习一下shell模块

3、Shell模块:
远程主机在shell进程下运行命令,支持shell特性,如管道等
ansible模块命令详解_第4张图片
Executable:如果不想使用当前shell执行,使用指定shell执行的话,我们使用目标shell,也可以指定使用哪个shell来解析。

举例:#ansible all -m shell -a ‘id user5 || useradd user5’
在这里插入图片描述
同样的功能还有一个,比如想要给user5 这个用户添加一个密码。那使用command命令和shell命令会是两种结果:
在这里插入图片描述
如果是command命令,就相当于只echo了一个字符串,并不会去自动识别管道符,也就是说并没有在被管理的主机上成功设置密码;
在这里插入图片描述
这就是command运行的结果,下面看shell运行的结果:
ansible模块命令详解_第5张图片
在这里插入图片描述

如果是shell运行的结果,它就是正常的,显示密码被设置成功。

4、Group 模块:管理组
Gid:是否指明自定义使用的gid号
Name:加上(required)表示这个参数必须定义
State:定义状态,默认就表示创建,如果想删除,就需要明确定义
System:是否创建为系统组(yes就是系统组,否则就是普通用户组)
1)创建组
ansible模块命令详解_第6张图片
注:这个反馈结果怎么不是绿色的呢?是因为“changed”:true,这表示目标主机的状态发生了改变,这个是因为目标主机上本来是没有的。
当返回信息为绿色时,”changed”为false,表示ansible没有进行任何操作,没有”改变什么”。
当返回信息为黄色时,”changed”为true,表示ansible执行了操作,”当前状态”已经被ansible改变成了”目标状态”。
这就是ansible幂等性
在这里插入图片描述
2)删除组
在这里插入图片描述
3)验证node主机有没有这个组
在这里插入图片描述
在这里插入图片描述

**5、User模块:**管理用户
Name:用户名、state、system、uid 、skeleton(从哪去读skeleton,创建用户时,会自动复制一些环境设定文件,默认都是/etc/skeleton中的文件)、shell(默认shell是什么)、password(默认给一个加密码的密码放在此处)、home(家目录)、group(基本组)、groups(附加组)、
Expires(过期时间)、create_home(是否给用户创建家目录)

1)创建用户:
ansible模块命令详解_第7张图片
验证:
ansible模块命令详解_第8张图片
ansible模块命令详解_第9张图片

在执行一次并没有改变,那如果改掉它的uid呢
ansible模块命令详解_第10张图片
如上图所示,只是这个用户的uid发生了改变,其余都没有改变。
如果要删除用户,只需要把状态改成:absent即可。
ansible 192.168.171.150 -m user -a ‘name=tom uid=1201 state=absent groups=ansible’。

这三个模块从名字上看,都和文件处理相关的

6、copy模块:
把ansible主机的文件复制到远程主机上(一对多)
Dest:复制到远程主机,放到哪个目标路径下(需要是绝对路径,注:如果‘src’是一个目录,那么‘dest’后面也需要是一个目录,如果目标目录不存在,或者是它以‘/’结尾也或者是‘src本身是目录’,那么‘dest’都会被创建,如果‘src和dest都是文件’,因为‘dest’不会被创建)
Src:需要复制谁到远程主机(是指ansible本地路径)

举例:在ansible主机上上创建一个目录,并在这个目录下创建一个文件,然后再把这个文件复制到每一个被管理的主机并重命名为txt.123,
ansible模块命令详解_第11张图片
在这里插入图片描述

注:content:(dest是必须有,但是src不是必须被定义的,没有src,那你复制什么文件,怎么生成呢)那是因为文件内容可以直接使用content生成的,所以content直接指定内容是什么
举例:
ansible模块命令详解_第12张图片
ansible模块命令详解_第13张图片如果命令后面不加斜线话,是不会换行的。
Copy时也可以直接设置属主、属组、权限等信息,如果要修改除此之外的权限,只能用file模块。

举例:在有user5用户 的基础上,在分别每个主机上创建一个user6的用户,然后复制文件到这三台主机,并修改它的属主、权限,权限设置为0600。
ansible模块命令详解_第14张图片
ansible模块命令详解_第15张图片
ansible模块命令详解_第16张图片

验证:
ansible模块命令详解_第17张图片

**7、Fetch模块:**从远程远程主机复制文件的
Src:指明远程主机上的哪个路径下的哪个文件,必须是文件不能是目录
Dest:指本地(ansible主机)比如是目录,这个才能把文件复制过来
ansible模块命令详解_第18张图片
在这里插入图片描述

注:为了避免从远程主机上复制到本地同一个目录下的文件都是一致的,所以为每一个主机加一个以这个主机命名的目录,而且还保留了在远程主机上的绝对路径。

8、File模块:
管理文件:创建链接文件(*path= src= state=link);修改属性(path= owner= mode=group=);创建目录(path= state=directory)
注:如果文件已存在就修改它的属性,如果不存在,就创建,当然这个文件可以是一个链接文件也可以是目录,这个需要使用state属性来定义(file,directory,link(符号链接),hard(硬链接),touch(创建空文件)、absent(表示删除))
可以设定group(属组)、owner(属主)、mode(权限)
1)举例:
将远程主机node2上tmp目录下的txt.123文件,属组改成tom,属主不变,权限改为640或者660。
ansible模块命令详解_第19张图片
ansible模块命令详解_第20张图片

2)举例:
我们使用file还可以创建空文件或者空目录,并且设定属主、属组。
在每个主机上tmp目录下创建hi.dir的空目录,把它的属主、属组改成user6,权限改为770
ansible模块命令详解_第21张图片
ansible模块命令详解_第22张图片

3)举例:
File还可以创建符号链接
比如我们把被管理主机上的tmp下的txt.123文件创建一个符号链接并且,链接到当前目录下,叫txt.link。(mode可以不用定义,因为link文件一般都是777,)
ansible模块命令详解_第23张图片
ansible模块命令详解_第24张图片

在node2查看:ansible模块命令详解_第25张图片

如果state后面不是link,还是hard,那么它就是一个硬链接,
(注:hard不能跨文件系统)
ansible模块命令详解_第26张图片

查看:
ansible模块命令详解_第27张图片

**9、get_url模块:**基于某个url下载文件的
URL:指明下载的url是什么
Dest:指明下载到哪
Sha256
Owner、group、mode(修改属主、属组、权限)
举例:
比如把互联网(清华大学的开源镜像网站)https://mirror.tuna.tsinghua.edu.cn/上的文件分别下载到这几台被管理的主机当中,
ansible模块命令详解_第28张图片
ansible模块命令详解_第29张图片
验证:
ansible模块命令详解_第30张图片

10、Cron模块
主要用于定义操作系统之上的cron任务,其实就是为我们的linux主机定cron任务,一般而言,我们可以直接使用crontab -e 命令就可以用来编辑或者定义一个任务了。
如果多个节点都需要定义时,我们就需要使用ansible命令时,需要用以下参数来定义:Minute、day 、month、weekday、hour、job、name、state(present创建、absent删除)和crontab -e 命令所不同的是需要定义name,主要是用来引用,当我们的某个cron中存在多个cron任务时,用来引用特定或者指定的crontab。如果我们需要创建cron时,定义state为present创建,absent删除
比如:我们定义我们的操作系统,所有的客户端主机每隔5分钟,都使用ntpdate 命令从时间服务器192.168.171.150(node2)同步一次时间,无论对错,都保存在/dev/null下。
ansible模块命令详解_第31张图片
验证:列出所定义的任务计划
在这里插入图片描述
#ansible :mesync(这个注释符后面的表示,当前这个cron的名称,这是由ansible生成的,所以ansible就可以基于这个,来引用对应的任务,所以我们删除时,只需要写上name即可。)
如果不需要的话,定义state为absent即可。
ansible模块命令详解_第32张图片验证:
在这里插入图片描述

11、yum模块:
安装应用程序程序包的模块,(系统管理相关)
Yum模块是指以yum作为程序管理器的发行版,应该使用的包管理器模块,类似模块还有很多(其他的包管理工具:apt(debian)、zypper(suse)、dnf(fedora)、rpm、dpkg、pacman(支持滚动更新)、port)
参数:name(程序包名称,可带版本号,默认安装最新)、state(present安装、latest安装最新版、install安装;remove卸载、absent卸载)
其他参数:enablerepo:启用某个仓库;disenablerepo:禁用某个仓库;skip_broken:如果有些仓库出现故障,安装可能会失败,如果想要跳过这些损坏的包,可以使用这个仓库;
Update_only:可以用来升级安装的时候,如果系统没有这个包,它就不安装,如果安装了就自动升级
注:不是说我们指定的yum命令,那么对方就一定会完成,所以目标主机必须有相关的仓库。Yum的执行过程输出信息可能会非常多,在ansible的控制台输出时,有可能是乱码(这里的乱码是指排版不那么美观,并不是信息看不懂)

举例:让三个节点都安装上git程序包。(git本身属于base仓库,这个命令随着本身所涉及到的复杂程度,在安装时间上会有所不同)
ansible模块命令详解_第33张图片
验证:
ansible模块命令详解_第34张图片

12、pip模块:
安装程序包需要用到的模块除了yum之外,还有另外两个常用的模块,不同的地方在于yum是安装操作系统级的rpm包,如果是为某个应用程序的应用环境额外提供模块的,那最常用的就是pip、npm。其中pip是基于pip安装Python模块,也就是说Python其实也是高度模块化的,他有很多的第三方模块,这个模块都放在pip当中,我们可以使用pip命令去安装相应模块,包括我们此前说在安装ansible时,会自动解决依赖关系,比如安装了python-Paramiko和python-Jinja2这样的模块,这个是我们给他做成rpm包,其实它们本身都是在pip模块中的,可以直接使用pip install Paramiko和Jinja2是没有任何问题,因此python的很多模块安装方式有两种:主流的、核心的,常用的pip模块有可能已经被做成了rpm包,直接使用yum命令就可以;还有一些不常用的模块,没有做成rpm包的,就需要使用pip命令,其实所有python模块都可以pip命令。
参数:name、state、version

13、npm模块:
node.js作为前端开发当中的一个非常抢眼的编程语言来讲,它有巨大的市场份额,各种前端的、开发的全占程序员基本对于node.js都是学习使用基础,虽然它设计的有很多缺陷,但它确实是目前主流的前端编程语言用的最主流的一种语言,现在h5研发的相关项目当中都会用到node.js,于是都会用到node.js的模块。而管理node.js模块通常是用npm。
Npm作为ansible的npm模块,它其实就是指挥着每一个目标主机之上使用npm工具来安装npm模块。
注:无论是python的模块还是node.js的模块,他们在互联网都一个在线的仓库,允许我们下载并安装,所以我们需要确保可以用互联网,除非有私有的仓库。

**14、hostname模块:**管理主机名(一次通常只能设定一个主机)

15、service模块:
参数:state(started/stoped、reloaded/restarted)、name、runlevel(运行级别,默认为2)、enabled(是否设置为开机自启)
是指帮助管理运行在操作系统之上的服务类的守护进程的模块,无论我们用到的是systemctl还是service,它对应的模块它都能完成相应的管理 也意味着,无论是centos5、6、7,这个service模块对于相应服务的启动都是没有问题的。
假如我们安装的程序包叫nginx,那么nginx安装完以后,是不会自动起来的,那么我们想要nginx运行起来就需要用到service模块。

举例:在这个三个节点都安装redis的包,并且ansible远程让三个节点的服务开启,并且设置为开机自启(注:redis是在epel仓库中),我们都知道,redis的配置文件默认监测的是127.0.0.1,那如果想让他监测0.0.0.0,就需要先改redis的配置文件,首先在node1里面复制一份到当前目录,改好以后,分别分发给三个节点。
ansible模块命令详解_第35张图片
ansible模块命令详解_第36张图片
ansible模块命令详解_第37张图片
ansible模块命令详解_第38张图片
ansible模块命令详解_第39张图片
在这里插入图片描述
分发时之前需要注意redis 属主、属组、权限,复制ansible主机上修改好的文件分发给三个节点的原默认的redis配置文件(相当于覆盖了原文件)
ansible模块命令详解_第40张图片
ansible模块命令详解_第41张图片

验证:
在这里插入图片描述
ansible模块命令详解_第42张图片
ansible模块命令详解_第43张图片

16、git模块
对于程序员来讲版本控制系统是一个重要的组件,比如,我们写了一个版本就叫0.01版,随后我们有可能需要在这个对应的代码程序基础上进行改进,我们改进完以后是0.02版,但是强势安装出现了问题,需要回到0.01版,我们在0.01源码的基础上改进生成了0.02版本,那么0.01版需要去哪找呢?为了确保0.01版本随时可用,我们的正常使用方式是,写了第一个版本,写完之后不是在这个版本的基础上去修改,而是把它复制出去备份为0.01,在修改就是0.02了,0.02改完以后,假如代码多了 ,那么最后0.02在复制一次,在进行修改就是0.03了,这样进行迭代。如果一不小心,0.01版所在的节点或者硬盘出现了故障,这样就无法回到0.01,这样风险很大。我们想知道从0.01跨越到0.02做了哪些操作。人工对比就很麻烦,(所以基于这样的需求任何做文字编辑的人,包括写书的等,如果一个稿件可能会存在多个版本,或者对于开发应用程序的,尤其是程序员一个代码或者一个项目,我们要写n个版本,要不停的进行演进的时候,版本控制系统都是一个重要的组件)而版本控制系统从早期开源的cvs——svn(cvs的增强版)——git(git并不是svn的下一版,它是一个完全独立的研发产品,它是是一个分布式的版本控制系统,而svn是集中式的)后面会详细讲解。

简单来讲,git的使用逻辑是,在某一个被托管的站点之上,他可以把我们的代码,就是某个项目,托管在这个站点的某个路径上,这个对应的放置了某个项目的所有变动历史版本的
存储位置,就叫仓库,又称为git仓库。

注:在一个项目上,我们git仓库会保存某一个项目的所有演进过程的被保留的或者被快照下来的版本历史,我们随时可以根据这个仓库检索出来过去任何一个时刻被保存的快照也就是版本。当然,默认情况下,它始终让我们处在整个历史进程中的最新版也就是当前最新的版本,如果我们有需要的话,想要回到过去的某个版本,只是一条命令的事情,它有个时光机器,可以随意回溯的过去的某个版本,而且对git来讲,还可以在对应的分支之上生成子分支,在git里面有主分支,对主分支之外的其它分支来讲,发出的一般是稳定版,然后起一个新分支进行开发,这样不影响主干上的分支的稳定特性,另外,在主干分支上了,我们发现了漏洞,我们可以起一个热分支进行修复等
我们可以根据使用的需要切换到任何一分支,在任何一分支上,把它过去的历史记录都取下来,因为它是一个分布式的版本控制系统,如果我们现在本地参与这个版本,或者我们自己克隆过来一个分支以后,进行修改的话,可以把它直接克隆到本地来。

多个节点之上可以要用到某个仓库,而这个代码仓库本事是托管在某个git服务器 之上的,比如github或者gitlab这样的服务器之上,我们就可以使用ansible指挥着相关的所有主机,都去把某个仓库,克隆在远程的每个节点之上的功能。
假设我们要发布的应用程序在我们公司内部使用私有的代码仓库托管站点服务(gitlab、Gogs),我们发布的时候,通常就是程序员告诉我们说这个版本可以了,也就是release了,可以发布到站点替换老版本,我们就需要把仓库中最新的版本或者代码克隆下来。(或者把仓库克隆下来,克隆下来以后,把里面最新的版本发布到每一个线上服务器应该程序目录下,这个就是发布操作

比如我们现在有三台Tomcat主机,这三个tomcat主机之上对应的项目代码都在/data/webapps/myapp-0.01、myapp-0.02、myapp-0.03,托下来后,把它克隆,然后命名成0.03 ,把这个三台主机都给克隆过去就可以了
其实git模块就是把应用程序的software代码,从git仓库中checkout出来,然后保存在目标主机之上的过程,其中还可以指定version(指定要克隆的仓库版本号,不指定的话,默认克隆的是最新版本的)我们要想执行克隆命令,node1、2、3这三台主机节点都需要安装git相关程序包(我们现在还没有讲,怎么一次性让多个节点安装程序包的命令,所以只能挨个来装)

Ansible-doc -s git
Git相关参数:clone、dest(指明仓库克隆完以后,保存在对应节点的哪个位置)、repo(git、ssh、http或者https协议用来实现git仓库url的指定,git仓库的url一般支持以上四种格式,用的较多的有ssh、https协议)
我们可以基于网络来下载文件,那么文件管理的模块就是get_url,跟文件管理相关的还有另外一个模块,就是git模块
Git模块的是不同之处在于,Git模块是通过git仓库去克隆仓库代码到本地来的
假如我们有一个git仓库可以进行克隆,那应该怎么使用呢?
举例:在ansible的主机上给node3节点的机器克隆一个git仓库(这里的git仓库是从github的官网随意克隆过来的一个仓库)

在这里插入图片描述

你可能感兴趣的:(ansible)