Ansible 从入门到实战(3)-Ansible 模块初接触

本贴最后更新于 1871 天前,其中的信息可能已经东海扬尘

Ansible 从入门到实战(3)-Ansible 模块初接触

module,模块,是 Ansible 功能实现的灵魂。Ansible 众多的功能就是一个一个的 module 实现的。多个 module 的组合能让我们写出自动化运维的脚本,也就是后面会

一、一个命令的简单分析

让我们来看下上一节执行的命令 ansible all -m ping,对应这个命令,你应该知道的:

  • all,这个参数指的是 /etc/ansible/hosts 文件中所有的主机。如果你按照上一节的教程配置的话,我们可以把 all 替换为 node1 ,这样意思是本次命令针对的是 node1 这个组别的主机
  • -m 这个参数指明要使用哪个模块,上述命令意思是使用 ping 模块

接下来我们把命令改为 ansible node1 -m ping 测试下,结果如下:

[root@localhost ~]# ansible node1 -m ping
localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
apple | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

注意:如果不用 -m 指定执行的模块,默认使用 command 模块

Normally commands take a -m for module name, but the default module name is ‘command’

二、ad-hoc command :特设命令

什么是 ad-hoc command?我们来看下官方的解释:

An ad-hoc command is something that you might type in to do something really quick, but don’t want to save for later.

可以看出,ad-hoc command 就是用来完成一些简单任务的命令

三、常用的 ad-hoc 有哪些?

  • 3.1 文件传输
- 传输文件:
$ ansible node1 -m copy -a "src=/etc/hosts dest=/tmp/hosts"

- 修改文件用户和权限
$ ansible node1 -m file -a "dest=/srv/foo/a.txt mode=600"
$ ansible node1 -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"

- 类似 mkdir -p 的操作:
ansible node1 -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"

- 递归删除目录和文件:
$ ansible node1 -m file -a "dest=/path/to/c state=absent"

以上命令,我在被管理机器上 mkdir -p /tmp/test/user01 建立了测试文件夹,然后在控制节点执行 ansible apple -m file -a "dest=/tmp/test/user01 state=absent",其中 apple 是我在配置文件里设置的主机名,结果如下:

[root@localhost ~]# ansible apple -m file -a "dest=/tmp/test/user01 state=absent"
apple | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "path": "/tmp/test/user01", 
    "state": "absent"
}
  • 3.2 管理系统软件包

确认软件是否安装,不会升级:
$ ansible webservers -m yum -a "name=acme state=present"

确认软件安装为确定版本:
$ ansible webservers -m yum -a "name=acme-1.5 state=present"

确认软件安装为最新版本:
$ ansible webservers -m yum -a "name=acme state=latest"

确认软件没有安装:
$ ansible webservers -m yum -a "name=acme state=absent"

我执行了 ansible apple -m yum -a "name=acme state=absent",结果如下:

[root@localhost ~]# ansible apple -m yum -a "name=acme state=absent"
apple | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "acme is not installed"
    ]
}
  • 3.3 用户和用户组管理

创建用户
$ ansible all -m user -a "name=foo password=<crypted password here>"

删除用户
$ ansible all -m user -a "name=foo state=absent"

我执行了 ansible apple -m user -a "name=foo state=absent",结果如下:

[root@localhost ~]# ansible apple -m user -a "name=foo state=absent"
apple | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "name": "foo",
    "state": "absent"
}
  • 3.4 服务管理

确认服务已经开启:
$ ansible apple -m service -a "name=httpd state=started"

重启服务:
$ ansible apple -m service -a "name=httpd state=restarted"

关闭服务:
$ ansible apple -m service -a "name=httpd state=stopped"

我执行了 ansible apple -m service -a "name=httpd state=stopped",结果如下:

[root@localhost ~]# ansible apple -m service -a "name=httpd state=stopped"
apple | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "msg": "Could not find the requested service httpd: host"
}

我的被管理机器没有安装 httpd,所以返回的结果说找不到 httpd 服务

四、下一节是?

下一节将会学习一些常用的 Ansible module(模块)

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...