ansible是一个非常强大的运维小工具,其中ansible-playbook可以像写剧本一样把要做的任务安排得明明白白,接下来我将介绍几个常用的模块,用于日常的运维。
目录
配置文件
hosts
tasks
file
copy
配置文件
ansible-playbook使用yaml语法格式的配置文件来安排任务,配置文件后缀可以是yaml或是yml。
yml文件中的核心组成部分为:
- hosts:你要在上面操作的主机列表
- tasks:任务集
- Variables:内置变量或自定义变量在playbook中调用
- Templates:模板,即使用模板语法的文件,比如配置文件等
- Handlers 和notity结合使用:由特定条件触发的操作,满足条件方才执行,否则不执行
- tags: 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
yml文件遵循以下语法:
- 在一个playbook文件中,可以连续三个连子号(
---
)区分多个play。还有选择性的连续三个点好(...
)用来表示play的结尾,也可省略。 - 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
- 使用#号注释代码。
- 缩进必须统一,不能空格和tab混用。
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
- YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
- k/v的值可同行写也可以换行写。同行使用:分隔。
- v可以是个字符串,也可以是一个列表
- 一个完整的代码块功能需要最少元素包括 name: task
示例:test.yml
---
- hosts: test
remote_user: root # 在目标主机上执行任务时的用户身份
tasks:
- name: create folder #任务名称
file:
path: "/data/test"
state: directory # directory 目录 touch 文件 link 软连接 hard 硬链接 absent 删除
owner: root
group: root
mode: 0755
- name: copy file
copy:
src: "/root/test/a.sh"
dest: "/data/test/"
owner: root
group: root
mode: 0755
注:使用mode设置文件权限时,需要使用0755而不是755。mode实际上是八进制数。必须添加前导零,以便Ansible 的YAML解析器知道它是一个八进制数,所以必须是0755,而不是755。或者加个引号也 行,比如'755',以便Ansible收到字符串,可以自行将字符串转换为数字。
要想使用该yml文件,可以使用
ansible-playbook test.yml
来运行
ansible-playbook常用参数
#ansible-playbook常用选项:
--check or -C #只检测可能会发生的改变,但不真正执行操作
--list-hosts #列出运行任务的主机
--list-tags #列出playbook文件中定义所有的tags
--list-tasks #列出playbook文件中定义的所以任务集
--limit #主机列表 只针对主机列表中的某个主机或者某个组执行
-f #指定并发数,默认为5个
-t #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v #显示过程 -vv -vvv更详细
--syntax-check #语法检查
--start-at-task='create folder' #指定从某个task开始运行
-k #用来交互输入ssh密码
-K #用来交互输入sudo密码
-u #指定用户
-i #指定hosts文件 不指定使用/etc/ansible/hosts
ansible-playbook -i hostslist ***.yml --limit 10.254.9.10 #指定单节点执行
ansible-playbook -i hostslist ***.yml --limit @failed.txt
#节点列表(提前保存为failed.txt,此时使用认证方式依然使用hostlist文件中的ssh密码,failed.txt中只包含节点ip)
接下来会解释yml文件中各关键字的含义
hosts
hosts后面跟的是主机列表名字,hosts文件可以在yml目录下,使用 -i 指定此hosts文件即可,若不指定,使用的是/etc/ansible/hosts,比如
[test]
192.168.226.130
192.168.226.129
tasks
tasks是你设置的一系列任务,一些常用的操作和模块就是在这里使用,比较常用的模块有
file
file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等
例如
---
- hosts: test
remote_user: root # 在目标主机上执行任务时的用户身份
tasks:
- name: create folder #任务名称
file:
path: "/data/test"
state: directory # directory 目录 touch 文件 link 软连接 hard 硬链接 absent 删除
owner: root
group: root
mode: 0755
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参数:用于指定被操作文件的权限,比如,如果想要将文件权限设置为"rw-r-x---",则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的,如果你想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700,很方便吧。
recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。
copy
copy模块的作用就是拷贝文件,将ansible主机上的文件拷贝到远程主机中。
---
- hosts: test
remote_user: root # 在目标主机上执行任务时的用户身份
tasks:
- name: copy file
copy:
src: "/root/test/a.sh"
dest: "/data/test/"
owner: root
group: root
mode: 0755
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表示