文章目录

  • Ansible 常用模块
  • 简介
  • yum模块
  • copy模块
  • selinux模块
  • systemd模块
  • sysctl模块
  • blockinfile 模块
  • shell/command模块
  • unarchive模块
  • archive模块
  • template模块
  • stat模块
  • debug 模块
  • wait_for模块
  • fail模块
  • get_url模块
  • script模块
  • user模块
  • synchronize模块
  • cron模块
  • file模块
  • authorized_key模块
  • 参考文档


Ansible 常用模块

简介

Ansible内置了许多Module,这些Module可以用于控制系统资源,比如services,packages,文件等,利用这些Module通过playbook可以编排出复杂的各种任务,这里主要介绍几个常用的模块

yum模块

通过yum包管理器,支持对包安装/升级/卸载等处理,这个模块使用的是python2去进行管理,如果是CentOS8,redhat8等操作系统,默认python解释器版本为python3,可以使用dnf模块。

常用参数

描述

name

包名,也可以指定本地需要安装的包路径,

state

absent/remove,表示卸载,present/install表示安装

list

查看指定的包状态信息,与name参数互斥

playbook示例:

$ cat yum.yml
---
  - hosts: 192.168.240.33
    tasks:
      # 安装多个包
      - name: install package
        yum:
          name: "{{ packages }}"
          state: installed
        vars:
          packages:
          - httpd
          - httpd-tools
      # 卸载多个包
      - name: remove package
        yum:
          name: "{{ packages }}"
          state: absent
        vars:
          packages:
            - httpd
            - httpd-tools
      # 列出指定的包信息,注册到result变量,再用debug输出信息
      - name: list ansible packages
        yum:
          list: httpd
        register: result

      - name: print result msg
        debug:
          msg: "{{ result }}"
      # 此任务输出信息如下

#TASK [print result msg] *****************************************************************************************************************
#ok: [192.168.240.33] => {
#    "msg": {
#        "changed": false,
#        "failed": false,
#        "results": [
#            {
#                "arch": "x86_64",
#                "envra": "0:httpd-2.4.6-90.el7.centos.x86_64",
#                "epoch": "0",
#                "name": "httpd",
#                "release": "90.el7.centos",
#                "repo": "base",
#                "version": "2.4.6",
#                "yumstate": "available"
#            }
#        ]
#    }
#}

注意事项:

  1. 使用yum安装多个包的时候,不能简单使用with_item进行循环,这种方式在未来会被舍弃,官方推荐的是,设置一个列表变量,直接一次性安装一个列表变量的包清单
  2. yum模块安装如果是普通用户执行可能会显示权限不足,可以预先设置好sudo权限,普通用户sudo执行,或者直接用root执行
  3. 如果正在执行yum模块然后ctrl + c 中断掉可能会导致下一次执行yum任务的时候报错,显示 有进程正在用yum,lockfile…,但是登录到相关机器ps看进程找不到yum相关进程,这个问题的原因暂时没有找到,但是有一个临时的解决方法: 去每台机器随便安装个东西,然后就可以解锁了。。。。ansible all -m shell -a 'yum install gcc -y' ,只是临时的解决方式,最好进行yum任务的时候,不要中断

copy模块

copy模块用于从本地复制文件到远端的服务器上,如果文件的内容需要用到变量,可以使用template模块,

参数

描述

backup

yes/no,如果远端服务器上已有,是否将远端服务器的文件备份,默认否

content

“string”,将文件的内容直接设置为指定的值

dest

远端服务器的路径,如果src是目录,则dest也需要是一个目录路径,如果dest是一个不存在的路径或者以’/'结尾,或者src是一个目录,dest路径会被生成

src

需要复制的本地文件/目录路径,如果copy模块在roles中,这里就可以直接写文件名,会自动去files对应的role下找文件。

group

文件/目录属组名

owner

文件/目录属主名

mode

具体权限

playbook示例:

