admin 管理员组

文章数量: 887007

Ansible部署及应用

  • ansible文件配置
  • ansible命令参数
  • ansible常用命令
  • ansible的安装
  • ansible模块
      • copy&fetch&file
      • blockinfile&lineinfile&find
      • replace&command&shell
      • script&cron&service
      • user&group
      • yum_repository&yum
      • unarchive&archive&mount
      • setup

ansible文件配置

主要文件

配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts主机清单
/etc/ansible/roles/存放角色的目录
程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy下载/- 上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook定制自动化任务,编排剧本工具/usr/bin/ansible-pull远
程执行命令的工具
/usr/bin/ansible-vault文件加密工具
/usr/bin/ansible-console基于Console界面与用户交互的执行工具

/etc/ansible/hosts文件格式

inventory文件遵循IN坟件风格,中括号中的字符为组名。可以将同-个主机
同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,
还可以在主机名称之后使用冒号加端口号来标明
ntp.magedu.com
[webservers]
www1.magedu.com:222+
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com

主机名的调度关系

◆逻辑与
ansible "websrvs:&dbsrvs” -m ping
在websrvs组并且在dbsrvs组中的主机
◆逻辑非
ansible 'websrvs:!dbsrvs' -m ping
在websrvs组,但不在dbsrvs组中的主机
卜
注意:此处为单引号
◆综合逻辑
ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs'’ -m ping
◆正则表达式
ansible "websrvs:&dbsrvs" -m ping
ansible“ ~(web|db).*\.magedu\.com”-m ping

ansible.cfg配置参数

配置文件在:/etc/ansible/ansible.cfg

inventory
这个参数表示资源清单 . inventory文 件 的 位 置 , 资源清单就是 一些Ansible需要连接管理的主机列表 。
实例如下:
inventory == /etc/Ansible/hosts
library
Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块 , 这个library参数就是指向存放Ansible模块的 目录 。 
实例如下:
library = /usr/share/Ansible
Ansible支持多个记录方式,只要用W号(:)隔幵就可以,同时也会检査当前执行playbook位罝下的•/library目录。
forks
默认悄况下Ansible最多能有多少个进程同时丁-作,默认设置敁多5个 进程并进行理 。具体需要设置多少个,可以根据控制主机的性能和被管节点的数诂来确定,可能是50或100,默认值5是非常保守的设置。
实例如下:
forks = 5
sudo_user
这是设罝默认执行命令的用户,也可以在playbook中重新设置这个参数。
实例如下:
sudo_user = root
remote_port
这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端门.不然这个参数一般是不需要修改的。
实例如下:
remote_port = 22
host_key_checking
这是设置是否检査SSH主机的密钥。可以设置为True或False。
实例如下:
host_key_checking = False
timeout
这是设置SSH连接的超时间隔,单位是秒。
实例如下:
timeout = 60
log_path
Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录 到日志文件,需要设置log_ path指定一个存储Ansible日志的文件 。
实例如下:
log__path = /var/log/Ansible. log

ansible命令执行过程

➢1.加载自己的配置文件默认/etc/ansible/ansible.cfg
➢2.加载自己对应的模块文件,如command
➢3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器
的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
➢4.给文件+x执行
➢5.执行并返回结果
➢6.删除|临时py文件, sleep 0退出
◆执行状态:
➢绿色:执行成功并且不需要做改变的操作
➢黄色:执行成功并且对目标主机做变更
➢红色:执行失败

ansible命令参数

参数详细参数含义
-a–args=‘Arguments’命令行参数
-m–module-name=NAME执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-i–inventory=PATH指定库存主机文件的路径,默认为/etc/ansible/hosts.
-u–user=Username执行用户,使用这个远程用户名而不是当前用户
-U–sud-user=SUDO_Usersudo到哪个用户,默认为 root
-k–ask-pass登录密码,提示输入SSH密码而不是假设基于密钥的验证
-K–ask-sudo-pass提示密码使用sudo
-s–sudosudo运行
-S–su用 su 命令
-l–list显示所支持的所有模块
-s–snippet指定模块显示剧本片段
-f–forks=NUM并行任务数。NUM被指定为一个整数,默认是5。 #ansible testhosts -a “/sbin/reboot” -f 10 重启testhosts组的所有机器,每次重启10台
–private-key=PRIVATE_KEY_FILE私钥路径,使用这个文件来验证连接
-v–verbose详细信息
all针对hosts
-M–module-path=MODULE_PATH要执行的模块的路径,默认为/usr/share/ansible/
–list-hosts只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 文件
-o–one-line压缩输出,摘要输出.尝试一切都在一行上输出。
-t–tree=Directory将内容保存在该输出目录,结果保存在一个文件中在每台主机上。
-B后台运行超时时间
-P调查后台程序时间
-T–timeout=Seconds时间,单位秒s
-P–poll=NUM调查背景工作每隔数秒。需要- b
-c–connection=Connection连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用
–tags=TAGS只执行指定标签的任务 例子:ansible-playbook test.yml --tags=copy 只执行标签为copy的那个任务
–list-hosts只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 文件
–list-tasks列出所有将被执行的任务
-C–check只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
–syntax-check执行语法检查的剧本,但不执行它
-l–limit=SUBSET进一步限制所选主机/组模式 --limit=192.168.0.15 只对这个ip执行
–skip-tags=SKIP_TAGS只运行戏剧和任务不匹配这些值的标签 --skip-tags=copy_start
-e–extra-vars=EXTRA_VARS额外的变量设置为键=值或YAML / JSON

