Jusene's Blog

ansible常见模块

字数统计: 2.3k阅读时长: 11 min
2017/02/27 Share

ansible

ansible是一种自动化运维工具,近年来越来越火的一款自动化运维工具,其主要功能是帮助运维实现IT工作的自动化、降低人为操作失误,提高业务自动化,提升运维效率,常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续集成、零宕机平滑升级等,它丰富的内置模块已多达569个和开放的api接口,可以满足企业的绝大多数自动化需求。

file 模块

  • force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
  • group:定义文件/目录的属组
  • mode:定义文件/目录的权限
  • owner:定义文件/目录的属主
  • path:必选项,定义文件/目录的路径
  • recurse:递归设置文件的属性,只对目录有效
  • src:被链接的源文件路径,只应用于state=link的情况
  • dest:被链接到的路径,只应用于state=link的情况
  • state:
    • directory:如果目录不存在,就创建目录
    • file:即使文件不存在,也不会被创建
    • link:创建软链接
    • hard:创建硬链接
    • touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
    • absent:删除目录、文件或者取消链接文件

eg:

1
[root@localhost ~]#ansible all -m file -a 'path=/tmp/ansible group=root owner=root mode=600 state=touch'
2
node1 | SUCCESS => {
3
    "changed": true, 
4
    "dest": "/tmp/ansible", 
5
    "gid": 0, 
6
    "group": "root", 
7
    "mode": "0600", 
8
    "owner": "root", 
9
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
10
    "size": 0, 
11
    "state": "file", 
12
    "uid": 0
13
}
14
10.211.55.35 | SUCCESS => {
15
    "changed": true, 
16
    "dest": "/tmp/ansible", 
17
    "gid": 0, 
18
    "group": "root", 
19
    "mode": "0600", 
20
    "owner": "root", 
21
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
22
    "size": 0, 
23
    "state": "file", 
24
    "uid": 0
25
}
26
[root@localhost ~]#ansible all -m file -a 'path=/tmp/ansible'                                           
27
node1 | SUCCESS => {
28
    "changed": false, 
29
    "gid": 0, 
30
    "group": "root", 
31
    "mode": "0600", 
32
    "owner": "root", 
33
    "path": "/tmp/ansible", 
34
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
35
    "size": 0, 
36
    "state": "file", 
37
    "uid": 0
38
}
39
10.211.55.35 | SUCCESS => {
40
    "changed": false, 
41
    "gid": 0, 
42
    "group": "root", 
43
    "mode": "0600", 
44
    "owner": "root", 
45
    "path": "/tmp/ansible", 
46
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
47
    "size": 0, 
48
    "state": "file", 
49
    "uid": 0
50
}

copy 模块

  • backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
  • content:用于替代“src”,可以直接设定指定文件的值
  • dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
  • directory_mode:递归设定目录的权限,默认为系统默认权限
  • force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
  • others:所有的file模块里的选项都可以在这里使用
  • src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

eg:

1
[root@localhost ~]#ansible all -m copy -a 'src=/etc/fstab dest=/tmp mode=600 backup=yes owner=root group=root'
2
node1 | SUCCESS => {
3
    "changed": true, 
4
    "checksum": "6ac99511d53a450c62f5d8bed6d389ab64488e3c", 
5
    "dest": "/tmp/fstab", 
6
    "gid": 0, 
7
    "group": "root", 
8
    "md5sum": "e96d6564790d338e9d1e1fdc37e4ea14", 
9
    "mode": "0600", 
10
    "owner": "root", 
11
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
12
    "size": 541, 
13
    "src": "/root/.ansible/tmp/ansible-tmp-1487585877.03-266877645347571/source", 
14
    "state": "file", 
15
    "uid": 0
16
}
17
10.211.55.35 | SUCCESS => {
18
    "changed": true, 
19
    "checksum": "6ac99511d53a450c62f5d8bed6d389ab64488e3c", 
20
    "dest": "/tmp/fstab", 
21
    "gid": 0, 
22
    "group": "root", 
23
    "md5sum": "e96d6564790d338e9d1e1fdc37e4ea14", 
24
    "mode": "0600", 
25
    "owner": "root", 
26
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
27
    "size": 541, 
28
    "src": "/root/.ansible/tmp/ansible-tmp-1487585877.03-118352953227620/source", 
29
    "state": "file", 
30
[root@localhost ~]#ansible all  -a 'ls -l /tmp/fstab'
31
10.211.55.35 | SUCCESS | rc=0 >>
32
-rw-------. 1 root root 541 Feb 23 12:27 /tmp/fstab
33
node1 | SUCCESS | rc=0 >>
34
-rw-------. 1 root root 541 Feb 23 12:27 /tmp/fstab

command 模块

  • creates:一个文件名,当该文件存在,则该命令不执行
  • free_form:要执行的linux指令
  • chdir:在执行指令之前,先切换到该目录
  • removes:一个文件名,当该文件不存在,则该选项不执行
  • executable:切换shell来执行指令,该执行路径必须是一个绝对路径

eg:

1
[root@localhost ~]#ansible all -m command -a "mkdir -p /root/ansible"
2
10.211.55.35 | SUCCESS | rc=0 >>
3
node1 | SUCCESS | rc=0 >>
4
[root@localhost ~]#ansible all -m command -a "chdir=/root ls -d ansible"
5
node1 | SUCCESS | rc=0 >>
6
ansible
7
10.211.55.35 | SUCCESS | rc=0 >>
8
ansible

shell 模块

与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能 raw

cron 模块

  • minute 分
  • day 日
  • month 月
  • weekday 周
  • hour 时
  • job 执行的任务
  • name (必须要给) 任务的名称
  • state

eg:

1
ansible all -m cron -a "minute=*/5 job='/sbin/ntpdate 192.168.1.109 &> /dev/null' name=synctime"
2
ansible all -m cron -a "state=absent name=synctime"

fetch 模块

1
[root@localhost ~]#ansible all -m fetch -a "src=/etc/fstab dest=/tmp"
2
node1 | SUCCESS => {
3
    "changed": true, 
4
    "checksum": "ba85ff3621b8931f6b86f689c6870ae7e64ac304", 
5
    "dest": "/tmp/node1/etc/fstab", 
6
    "md5sum": "0402a7deecd748b1bf30e8648ac66b03", 
7
    "remote_checksum": "ba85ff3621b8931f6b86f689c6870ae7e64ac304", 
8
    "remote_md5sum": null
9
}
10
10.211.55.35 | SUCCESS => {
11
    "changed": true, 
12
    "checksum": "ba85ff3621b8931f6b86f689c6870ae7e64ac304", 
13
    "dest": "/tmp/10.211.55.35/etc/fstab", 
14
    "md5sum": "0402a7deecd748b1bf30e8648ac66b03", 
15
    "remote_checksum": "ba85ff3621b8931f6b86f689c6870ae7e64ac304", 
16
    "remote_md5sum": null
17
}

yum 模块

  • name 必填项
  • state [latest | present | absent]
1
ansible all -m yum -a "name=httpd state=present"

service 模块

此模块需要满足在/etc/init.d下能执行的脚本

  • name
  • state [started | stopped | restarted]
  • enabled
  • runlevel
1
ansible all -m service -a 'name=httpd state=started enabled=yes'

group 模块

创建用户组

1
ansible all -m group -a "name=user1 gid=300"

user 模块

创建用户

  • name 用户名
  • system 系统账户
  • uid uid
  • shell 默认shell
  • group 组
  • home 家目录
  • passwd 需要传输加密的密码
  • remove (state=absent 同时删除家目录)
1
ansible all -m user -a "name=user2 system=yes state=present uid=306"

get_url 模块

将网上资源下载到本地

1
ansible all -m get_url -a 'url=http://10.1.1.116/favicon.ico dest=/tmp'

script 模块

在远程执行脚本

1
ansible all -m script -a '/root/test.sh'

synchronize 模块

将主控方目录推送到指定节点的目录下

  • delete=yes 使两边的内容一样(即以推送方为主)
  • compress=yes 开启压缩,默认为开启
  • –exclude=.Git 忽略同步.git结尾的文件
1
ansible all -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'

由于模块,默认都是推送push。因此,如果你在使用拉取pull功能的时候

1
ansible all -m synchronize -a 'mode=pull src=/tmp/a dest=/root/'

unarchive 模块

用于解压文件

  • copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。
  • creates:指定一个文件名,当该文件存在时,则解压指令不执行
  • dest:远程主机上的一个路径,即文件解压的路径
  • grop:解压后的目录或文件的属组
  • list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项
  • mode:解决后文件的权限
  • src:如果copy为yes,则需要指定压缩文件的源路径
  • owner:解压后文件或目录的属主
1
ansible all -m unarchive -a "src=/root/python.tar.gz  dest=/usr/local/"

ansible

CATALOG
  1. 1. ansible
    1. 1.1. file 模块
    2. 1.2. copy 模块
    3. 1.3. command 模块
    4. 1.4. shell 模块
    5. 1.5. cron 模块
    6. 1.6. fetch 模块
    7. 1.7. yum 模块
    8. 1.8. service 模块
    9. 1.9. group 模块
    10. 1.10. user 模块
    11. 1.11. get_url 模块
    12. 1.12. script 模块
    13. 1.13. synchronize 模块
    14. 1.14. unarchive 模块