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表示