ansible常用命令

ansible-doc

 ansible-doc -h
Usage: ansible-doc [options] [module...]
该指令用于查看模块信息,常用参数有两个-l 和 -s ,具体如下:

//列出所有已安装的模块
ansible-doc -l
//查看具体某模块的用法,这里如查看command模块
ansible-doc -s command

ansible-galaxy

ansible-galaxy -h
Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ...
ansible-galaxy 指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,我们可以形象的理解其类似于centos下的yum、python下的pip或easy_install 。如下示例:

[root@localhost ~]# ansible-galaxy install aeriscloud.docker
- downloading role 'docker', owned by aeriscloud
- downloading role from https://github.com/AerisCloud/ansible-docker/archive/v1.0.0.tar.gz
- extracting aeriscloud.docker to /etc/ansible/roles/aeriscloud.docker
- aeriscloud.docker was installed successfully
这个安装了一个aeriscloud.docker组件,前面aeriscloud是galaxy上创建该模块的用户名,后面对应的是其模块。在实际应用中也可以指定txt或yml 文件进行多个组件的下载安装。这部分可以参看官方文档。

ansible-lint

ansible-lint是对playbook的语法进行检查的一个工具。用法是ansible-lint playbook.yml 。

ansible-playbook

该指令是使用最多的指令,其通过读取playbook 文件后,执行相应的动作,这个后面会做为一个重点来讲。

ansible-pull

该指令使用需要谈到ansible的另一种模式pull 模式,这和我们平常经常用的push模式刚好相反,其适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间;
你要在一个没有网络连接的机器上运行Anisble,比如在启动之后安装。这部分也会单独做一节来讲。

ansible-vault

ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 --ask-vault-pass参数,同样需要输入密码后才能正常执行。

ansible的安装

rpm包安装

#先安装阿里云的EPEL源
#RHEL7
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 

#RHEL6
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo 

yum安装ansible

yum install -y ansible

编译安装

#安装依赖
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto

#解压ansible压缩包
tar xf ansible-1.5.4.tar.gz

#进入目录
cd ansible-1.5.4

#执行编译安装命令
python setup.py build
python setup.py install

#创建目录
mkdir -p /etc/ansible