$ cat copy.yml
---
  - hosts: 192.168.240.33
    tasks:
      # 测试content参数,直接写入字符串到指定文件
      - name: test concent
        copy:
          content: "hello world"
          dest: /tmp/hello.txt
          group: ansible
          owner: ansible
          mode: '0644'

# cat目标机器可以看到文本已经生成
# $cat /tmp/hello.txt
# hello world
          
      # 测试 backup 参数
      - name: test backup
        copy:
          src: /tmp/hello.txt
          dest: /tmp/Hello.txt
          backup: yes
          group: ansible
          owner: ansible
          mode: "0644"

# ll /tmp/Hello.txt*
# -rw-r--r--. 1 ansible ansible 11 Nov 24 15:19 /tmp/Hello.txt
# -rw-r--r--. 1 ansible ansible  5 Nov 24 15:19 /tmp/Hello.txt.52755.2019-11-24@15:19:56~
#
# 当文件内容发生变化,会将原文件备份加一串时间戳字符串,方便回滚

      # 将/root/目录下的文件传送到/tmp目录下
      - name: test copy dirctory
        copy:
          src: /root/
          dest: /tmp
          group: ansible
          owner: ansible
# 此任务会将/root目录下的文件,copy到/tmp目录下

selinux模块

selinux模块用于管理selinx的状态和策略,需要注意的事,如果要将开启状态的selinux改成disable需要重启服务器。

参数

描述

configfile

配置文件路径,默认"/etc/selinux/config"

policy

SELinux的策略

state

The SELinux mode.disabled,enforcing,permissive

playbook示例:

$ cat selinux.yml
- hosts: 192.168.240.33
  tasks:

    - name: set selinux state is permissive
      selinux:
        policy: targeted
        state: permissive

    - name: Disable SeLinux
      selinux:
        state: disabled

备注:

如果单一设置为disabled状态,这时候系统需要重启才生效,所以可以考虑分2步,第一步先许可,然后再disabled,这时候就能保证selinux执行playbook之后就一定是关闭/许可状态。

systemd模块

systemd模块用于管理服务状态

参数

描述

daemon_reload

任何操作之前先执行daemon-reload操作,no/yes

enabled

设置是否开机启动,no/yes

name

服务名称

state

reloaded重载,restarted重启,started启动,stopped停止

playbook示例:

$ cat systemd.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: Stop and Disable service
        systemd:
          name: "{{ item }}"
          state: stopped
          enabled: no
        with_items:
          - firewalld
          - irqbalance

sysctl模块

sysctl模块管理sysctl.conf文件,可用来管理内核参数

参数

描述

name

指定sysctl支持的变量,内核参数可以在这里管理

state

定义该值是否应该在sysctl文件中存在,present存在,absent不存在

sysctl_file

设置sysctl.conf文件位置

value

name变量对应的值

playbook示例:

---
  - hosts: 192.168.240.33
    tasks:

      - name: Setting present kernel params
        sysctl:
          name: "{{ item.name }}"
          value: "{{ item.value }}"
          ignoreerrors: yes
          state: present
        with_items:
          - { name: 'net.core.rmem_default', value: 8388608 }
          - { name: 'net.core.rmem_max', value: 16777216  }
          - { name: 'net.core.wmem_default', value: 8388608  }
          - { name: 'net.core.wmem_max', value: 16777216 }
          - { name: 'net.ipv4.igmp_max_memberships', value: 512  }
          - { name: 'net.ipv4.conf.bond0.force_igmp_version', value: 2  }
          - { name: 'vm.max_map_count', value: 655360 }

blockinfile 模块

插入/更新/移除被标记线包围的文本信息

参数

描述

backup

yes/no,如果为yes表示创建一个包含时间戳信息的备份文件,如果错误修改了可以获得源文件,默认no

block

要插入标记行内的文本,如果为空串这个块会被删除

create

yes/no,如果此文件不存在,创建一个新文件,默认no

group

文件属组

owner

文件属主

