上一篇博客中主要介绍了Ansible概述及Ansible部署,详见以下链接自动化运维之Ansible概述及Ansible部署请添加链接描述本篇将介绍Ansible命令应用之常用模块,以实例的形式进行演示。

Ansible可用参数

  • -v:输出详细信息(可以使用多个v)
  • -i PATH:指定hosts文件位置
  • -f NUM :指定开启的进程数(默认为5)
  • -m MOULE :指定module的名称(默认为command)
  • -m DIRECTORY:指定module的目录来加载module,默认是/usr/share/ansible
  • -a,MODULE_ARGS:指定module模块的参数
  • -k:提示输入ssh的密码,而不是使用基于ssh的密钥认证
  • -u USERNAME:指定移动端的执行用户
  • -C:测试此命令执行会改变什么内容,不会真正的去执行

基本语法

ansible<host-pattern>[-m module_name][-a args]
<host-pattern>          //对哪些主机生效
[-m module_name]        //要使用的模块
[-a args]               //模块特有参数

Ansible的命令行管理工具都是由一系列模块、参数所支持的,可以在命令后面加上-h或--help获取帮助。如使用ansible-doc工具可以通过ansible-doc -h或者ansible-doc --help查看其帮助信息。
ansible-doc是用来查看模块帮助信息的工具,最主要的选项-l用来列出可使用的模块,-s用来列出某个模块的描述信息和使用示列。如列出yum模块的描述信息和操作动作:

[root@localhost ansible]# ansible-doc -s yum
- name: Manages packages with the `yum' package manager
  yum:
      allow_downgrade:       # Specify if the named package and version is allowed to
                               downgrade a maybe
                               already installed
                               higher version of that
                               package. Note that
                               setting
                               allow_downgrade=True
                               .....

Ansible常用模块

1.Command模块

默认模块,用于运行系统命令,比如echo hello。不支持shell变量和管道。

[root@localhost ansible]# ansible 192.168.88.10 -m command -a 'date'    //指定IP执行date命令
192.168.88.10 | SUCCESS | rc=0 >>
2018年 08月 01日 星期三 16:18:29 CST
[root@localhost ansible]# ansible webserver -m command -a 'date'    //指定组执行date命令
192.168.88.10 | SUCCESS | rc=0 >>
2018年 08月 01日 星期三 16:21:22 CST
[root@localhost ansible]# ansible all -a 'date'     //所有hosts执行date命令,不加-m默认使用command模块
192.168.88.10 | SUCCESS | rc=0 >>
2018年 08月 01日 星期三 16:22:44 CST

192.168.88.12 | SUCCESS | rc=0 >>
2018年 08月 01日 星期三 16:22:44 CST

2.cron模块

Ansible中的cron模块用于定义任务计划。其中有两种状态(state):present表示添加(省略状态时默认使用),absent表示移除。

[root@localhost ansible]# ansible-doc -s cron       //查看cron模块信息
- name: Manage cron.d and crontab entries
  cron:
      backup:                # If set, create a backup of the crontab before it is
                               modified. The location
                               of the backup is
                               returned in the
                               `backup_file' variable
                               by this module.
      cron_file:             # If specified, uses this file instead of an individual
                               user's crontab. If this
                               is a relative path, it
[root@localhost ansible]# ansible webserver -m cron -a 'minute="*/1" job="/bin/echo heihei" name="test cron job"'           //添加计划任务
192.168.88.10 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test cron job"
    ]
}

[root@localhost ansible]# ansible webserver -a 'crontab -l'     //查看计划任务
192.168.88.10 | SUCCESS | rc=0 >>
#Ansible: test cron job
*/1 * * * * /bin/echo heihei

[root@localhost ansible]# ansible webserver -m cron -a 'name="test cron job" state=absent'       //移除计划任务
192.168.88.10 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}

3.user模块

Ansible中user模块用于创建新用户和更改、删除已存在的用户。其中name选项用来指明创建的用户名称。

[root@localhost ansible]# ansible mysql -m user -a 'name="test01"'      //添加用户test01
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1001, 
    "home": "/home/test01", 
    "name": "test01", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1001
}