#拷贝目录文件到新创建的目录
cp -r examples/* /etc/ansible

Git方式

#直接从git上ansible软件直接下载下来,直接使用脚本安装即可

git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup

pip安装

#pips是安装Python包管理器,类似yum

yum install python-pip python-devel
yum install gcc glibc-deve zibl-devel rpm-bulid openssl-devel
pip insyall --upgrade pip
pip install ansible --upgrade

#确认ansible安装成功,查看ansible版本
ansible --version

 #程序二进制命令路径
ls -l /usr/bin/ansible
lrwxrwxrwx 1 root root 20 Apr 21 19:58 /usr/bin/ansible -> /usr/bin/ansible-2.7
#这里用到了软连接的方式,指向真正的版本目录,这就是之前提到的灰度发布的手法,如果新版本不行可以直

参考链接

ansible模块

参考链接

ansible-doc -s 模块名

copy&fetch&file

fetch

fetch模块中参数作用:
dest:指定拉取文件到本地以后,文件存放的位置
src:指定从受管主机中拉取哪个文件
可以看到server2进行了拉取的动作,而server3没有。这是因为server2的md5sum改变了,这就是md5sum校验的应用。

copy模块

copy模块与fetch模块的区别:
见名知义,copy模块的作用就是拷贝文件,它与之前介绍的fetch模块类似,不过,fetch模块是从远程主机中拉取文件到ansible主机,而copy模块是将ansible主机上的文件拷贝到远程主机中

copy模块参数
src用于指定需要copy的文件或目录
dest用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数
content当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
force当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
backup当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
owner指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode指定文件拷贝到远程主机后的权限,如果你想将权限设置为"rw-r–r–",则可以使用mode=0644表示,如果你想要在user对应的权限位,上添加执行权限,则可以使用mode=u+x表示
#拷贝文件,当文件内容不一致时,直接覆盖。当文件内容一致时,不进行copy动作
ansible testB -m copy -a "src=/testdir/copytest dest=/opt"
ansible testB -m copy -a "src=/testdir/copytest dest=/opt force=no #默认为yes " 

#使用content参数指定文件内容:
ansible testB -m copy -a "content="westos\nlinux\n" dest=/opt/test"

#当文件内容不一致时,先备份,再覆盖
ansible testB -m copy -a "src=/testdir/copytest dest=/opt backup=yes" 

#指定文件拥有者,指定拥有者的前提条件是远程主机中要有该用户,在远程主机中创建用户,当远程主机中不存在要拷贝的文件时,直接进行拷贝:
ansible testB -m copy -a "src=/testdir/westos dest=/opt owner=nigar" 

#当远程主机中存在要拷贝的文件时,不进行拷贝动作,单纯的修改拥有者:
ansible testB -m copy -a "src=/testdir/copytest dest=/opt owner=nigar" 

#指定文件所属组,当远程主机中存在要拷贝的文件时,不进行拷贝动作,单纯的修改所属组:
ansible testB -m copy -a "src=/testdir/copytest dest=/opt group=nigar" 

#指定文件权限:
ansible testB -m copy -a "src=/testdir/hh dest=/opt mode=0640"

file模块

file模块可以帮助我们完成一些对文件的基本操作, 比如:创建文件或目录、删除文件或目录、修改文件权限等

file模块参数
path必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以
state此参数非常灵活,此参数对应的值需要根据情况设定,比如,当我们需要在远程主机中创建一个目录的时候,我们需要使用path参数指定对应的目录路径。假设:我想要在远程主机上创建/testdir/a/b目录,那么我则需要设置path=/testdir/a/b,但是,我们无法从"/testdir/a/b"这个路径看出b是一个文件还是一个目录,ansible也同样无法单单从一个字符串就知道你要创建文件还是目录。所以,我们需要通过state参数进行说明,当我们想要创建的/testdir/a/b是一个目录时,需要将state的值设置为directory,"directory"为目录之意, 当它与path结合,ansible就能知道我们要操作的目标是一个目录,同理,当我们想要操作的/testdir/a/b是一个文件时,则需要将state的值设置为touch,当我们想要创建软链接文件时,需将state设为link,想要创建硬链接文件时,需要将state设置为hard,当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absent,“absent” 为缺席之意,当我们想让操作的目标"缺席"时,就表示我们想要删除目标。
src当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源
force当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件,不过强制创建链接文件分为两种情况:
情况一:当你要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。
情况二:当你要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。
情况三:当你要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。
owner用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。
group用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。
mode用于指定被操作文件的权限,比如,如果想要将文件权限设置t为rw-r-x—,则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的,如果你想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700
recurse当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性
#在远程主机中创建文件,目标主机的上级目要存在
ansible testB -m file -a "path=/testdir/westos state=touch"

#当远程主机中存在要创建的文件时,与copy不同的是,它会修改文件的时间戳:
ansible testB -m file -a "path=/testdir/westos state=touch"

#在远程主机中创建目录:
ansible testB -m file -a "path=/testdir/westosdir state=directory"

#当远程主机中存在要创建的目录时,与上一步中创建文件不同的是,它不进行改变:
ansible testB -m file -a "path=/testdir/westosdir state=directory"

#在远程主机中制作软链接:
ansible testB -m file -a "path=/testdir/linkwestos state=link src=/testdir/westos"

#在远程主机中制作硬链接:
ansible testB -m file -a "path=/testdir/hardwestos state=hard src=/testdir/westos"

#使用force参数来强制链接:
ansible testB -m file -a "path=/testdir/linkwestos state=link src=/testdir/westos-yy force=yes"

#删除远程主机中的文件:
ansible testB -m file -a "path=/testdir/linkwestos state=absent"

#创建文件并指定所有人:
ansible testB -m file -a "path=/testdir/a state=touch owner=nigar"

#创建文件并指定所属组,当文件存在时指定所属组,不仅会修改所属组,还会修改文件的时间戳
ansible testB -m file -a "path=/testdir/b state=touch group=nigar"

#创建目录并指定所属组,当目录存在时指定所有人,会修改所属组,但不会修改时间戳:
ansible testB -m file -a "path=/testdir/c state=directory group=nigar"

#修改目录权限:
ansible testB -m file -a "path=/testdir/c mode=666"

#修改文件权限,文件要存在
ansible testB -m file -a "path=/testdir/d mode=4700"

#递归创建目录:
ansible testB -m file -a "path=/testdir/1/2 state=directory owner=nigar group=nigar recurse=yes"

blockinfile&lineinfile&find

blockinfile模块

blockinfile模块功能
blockinfile模块可以帮助我们在指定的文件中插入"一段文本",这段文本是被标记过的,换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过"标记"找到这段文本,然后修改或者删除它

blockinfile模块参数
path必须参数,指定要操作的文件。
block此参数用于指定我们想要操作的那一段文本,此参数有一个别名叫"content",使用content或block的作用是相同的
marker假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,个结束标记,默认情况下,开始标记为BEGINANSIBLE MANAGED BLOCK,结束标记为ENDANSIBLE MANAGED BLOCK,我们可以使用marker参数自定义"标记",比如,marker= # { mark}test,这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test。没错,{mark}会自动被替换成开始标记和结束标记中的BEGIN和END,我们也可以插入很多段文本,为不同的段落添加不同的标记,下次通过对应的标记即可找到对应的段落
statestate参数有两个可选值,present与absent,默认情况下,我们会将指定的一段文本"插入"到文件中,如果对应的文件中已经存在对应标记的文本,默认会更新对应段落,在执行插入操作或更新操作时,state的值为present,默认值就是present,如果对应的文件中已经存在对应标记的文本并且将state的值设置为absent,则表示从文件中删除对应标记的段落
insertafter在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾
insertbefore在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。
backup是否在修改文件之前对文件进行备份。
create当要操作的文件并不存在时,是否创建对应的文件
#默认插入到文档末尾:
ansible testB -m blockinfile -a 'path=/testdir/rc.local block="systemctl start nsf\nsystemctl start httpd"'
#注意:# BEGIN ANSIBLE MANAGED BLOCK和# END ANSIBLE MANAGED BLOCK为标记文本

#自定义标记文本,插入成功,是因为虽然插入的内容相同,但标记文本不同,所以ansible认为它是不同的两段文本,
#当文档中存在标记文本相同且内容相同的文本时,再次执行插入命令,不会做更新
ansible testB -m blockinfile -a 'path=/testdir/rc.local block="systemctl start nsf\nsystemctl start httpd" marker="{mark} service to start!"'

#block=""删除指定标记文本中的文本内容:
ansible testB -m blockinfile -a 'path=/testdir/rc.local block="" marker="{mark} service to start!"'

#state=absent删除指定标记文本中的文本内容:
ansible testB -m blockinfile -a 'path=/testdir/rc.local marker="{mark} service to start!" state=absent'

#insertbefore=BOF插入文本到文档开头:
ansible testB -m blockinfile -a 'path=/testdir/rc.local block="#####blockinfile####test####" marker="{mark} test!!" insertbefore=BOF'

#当文档中存在标记文本相同但插入内容不相同的文本时,再次执行插入命令,会在原来的文本上做更新:
ansible testB -m blockinfile -a 'path=/testdir/rc.local block="#####test####" marker="{mark} test!!" insertbefore=BOF'

#使用正则表达式指定插入位置:
ansible testB -m blockinfile -a 'path=/testdir/rc.local block="#####test####" marker="{mark} test!!" state=absent'	#先删除刚才插入的文本
ansible testB -m blockinfile -a 'path=/testdir/rc.local block="#####test####" marker="{mark} test!!" insertafter="^#!/bin/bash"'	#插入到以#!/bin/bash开头的行后面

#当插入内容与文本内容不同时,在做更新之前,备份:
ansible testB -m blockinfile -a 'path=/testdir/rc.local block="@@@@change@@@@" marker="{mark} test!!" insertafter="^#!/bin/bash" backup=yes'

#当要操作的文件不存在时,使用create=yes参数建立文件(不使用会报错):
ansible testB -m blockinfile -a 'path=/testdir/test block="$$$test$$$" marker="{mark} test!!" insertafter="^#!/bin/bash" create=yes'

lineinfile

我们可以借助lineinfile模块,确保"某一行文本"存在于指定的文件中,或者确保从文件中删除指定的"文本"
(即确保指定的文本不存在于文件中) ,还可以根据正则表达式,替换"某一行文本"。

lineinfile模块参数
path必须参数,指定要操作的文件。
line使用此参数指定文本内容。
regexp使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state当想要删除对应的文本时,需要将state参数的值设置为absent, absent为缺席之意,表示删除,state的状认值为present
insertafter借助insertafter参数可以将文本插入到指定的行之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF。如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾
insertbefore借助insertbefore参数可以将文本插入到“指定的行”前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行, 则插入到文件末尾
backup是否在修改文件之前对文件进行备份。
create当要操作的文件并不存在时,是否创建对应的文件。
#使用line参数默认插入到文件末尾:
ansible testB -m lineinfile -a 'path=/testdir/test line="@@test@@"'

#删除:
ansible testB -m lineinfile -a 'path=/testdir/test line="@@test@@" state=absent'

#使用regexp参数替换文本时,当有多行文本都能被匹配,只有最后被匹配到的行才会被替换:
ansible testB -m lineinfile -a 'path=/testdir/test regexp="^line" line="##test##"'

#使用regexp参数删除文本时,当有多行文本都能被匹配,这些行都会被删除:
ansible testB -m lineinfile -a 'path=/testdir/test regexp="^line" state=absent'

#使用insertafter插入文本到指定行后:
ansible testB -m lineinfile -a 'path=/testdir/test insertafter="^#" line="insertafter" 

find模块

find模块可以班帮助我们再远程主机中查找符合条件的文件,就像find命令一样

find模块参数
paths必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名paths或者别名name可以代替paths。
recurse默认情况下,只会在指定的目录中查找文件,也就是说,如果目录中还包含目录,ansible并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用recurse参数,当recurse参数设置为yes时,表示在指定目录中递归的查找文件。
hidden默认情况下,隐藏文件会被忽略,当hidden参数的值设置为yes时, 才会查找隐藏文件。
file_ type默认情况下,ansible只会根据条件查找"文件",并不会查找"目录"或"软链接"等文件类型,如果想要指定查找的文件类型,可以通过file_type指定文件类型,可指定的文件类型有any、directory、 file、 link 四种。
patterns使用此参数指定需要查找的文件名称,支持使用shell(比如通配符)或者正则表达式去匹配文件名称,默认情况下,使用shell匹配对应的文件名,如果想要使用python的正则去匹配文件名,需要将use_ regex参数的值设置为yes。
contains使用此参数可以根据文章内容查找文件,此参数的值为一个正则表达式,find模块会根据对应的正则表达式匹配文件内容。
age使用此参数可以根据时间范围查找文件,默认以文件的mtime为准与指定的时间进行对比, 比如,如果想要查找mtime在3天之前的文件,那么可以设置age=3d,如果想要查找mtime在3天以内的文件,可以设置fage=-3d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、时(h)、天(d)、星期(w)。
age_ stamp文件的时间属性中有三个时间种类,atime、ctime、mtime,,当我们根据时间范围查找文件时,可以指定以哪个时间种类为准, 当根据时间查找文件时,默认以mtime为准。
use_ regex默认情况下,find模块不会使用正则表达式去解析patterns参数中对应的内容,当use_ regex设置为yes时,表示使用python正则解析patterns参数中的表达式,否则,使用glob通配符解析patterns参数中的表达式。
size使用此参数可以根据文件大小查找文件,比如,如果想要查找大于3M的文件,那么可以设置isize=3m,如果想要查找小于50k的文件,可以设tsize=-50k,可以使用的单位有t、g、m、k、b。
get_checksum当有符合查找条件的文件被找到时,会同时返回对应文件的sha1校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长
#在/testdir目录中查找内容含有hello的文件:
ansible testB -m find -a 'paths=/testdir contains=".*hello.*"'

#在远程主机中创建测试文档:
ansible testB -m find -a 'paths=/testdir contains=".*hello.*"'

#在/testdir目录及其子目录下查找内容含有hello的文件(recurse=yes包含子目录):
ansible testB -m find -a 'paths=/testdir contains=".*hello.*" recurse=yes'

#在/testdir目录中查找文件名以.sh结尾的文件(hidden=yes包含隐藏文件):
ansible testB -m find -a 'paths=/testdir patterns="*.sh" hidden=yes'

#在/testdir目录中查找文件名以.sh结尾的任意类型的“文件”(hidden=yes包含隐藏文件):
ansible testB -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'

#在以文件名查找时,使用正则表达式匹配(use_regex=yes):
ansible testB -m find -a 'paths=/testdir patterns=".*\.sh" use_regex=yes file_type=any hidden=yes'

#指定时间范围查找文件,在/testdir目录及其子目录下查找2小时内创建的文件(age=-2h表示mtime在2小时内):
ansible testB -m find -a 'paths=/testdir age=-2h recurse=yes'

#指定时间种类,在/testdir目录及其子目录下查找2天内被访问过的文件(age_stamp=atime指定时间种类):
ansible testB -m find -a 'paths=/testdir age=-2d age_stamp=atime recurse=yes'

#指定文件大小范围查找文件,在/testdir目录及其子目录下查找大于1g的文件(size=1g大于1g):
ansible testB -m find -a 'paths=/testdir size=1g recurse=yes'

#当有符合条件的文件被找到时,返回sha1校验码:
ansible testB -m find -a 'paths=/testdir contains=".*hello.*" get_checksum=yes recurse=yes'

replace&command&shell

replace模块

replace模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被正则匹配到的字符串都会被替换

replace模块参数
path必须参数,指定要操作的文件
regexp必须参数,指定一个python正则表达式,文件中与正则匹配的字符串将会被替换。
replace指定最终要替换成的字符串。
backup是否在修改文件之前对文件进行备份,最好设为yes
#指定正则表达式替换某个字符串(匹配到的字符串都会被替换):
ansible testB -m replace -a 'path=/testdir/test regexp="USE" replace=use'

#指定正则表达式替换某个字符串(替换前进行备份):
ansible testB -m replace -a 'path=/testdir/test regexp="use" replace=USE backup=yes'

command模块

command模块可以帮助我们在远程主机上执行命令

注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,
如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如"<", “>”, “I”, ";“和”&"这些符号,
如果你需要这些功能,可以参考后面介绍的shell模块,还有一点需要注意,如果远程节点是windows操作系统,则需要使用win_
command模块

command模块参数
chdir此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。
creates看到creates,你可能会从字面上理解这个参数,但是使用这个参数并不会帮助我们创建文件,它的作用是当指定的文件存在时,就不执行对应命令,比如:如果/testdir/test文件存在,就不执行我们指定的命令。
removes与creates参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令, 比如:如果/testdir/tests文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件
command模块应用
#指定命令ls:(默认访问家目录)
ansible testB -m command -a "ls"

#chdir参数指定目录:
ansible testB -m command -a "chdir=/testdir ls"


#当指定文件存在时,就不输出test:
ansible testB -m command -a "creates=/testdir/test echo test"

#当指定文件不存在时,就不输出test(即存在时输出):
ansible testB -m command -a "removes=/testdir/test echo test"

shell模块

shell模块可以帮助我们在远程主机上执行命令,与command模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理。

shell模块参数
chdir此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。
creates使用此参数指定一个文件,当指定的文件存在时,就不执行对应命令,可参考command模块中的解释。
removes使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令,可参考command模块中的解释。
executable默认情况下,shell模块会调用远程主机中的/bin/sh去执行对应的命令,通常情况下,远程主机中的默认shelI都是bash,如果你想要使用其他类型的shell执行命令,则可以使用此参数指定某种类型的shell去执行对应的命令,指定shell文件时,需要使用绝对路径。
支持重定向、管道符等操作:
ansible testB -m shell -a "chdir=/testdir echo haha> test"

script&cron&service

script模块

script模块可以帮助我们在远程主机上执行ansible主机上的脚本,也就是说,脚本一直存在于ansible主机本地,
不需要手动拷贝到远程主机后再执行。

script模块参数
chdir此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到chdir参数指定的目录中。
creates使用此参数指定-一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考command模块中的解释。
removes使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考command模块中的解释
script模块应用
#在远程主机中执行本地主机脚本:
ansible testB -m script -a "chdir=/opt /testdir/test.sh"

#当指定文件存在时,就不执行脚本:
ansible testB -m script -a "creates=/mnt/test /testdir/test.sh"

#当指定文件不存在时,就不执行脚本:
ansible testB -m script -a "removes=/mnt/test /testdir/test.sh"

cron模块

cron模块可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令

cron模块参数
minute此参数用于设置计划任务中分钟设定位的值,比如,分钟设定位的值为5,即minute=5,当不使用此参数时,分钟设定位的值默认为11*11
hour此参数用于设i计划任务中小时设定位的值,比如,小时设定位的值为1,即hour=1,当不使用此参数时,小时设定位的值默认为"*"
day此参数用于设置i计划任务中日设定位的值,当不使用此参数时,日设定位的值状认为"*"
month此参数用于设量置计划任务中月设定位的值,当不使用此参数时,月设定位的值状认为"*"
weekday此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为"*"
special time计划任务的时间设定格式为@reboot或者@hourly,@reboot表示重启时执行,@hourly表示每小时执行一次,相当于设置成"0****",这种@开头的时间设定格式则需要使用special_ time参数进行设置,special time参数的可用值有reboot(重启后)、yearly(每年)、annually(每年,与yearly相同、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)
user此参数用于设置当前计划任务属于哪个用户,当不使用此参数时, 默认为管理员用户
job此参数用于指定计划的任务中需要实际执行的命令或者脚本cron表达式只关注有值的部分,*的部分可以忽略,但是一定要符合6个参数的格式
name此参数用于设计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible会默认为计划任务加入注释
state当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state的值设置为absent
disabled当计划任务有名称时,我们可以根据名称使对应的任务"失效"(注释掉对应的任务)。注意:使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改
backup如果此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron模块会在远程主机的/tmp目录下创建备份文件,以crontab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_ file字段中看到,推荐将此参数设置为yes
cron模块应用
#每天的4点18分输出test,
ansible testB -m cron -a "name='test-westos' minute=18 hour=4 job='echo test'"	

#每3天的4点1分输出test,任务名crontabl-test:
ansible testB -m cron -a "name='crontabl-test' minute=1 hour=4 day=*/3 job='echo test'"