mode

文件权限

path

文件的路径

state

block块文本信息是的状态,默认present,不存在则填写absent

marker_end

会替换掉标记信息的{mark}作为标识块的结尾

marker_begin

会替换掉标记信息的{mark}作为标识块的开始

marker

标记信息,标记信息的模板,默认"# {mark} ANSIBLE MANAGED BLOCK"

insertbefore

insertafter类似不同点就是会在最后一次匹配正则表达式成功之前插入块

insertafter

如果使用这个参数,将会再最后一次匹配到正则表达式之后插入块,EOF意味着再文件最后插入这一行,如果指定的正则表达式没有匹配成功,EOF将会生效

playbook示例:

$ cat blockfile.yml
---
  - hosts: 192.168.240.33
    tasks:

      - name: Update /etc/security/limits.conf
        blockinfile:
          dest: /etc/security/limits.conf
          insertbefore: '# End of file'
          block: |
            * soft nofile 131072
            * hard nofile 131072
            * soft core unlimited
            * hard core unlimited
            * soft memlock unlimited
            * hard memlock unlimited

在 /etc/security/limits.conf 会确保如下block存在

# BEGIN ANSIBLE MANAGED BLOCK
* soft nofile 131072
* hard nofile 131072
* soft core unlimited
* hard core unlimited
* soft memlock unlimited
* hard memlock unlimited
# END ANSIBLE MANAGED BLOCK

备注:如果手动删除标识符,会导致无法正确定位到块

shell/command模块

在目标机器上执行命令,shell和command模块的用法基本一致,区别在于,shell模块执行命令使用的是shell解释器,command不能解析变量和某些操作符("|","<",">"等),所以如果一定要使用这些操作符的时候需要使用shell模块,其他情况都推荐使用command

参数

描述

cmd

执行的命令

creates

如果指定的文件存在,则不执行,用于保证幂等性

removes

如果指定的文件不存在,则不执行,用于保证幂等性

chdir

如果此参数设置了,执行命令时会先切换到这个目录下

shell模块playbook示例:

$ cat shell.yml
---
  - hosts: 192.168.240.33
    tasks:
    # 下面两个任务等价,当存在/tmp/fstab文件,则这个shell任务不执行
      - name: test shell
        shell:
          cmd: cat /etc/fstab > /tmp/fstab
          creates: /tmp/fstab
        register: shell_result

      - name: test shell
        shell: cat /etc/fstab > /tmp/fstab
        args:
          creates: /tmp/fstab
        register: shell_result

      - name: print shell result msg
        debug:
          msg: "{{ shell_result }}"

command模块playbook示例:

$ cat command.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: test command
        shell:
          cmd: cat /etc/fstab
        register: command_result


      - name: print command result msg
        debug:
          msg: "{{ command_result }}"

commad/shell模块执行之后的结果可以注册成变量,可以看到有如下信息

key

描述

cmd

task中执行的命令

delta

命令执行的时间耗时

end

命令执行的结束时间

changed

是否发生变更

start

命令执行的启动时间

rc

命令执行完成的返回值

stderr

命令的标准错误输出

stdout

命令的标准输出

stdout_lines

列表,命令执行完成后,对输出结果每行切分,形成列表

示例如下:

ok: [192.168.240.33] => {
    "msg": {
        "changed": true,
        "cmd": "cat /etc/fstab",
        "delta": "0:00:00.134274",
        "end": "2019-11-24 18:20:54.641665",
        "failed": false,
        "rc": 0,
        "start": "2019-11-24 18:20:54.507391",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "\n#\n# /etc/fstab\n# Created by anaconda on Tue Aug 27 09:30:03 2019\n#\n# Accessible filesystems, by reference, are maintained under '/dev/disk'\n# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info\n#\n/dev/mapper/centos-root /                       xfs     defaults        0 0\nUUID=4e742da0-c66f-4483-805e-c7c25d2ede83 /boot                   xfs     defaults        0 0\n/dev/mapper/centos-swap swap                    swap    defaults        0 0",
        "stdout_lines": [
            "",
            "#",
            "# /etc/fstab",
            "# Created by anaconda on Tue Aug 27 09:30:03 2019",
            "#",
            "# Accessible filesystems, by reference, are maintained under '/dev/disk'",
            "# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info",
            "#",
            "/dev/mapper/centos-root /                       xfs     defaults        0 0",
            "UUID=4e742da0-c66f-4483-805e-c7c25d2ede83 /boot                   xfs     defaults        0 0",
            "/dev/mapper/centos-swap swap                    swap    defaults        0 0"
        ]
    }
}