[root@localhost ansible]# ansible mysql -a 'tail /etc/passwd'       //查看新添加用户test01
192.168.88.12 | SUCCESS | rc=0 >>
setroubleshoot:x:993:988::/var/lib/setroubleshoot:/sbin/nologin
sssd:x:992:987:User for sssd:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
admin:x:1000:1000:admin:/home/admin:/bin/bash
test01:x:1001:1001::/home/test01:/bin/bash

[root@localhost ansible]# ansible mysql -m user -a 'name="test01" state=absent'     //删除test01用户
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "force": false, 
    "name": "test01", 
    "remove": false, 
    "state": "absent"
}

4.group模块

Ansible中的group模块用于对用户组进行管理

[root@localhost ansible]# ansible mysql -m group -a 'name=mysql gid=306 system=yes'     //创建mysql组
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "gid": 306, 
    "name": "mysql", 
    "state": "present", 
    "system": true
}
[root@localhost ansible]# ansible mysql -m user -a 'name=test02 uid=307 system=yes group=mysql'       //将test02用户添加到mysql组中
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 306, 
    "home": "/home/test02", 
    "name": "test02", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": true, 
    "uid": 307
}

5.copy模块

Ansible中的copy模块用于实现文件复制和批量下发文件。其中使用src来定义本地源文件路径,使用dest定义被管理主机文件路径,使用content则是通过指定信息内容来生成目标文件。

[root@localhost ansible]# ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640'       //将本地文件/etc/fstab复制到被管理主机上的/opt/fstab.back,将所有者设置为root,权限设置为640
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "checksum": "d0aba9a4f6cecb55d88d3e71a999cd716f3b0ac5", 
    "dest": "/opt/fstab.back", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "3bc805fb84012b541f89cb823d6ca070", 
    "mode": "0640", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 689, 
    "src": "/root/.ansible/tmp/ansible-tmp-1533113834.4-74195180796257/source", 
    "state": "file", 
    "uid": 0
}
[root@localhost ansible]# ansible mysql -a 'ls -l /opt'         //查看复制出的文件
192.168.88.12 | SUCCESS | rc=0 >>
总用量 4
-rw-r-----. 1 root root 689 8月   1 16:57 fstab.back
drwxr-xr-x. 2 root root   6 3月  26 2015 rh

[root@localhost ansible]# ansible mysql -m copy -a 'content="hello heihei!" dest=/opt/fstab.back'       //将“hello heihei!”写入/opt/fstab.back
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "checksum": "b783c5c2da963523d21deff007f6e6b97fc625dc", 
    "dest": "/opt/fstab.back", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0e7a9bdc00d20b6e3e1b03d836095644", 
    "mode": "0640", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 13, 
    "src": "/root/.ansible/tmp/ansible-tmp-1533113953.5-109792337994377/source", 
    "state": "file", 
    "uid": 0
}
[root@localhost ansible]# ansible mysql -a 'cat /opt/fstab.back'    //查看写入结果
192.168.88.12 | SUCCESS | rc=0 >>
hello heihei!

6.file模块

在Ansible中使用file模块来设置文件属性。其中使用path指定文件路径,使用src定义源文件路径,使用name或dest来替换创建文件的符号链接。

[root@localhost ansible]# ansible mysql -m file -a 'owner=mysql group=mysql mode=644 path=/opt/fstab.back'           //设置/opt/fstab.back的属主属组为mysql,权限为644
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "gid": 306, 
    "group": "mysql", 
    "mode": "0644", 
    "owner": "mysql", 
    "path": "/opt/fstab.back", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 13, 
    "state": "file", 
    "uid": 305
}
[root@localhost ansible]# ansible mysql -m file -a 'path=/opt/fstab.link src=/opt/fstab.back state=link'     //设置文件/optfstab.link为文件/opt/fstab.back的连接文件
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "dest": "/opt/fstab.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:usr_t:s0", 
    "size": 15, 
    "src": "/opt/fstab.back", 
    "state": "link", 
    "uid": 0
}
[root@localhost ansible]# ansible mysql -m file -a "path=/opt/fstab.back state=absent"       //删除一个文件
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "path": "/opt/fstab.back", 
    "state": "absent"
}
[root@localhost ansible]# ansible mysql -m file -a "path=/opt/test state=touch"     //创建一个文件
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "dest": "/opt/test", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:usr_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