#special_time=reboot在重启时输出test,任务名special_time_test:
ansible testB -m cron -a "name='special_time_test' special_time=reboot job='echo test'"

#当计划任务名存在时,执行不同的任务,系统会覆盖之前的任务:
ansible testB -m cron -a "name='special_time_test' special_time=reboot job='echo westos'"

#当计划任务名存在时,执行不同的任务,系统在覆盖之前的任务之前备份,结果中会提示将之前的任务放在了/tmp/crontabGy9IMA中,查看/tmp/crontabGy9IMA
ansible testB -m cron -a "name='special_time_test' special_time=reboot job='echo test' backup=yes"

#针对指定用户创建计划任务(special_time=hourly每小时一次):
ansible testB -m cron -a "user=nigar name='special_time_nigar' special_time=hourly job='echo test'"

#注释掉对应任务(结合备份):
ansible testB -m cron -a "name='crontabl-test' minute=1 hour=4 day=*/3 job='echo test' disabled=yes backup=yes"

service模块

service模块可以帮助我们餐管理远程主机.上的服务,比如,启动或停止远程主机中的apache服务

service模块参数
name此参数用于指定需要操作的服务名称,比如httpd
state此参数用于指定服务的状态,比如:我们想要启动远程主机中的httpd,则可以将state的值设置为started,要停止远程主机中的服务,则可以将state的值设置为stopped。此参数的可用值有started、stopped、restarted、 reloaded。
enabled此参数用于指定是否将服务设为开机启动项,设置为yes表示将对应服务设置为开机启动,设置为no表示不会开机启动
#开启远程主机的http服务:
ansible testB -m service -a "name=httpd state=started"