unarchive模块

unarchive模块用于解压包到远端服务器

参数

描述

src

本地压缩包地址

dest

解压到远端服务器的路径

remote_src

yes/no,远端服务器是否存在这个包,如果存在则直接在远端解压即可,与copy互斥

copy

yes/no,如果为yes,文件将从本地拷贝到远端服务器

creates

如果指定绝对路径已经存在,这一步不会运行

group

指定属组

owner

指定属主

mode

指定权限信息

playbook示例

$ cat unarchive.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: unarchive module
        unarchive: 
          src: /home/ansible/ADT/Packages/ansible-2.8.1.tar.gz # 本机包的路径
          dest: /tmp/ # 远端主机包路径
          creates: /tmp/ansible-2.8.1 # 如果远端此目录已经存在,则不执行此任务
          copy: yes # 将包从本机拷贝到远端服务器
          owner: ansible # 属主
          group: ansible # 属组
          mode: '0755' # 目录权限信息

结果:

$ ll /tmp/ansible-2.8.1 -d
drwxr-xr-x. 2 ansible ansible 4096 Jul 21 00:37 /tmp/ansible-2.8.1

已经解压完成,如果再次运行示例的playbook,不会重新覆盖,而是skip了。

archive模块

archive模块用于打包归档,与unarchive模块相反,归档后可以通过指定remove=true删除源文件

参数

描述

dest

归档后包的路径以及文件名

group

归档后包的属组

mode

归档后包的权限信息

owner

归档后包的属主

path

远端归档源

remove

是否删除源文件

format

打包的格式,默认gz,可选项有bz2,gz,tar,xz,zip

playbook示例:

$ cat archive.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: archive module
        archive:
          path: /tmp/ansible-2.8.1 # 远端服务器归档源
          dest: /home/ansible/ansible-2.8.1.tgz # 本地服务器归档文件路径
          remove: no # 是否删除源文件
          format: gz # 打包压缩格式为gz
          mode: '0644' # 包的权限信息
          owner: ansible # 包的属主
          group: ansible # 包的属组
         
      - name: archive some file
        archive:
          path:
            - /etc/fstab
            - /etc/passwd
          dest: /home/ansible/info.tgz
          remove: no
          format: gz
          mode: '0644'
          owner: ansible
          group: ansible

template模块

template模块将模板文件传输到远端的服务器指定路径下,这个模块非常强大,利用jinja2引擎可以做非常多变量替换,判断,循环等操作。这里只介绍template模块,具体的jinja2语法这里先不涉及

参数

描述

backup

yes/no,拷贝的时候如果远端服务器已有这个文件会将原文件备份,备份文件包含一个时间戳的文件名,方便回滚

dest

目标文件路径

src

本地文件路径,如果在role中使用template模块会自动去对应的role下的template目录找文件,因此可以不写文件名

validate

在复制到指定位置之前要运行的验证命令,临时文件路径通过%s传递,如果验证命令执行失败则不会复制到指定位置,这里主要用于编写配置文件的时候可以进行语法检查,当没有问题了再进行覆盖

mode

文件权限信息

owner

文件属主

group

文件数组

template示例的模板文件如下

$ cat template.txt
{{ ansible_host }} # ansible_host变量表示当前连接的主机ip

template playbook 示例文件如下:

$ cat template.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: template module
        template:
          src: /home/ansible/ADT/template.txt
          dest: /tmp/template.txt
          owner: ansible
          group: ansible
          mode: '0644'
          backup: yes
          validate: touch %s # 复制到适当位置之前运行一次touch命令。 ansible会先将文件拷贝到远端服务器,然后再拷贝到指定的位置,这里的%s指的是临时存放此文件的绝对路径

执行结果

$ cat /tmp/template.txt
192.168.240.33

stat模块

stat模块用于检测文件或文件系统状态

参数

描述

path

要检测的对象路径

stat示例:

$ cat stat.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: get /etc/fstab stat
        stat:
          path: /etc/fstab
        register: stat_return

      - name: print stat_return
        debug:
          msg: "{{ stat_return }}"

返回值信息有非常多的内容,常用的有以下几个信息

key

描述

atime

文件的atime值

ctime

文件的ctime值

executable

是否有执行权限

exists

是否存在

gid

gid值

inode

inode号

isdir

是否是目录

isgid

调用的gid是否与属组的gid匹配

isuid

调用的uid是否与属主的uid匹配

mode

权限信息

mtime

文件的mtime值

path

文件路径

readable

是否有读权限

size

文件大小

uid

文件uid值

writeable

是否有写权限

debug 模块

debug模块用于输出一些debug信息

参数

描述

verbosity

控制调试的层级,如果设置为3,执行的时候需要使用-vvv才会输出信息

msg

自定义输出的信息,默认"Hello world!"

var

变量值内容

playbook示例如下:

# 输出主机的所有变量信息
$ cat debug.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: -vvvv
        debug:
          var: hostvars[inventory_hostname]
          verbosity: 2

wait_for模块

wait_for模块,当某些状态满足条件之后,才会继续往下执行task

参数

描述

delay

开始检查前等待的秒数,默认0

host

可解析的主机名/ip,因为一台机器上可能有多个IP,这里可以指定监控哪个IP/主机名状态

port

等待端口处于启动状态

path

等待path文件存在。与port参数互斥,可以利用这个检查进程/proc/进程号

search_regex

在文件中进行正则匹配,匹配成功才会继续

state

present/started/stopped/absent/drained。默认started,当检查端口时,started表示等待端口打开,stopped表示等待端口关闭,当检查的是文件时,present/started检查到文件才会继续,absent检查到文件不存在才会继续

sleep

两次检查的间隔

timeout

检查的超时时间

playbook示例:

$ cat wait_for.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: wait for 80 port
        wait_for:
          host: 192.168.240.33
          port: 80
          delay: 1
          state: started
          sleep: 1
          timeout: 3

fail模块

fail模块用于自定义错误信息,与debug类似,但是这个模块可以用于检查某些状态是否执行完成,如果不符合预期,则抛出错误,但是debug试试输出信息,不会抛出错误

参数

描述

msg

报错信息

playbook示例:

$ cat fail.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: fail module
        fail:
          msg: " fail !"

执行之后的结果如下

$ ansible-playbook fail.yml

PLAY [192.168.240.33] *****************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************
ok: [192.168.240.33]

TASK [fail module] ********************************************************************************************************************************************************************************************
fatal: [192.168.240.33]: FAILED! => {"changed": false, "msg": " fail !"}

PLAY RECAP ****************************************************************************************************************************************************************************************************
192.168.240.33             : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

get_url模块

get_url模块用于从指定的ftp,http,httpsurl下载文件

参数

描述

backup

yes/no,如果文件已经存在,覆盖之前会创建包含时间戳的备份文件

dest

从url下载的文件存放路径

tmp_dest

临时文件存放目录

owner

设置下载的文件属主

group

设置下载的文件属组

url

下载的url路径

timeout

请求url的超时时间

mode

指定文件的权限

playbook示例:

$ cat get_url.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: get url
        get_url:
          backup: yes
          mode: '0644'
          owner: ansible
          group: ansible
          timeout: 10
          dest: /home/ansible/
          url: http://mirrors.163.com/.help/CentOS7-Base-163.repo # 测试拉取网易镜像站的centos7 yum源配置文件

script模块

script模块,将本地的脚本传输到远端,然后执行

参数

描述

cmd

执行的脚本命令

creates

当文件在远端服务器存在时,不执行脚本

removes

当文件在远端服务器不存在时,不执行脚本

测试脚本文件:

$ cat script.sh
echo "hello world" > /tmp/script.txt

playbook示例:

$ cat script.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: script module
        script:
          cmd: /home/ansible/ADT/script.sh
          creates: /tmp/script.txt

user模块

管理系统用户账号

参数

描述

name

用户名

password

密码,这里的密码是加密字符串,不能是密码,需要用openssl passwd -1 明文密码获取加密字符串,不能直接用明文信息

state

present/absent,创建还是删除用户

system

是否设置成系统账户

createhome

是否创建家目录

group

设置用户的组名

shell

shell解释器

remove

配合state的absent使用,如果删除用户是否删除家目录文件

home

指定家目录路径

playbook示例

$ cat user.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: create user t1
        user:
          name: t1
          password: $1$Xjkqc/V8$DLJdGqGxeRPhsEogSc53j1 # 这个字符串是通过openssl passwd -1 123456 生成
          state: present
          system: no
          createhome: yes
          home: /home/t
          shell: /bin/bash

synchronize模块

synchronize模块实现rsync常用的功能,当文件非常大的时候,copy效率会非常低,这时候可以考虑使用synchronize模块,速度快很多,但是需要服务器上已安装rsync包

参数

描述

src

传输的文件路径

dest

远端服务器路径

mode

传输模式 push/pull,

archive

等价于rsync的-a选项,

recursive

是否递归

compress

传输过程是否压缩

group

传输后文件的属组

owner

yes/no,是否保留属主信息

perms

yes/no,是否保留权限

playbook示例:

$ cat synchronize.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: synchronize module
        synchronize:
          src: /tmp
          dest: /home/ansible/
          archive: yes
          recursive: yes

cron模块

cron模块用于管理cron任务

参数

描述

user

指定用户的定时任务

job

定时任务

state

present/absent,是否存在

name

定时任务名称

minute


hour


day


month


weekday


playbook示例:

$ cat cron.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: cron module
        cron:
          minute: "0"
          hour: "*"
          day: "*"
          month: "*"
          weekday: "*"
          name: ntpdate
          job: "ntpdate ntp1.aliyun.com"
          user: root
          state: present

执行结果:root用户查看定时任务

# crontab -l
#Ansible: ntpdate
0 * * * * ntpdate ntp1.aliyun.com

file模块

file模块用于管理文件状态

参数

描述

src

创建连接文件时的真实路径

path

文件路径

mode

文件的权限信息

owner

文件的属主

group

文件的属组

recurse

是否递归设置

state

文件的状态,present 存在,absent 不存在,file 文件,directory目录,link软链接,hard硬链接

playbook示例:

$ cat file.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: file module
        file:
          owner: ansible
          group: ansible
          path: /tmp/file/a/b/c
          recurse: yes
          mode: '0755'
          state: directory

执行结果

# tree /tmp/file/
/tmp/file/
└── a
    └── b
        └── c

authorized_key模块

authorized_key模块用于新增或一处ssh公钥

参数

描述

key

公钥路径,可是本地文件也可以是url地址

path

公钥存放路径

state

present/absent,是否存在

user

添加到远程哪个用户下

playbook示例如下:

# 设置ansible用户 t2@192.168.240.33免密登录
# $ cat authorized_key.yml
---
  - hosts: 192.168.240.33
    tasks:
      - name: authorized_key module
        authorized_key:
          key: "{{ lookup('file', '/home/ansible/.ssh/id_rsa.pub') }}"
          state: present
          user: t2