7.ping模块

在Ansible中使用ping模块来检测指定主机的连通性。

[root@localhost ansible]# ansible all -m ping
192.168.88.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.88.10 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

8.service模块

在Ansible中使用service模块来控制管理服务的运行状态。其中,使用enabled表示是否开机自动启动,取值为true或者false;使用name定义服务名称;使用state指定服务状态,取值分别为started、stopped、restarted。

[root@localhost ansible]# ansible webserver -a 'systemctl status httpd'     //查看webserver组内主机httpd服务状态
192.168.88.10 | SUCCESS | rc=0 >>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2018-08-01 17:41:13 CST; 5s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 43797 (httpd)
 ...

 [root@localhost ansible]# ansible webserver -m service -a 'enabled=true name=httpd state=stopped'     //关闭webserver组内主机httpd服务

9.shell模块

Ansible中的shell模块可以在被管理主机上运行命令,并支持像管道符等功能的复杂命令。

[root@localhost ansible]# ansible mysql -m shell -a 'echo abc123|passwd --stdin mysql'      //创建用户使用无交互模式给用户设置密码
192.168.88.12 | SUCCESS | rc=0 >>
更改用户 mysql 的密码 。
passwd:所有的身份验证令牌已经成功更新。

10.script模块

Ansible中的script模块可以将本地脚本复制到被管理主机上进行运行。需要注意的是,使用相对路径来指定脚本。

[root@localhost opt]# vi test.sh            //编写测试脚本
[root@localhost opt]# chmod +x test.sh      //给予执行权限
[root@localhost opt]# ansible mysql -m script -a 'test.sh'      //在mysql组中执行test脚本
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.88.12 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.88.12 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}
[root@localhost ~]# cat /opt/script.txt         //在mysql组的主机上进行查看
hello ansible from script

11.yum模块

Ansible中的yum模块负责在被管理主机上安装和卸载软件包,但是需要提前在每个节点配置自己的YUM仓库。其中使用name指定要安装的软件包,还需要带上软件包的版本号,否则安装最新的软件包;使用state指定安装软件包的状态,present、latest用来表示安装,absent表示卸载。

[root@localhost opt]# ansible mysql -m yum -a 'name=zsh'        //在mysql组的主机上安装zsh软件包
192.168.88.12 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror, langpacks\nLoading mirror speeds from cached hostfile\n * base: mirrors.nwsuaf.edu.cn\n * epel: mirrors.ustc.edu.cn\n * extras: mirrors.shu.edu.cn\n * updates: mirrors.shu.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package zsh.x86_64 0:5.0.2-28.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package        Arch              Version                 Repository       Size\n================================================================================\nInstalling:\n zsh            x86_64            5.0.2-28.el7            base            2.4 M\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 2.4 M\nInstalled size: 5.6 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : zsh-5.0.2-28.el7.x86_64                                      1/1 \n  Verifying  : zsh-5.0.2-28.el7.x86_64                                      1/1 \n\nInstalled:\n  zsh.x86_64 0:5.0.2-28.el7                                                     \n\nComplete!\n"
    ]
}
[root@localhost ~]# rpm -q zsh          //在mysql主机上查看zsh软件包安装情况
zsh-5.0.2-28.el7.x86_64

12.setup模块

在Ansible中使用setup模块收集、查看被管理主机的facts(facts是Ansible采集被管理主机设备信息的一个功能)。每个被管理主机在接收并运行管理命令之前,都会将自己的相关信息(操作系统版本、IP地址等)发送给控制主机。

[root@localhost opt]# ansible mysql -m setup        //查看mysql组主机的facts信息
192.168.88.12 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.122.1", 
            "192.168.88.12"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::c3db:eb90:1263:4a4c"
        ], 
        "ansible_apparmor": {
        ...