#关闭远程主机的http服务:
ansible testB -m service -a "name=httpd state=stopped"

#设置远程主机http服务开机启动:
ansible testB -m service -a "name=httpd enabled=yes"

#设置远程主机http服务开机不启动:
ansible testB -m service -a "name=httpd enabled=no"

user&group

user模块

user模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等

user模块参数
name必须参数,用于指定要操作的用户名称,可以使用别名user。
group此参数用于指定用户所在的基本组
gourps此参数用于指定用户所在的附加组,注意:如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合append参数使用,否则在默认情况下,当再次使用groups参数设置附加组时,用户原来的附加组会被覆盖。
append如果用户原本就存在多个附加组,那么当使用groups参数设置附加组时,当前设置会盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合append参数,将append设置为yes,表示追加附加组到现有的附加组设置,append默认值为no
shell此参数用于指定用户的默认shell
uid此参数用于指定用户的uid号
expires此参数用于指定用户的过期时间,相当于设置/etc/shadow文件中的的第8列,比如:你想要设置用户的过期日期为2020年12月31日,那么你首先要获取到2020年12月31日的unix时间戳,使用命令"date-d2020-12-31 +%s"获取到的时间戳为1609344000,所以,当设fexpires=1609344000时,表示用户的过期时间为2020年12月31日0点0分,设成功后,查看远程主机的/etc/shadow文件,对应用户的第八列的值将变成18626 (表示1970年1月1日到2020年12月31日的天数,unix时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在Linux和EreeBSD系统中使用
comment此参数用于指定用户的注释信息
state此参数用于指定用户是否存在于远程主机中,可选值有present、absent,默认值为present,表示用户需要存在,当设为absent时表示删除用户。
remove当state的值设置为absent时,表示要删除远程主机中的用户,但是在删除用户时,不会删除用户的家目录等信息,这是因为remoove参数的默认值为no。如果设置为yes,在删除用户的同时,会删除用户的家目录,当state=absent并且remove=yes时,相当于执行"userdel -r"命令
password此参数用于指定用户的密码,但是这个密码不能是明文的密码,而是一个对明文密码"加密后"的字符串,相当于/etc/shadow文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在python的命令提示符下输入如下命令,生成明文密码对应的加密字符串: import crypt crypt.crypt(‘666666’)输入上述命令后,即可得到明文密码666666对应的加密字符串
update_password此参数有两个值可选:always和on_create,当此参数的值设置为always时表示如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always。但是当此参数设置为on_create时,如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定,如果是新创建的用户,即使此参数设为on_create,也会将用户的密码设置为password参数对应的值
user模块应用
#给远程主机新建用户:
ansible testB -m user -a "name=yy"

#删除远程主机用户(只删除用户,不删除对应文件):
ansible testB -m user -a "name=yy state=absent"

#删除远程主机用户(完全删除):
ansible testB -m user -a "name=yy state=absent remove=yes"

#设定主组:
ansible testB -m user -a "name=yy group=ansible"

#附加组存在时设定附加组,系统会覆盖以前的组:
ansible testB -m user -a "name=yy groups=redhat"

#附加组存在时设定附加组,但不覆盖之前的:
ansible testB -m user -a "name=yy groups=linux append=yes"

#同时设定多个附加组(用逗号隔开):
ansible testB -m user -a "name=yy groups=shell,python append=yes"

#设定用户过期时间(例如2020-12-31过期):
#首先要获得unix时间戳:
date -d 2020-12-31 +%s
ansible testB -m user -a "name=yy expires=1609344000"

#指定用户注释信息:
ansible testB -m user -a "name=yy comment='www.westos'"

#指定用户密码:
#首先要获得明文密码的加密字符串:
ansible testB -m user -a "name=yy password='$6$GzCr4RUlgDfyuEdQ$Z33AW8V6HAGwTaOeu0ATSf8vCRXnqyRnUjo.q6lpS5G1k7U1cdPhewEmbG7cKLwLWax0VzFbd1lm7MsRT4P.w.'"

#生成密钥:
ansible testB -m user -a "name=yy generate_ssh_key=yes"

#指定密钥文件路径及文件名:
ansible testB -m user -a "name=yy generate_ssh_key=yes ssh_key_file=/opt/id_rsa_yy"

group模块

group模块可以帮助我们管理远程主机上的组

group模块参数
name必须参数,用于指定要操作的组名称。
state用于指定组的状态,两个值可选,present、absent;默认为present,设置为absent表示删除组。
gid用于指定组的gid
#给远程主机新建组:
ansible testB -m group -a "name=java"

#删除远程主机中的组:
ansible testB -m group -a "name=java state=absent"

#当组为某一用户附加组时,可以正常删除,当组为某一用户主组时,无法删除
ansible testB -m group -a "name=linux state=absent"


#设定组的gid,注意:当组不存在时,系统会直接创建组并且设定gid;当组存在时,会覆盖原来的gid
ansible testB -m group -a "name=test gid=8888"

yum_repository&yum

yum_repository模块

yum_ repository模块可以帮助我们管理远程主机上的yum仓库

yum_repository模块参数
name必须参数,用于指定要操作的唯一的仓库ID,也就是".repo"配置文件中每个仓库对应的"中括号"内的仓库ID
baseurl此参数用于设置yum仓库的baseurl
description此参数用于设置仓库的注释信息,也就是".repo"配置文件中每个仓库对应的"name字段"对应的内容。
file此参数用于设置仓库的配置文件名称,即设置".repo"配置文件的文件名前缀,在不使用此参数的情况下,默认以name参数的仓库ID作为".repo"配文件的文件名前缀,同一个’ .repo’配置文件中可以存在多个yum源
enabled此参数用于设置是否激活对应的yum源,此参数状认值为yes,表示启用对应的yum源,设置为no表示不启用对应的yum源。
gpgcheck此参数用于设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置为yes表示开启包验证功能
state默认值为present, 当值设置为absent时,表示删除对应的yum源
#给远程主机批量配置yum源:
ansible testA -m yum_repository -a 'name=rhel7.5 description="ansible rhel7.5" baseurl=http://172.25.254.36/rhel7.5 gpgcheck=no enabled=yes'

#删除远程主机中指定的yum源:
ansible testA -m yum_repository -a 'name=rhel7.5 description="ansible rhel7.5" baseurl=http://172.25.254.36/rhel7.5 gpgcheck=no enabled=yes state=absent'

查看到yum源可用:

yum模块

yum模块可以帮助我们在远程主机上通过yum源管理软件包

yum模块参数
name必须参数,用于指定需要管理的软件包
state用于指定软件包的状态,默认值为present,表示确保软件包已经安装,除了present,其他可用值有:installed、latest、absent、removed。其中installed与present等效,latest表示安装yum中最新的版本,absent和removed等效,表示删除对应的软件包。
disable_ gpg_check用于禁用对rpm包的公钥gpg验证,默认值为no,表示不禁用验证,设置为yes表示禁用验证,即不验证包,直接安装,在对应的yum源没有开启gpg验证的情况下,需要将此参数的值设置为yes,否则会报错而无法进行安装
#给远程主机批量安装http(三个命令作用相同):
ansible testA -m yum -a "name=httpd"
ansible testA -m yum -a "name=httpd state=present"
ansible testA -m yum -a "name=httpd state=installed"

#卸载远程主机中的http(两个命令作用相同):
ansible testA -m yum -a "name=httpd state=absent"
ansible testA -m yum -a "name=httpd state=removed"

#先将两个yum源中的gpgcheck设定注释掉,给远程主机批量安装gcc(发现报错):
ansible testA -m yum -a "name=gcc"

#此时就需要设定disable_gpg_check参数(安装成功):
ansible testA -m yum -a "name=gcc disable_gpg_check=yes"

unarchive&archive&mount

unarchive模块

copycopy=no为源tar包从被控端解压。 copy=tes 为源tar包从主控端解压
src源tar包路径
dest解压到的目标位置
mode解压后的文件权限
#解压软件包
ansible db -m unarchive -a 'src=/root/tmp.tar.gz dest=/root copy=no'

archive模块

path源路径,准备打包的文件
dest打成什么格式的包,放到什么位置
mode权限
#打包
 ansible db -m archive -a 'path=/tmp/*.txt dest=/root/tmp.tar.gz'

mount模块

永久性,临时性挂载某个文件

fstype指定挂载文件的系统类型,必须指定
path定义挂载到哪个目录,必须指定
src定义挂载内容
state挂载状态
mounted进行挂载,修改/etc/fstab信息
unmounted临时卸载,不修改/etc/fstab信息
absent永久性卸载,并修改 /etc/fstab信息

setup

setup模块

用于收集远程主机的一些基本信息

#获取所有主机信息
ansible all -m setup   
# IPV4 地址
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
#内存信息。
ansible all -m setup -a "filter=ansible_memory_mb"
#通过通配符实现模糊匹配,比如以”mb”关键字结尾的信息。
ansible all -m setup -a "filter=*mb"

其他主机参数
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