乐趣区

Ansible常用模块基本操作

Ansible 是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。

前言

对于任何一个框架,一个应用,为了更便于推广,便于使用,便于商业化,都会顺便提供很多常用的模块,这样让大家也很容易使用起来。Ansible 也是一样的,所以这些常用的模块,就好比基本功,基本招式一样,我们需要掌握这些基本功,掌握这些基本招式。这篇文章,就对这些常用的模块进行一个比较全面的总结。

ping 模块

ping是测试远程节点的 SSH 连接是否就绪的常用模块,但是它并不像 Linux 命令那样简单地 ping 一下远程节点,而是先检查能否通过 SSH 登陆远程节点,再检查其 Python 版本能否满足要求,如果都满足则会返回 pong,表示成功。使用方式如下:

ansible web -m ping

ping无须任何参数。上述命令输出结果如下所示:

192.168.1.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.1.4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

debug 模块

打印输出信息,类似 Linux 上的 echo 命令。在后续的学习过程中,我们会经常用这个命令来调试我们写的 playbook。

对于 debug 模块有两种用法。下面就对这两种用法都进行详细的总结。

  • 通过参数 msg 定义打印的字符串

msg 中可以嵌入变量,比如我先定义了以下的一个 playbook。

---

- hosts: web
  vars:
    name: jellythink
  tasks:
    - name: display
      debug: msg="I am {{name}}"
  • 通过参数 var 定义需要打印的变量

变量可以是系统变量,也可以是动态的执行结果,通过关键字 register 注入变量中。对于变量,我们可以这样玩:

---

- hosts: web
  vars:
    name: jellythink
  tasks:
    - name: display
      debug:
        var: name

对于注入变量,可以这样玩:

---

- hosts: web
  tasks:
    - name: register var
      shell: hostname
      register: result
    - name: display
      debug:
        var: result

copy 模块

从当前的机器上复制静态文件到远程节点上,并且设置合理的文件权限。copy模块在复制文件的时候,会先比较一下文件的 checksum,如果相同则不会复制,返回状态为 OK;如果不同才会复制,返回状态为 changed。

一般情况的使用,就是这样的:

---

- hosts: server1
  tasks:
    - name: copyDemo
      copy:
        src: /home/jelly/nameList.txt 
        dest: /home/test1/nameList.txt

在实际的工作中,一般会在进行文件分发时,需要备份原文件,这个时候就需要我们加上 backup 选项:

---

- hosts: server1
  tasks:
    - name: copyDemo
      copy:
        src: /home/jelly/nameList.txt 
        dest: /home/test1/nameList.txt
        backup: yes

加上 backup: yes 后,在目标主机上,就会对原来的文件进行备份,比如这样子的备份文件:

nameList.txt.8648.2019-09-28@06:27:18~

template 模块

如果只是复制静态文件,使用 copy 模块就可以了;但是如果在复制的同时需要根据实际情况修改部分内容,那么就需要用到 template 模块了。

比如我们在分发配置文件时,每个配置文件需要根据远程主机的一些属性不同而配置不同的值,对于需要替换的部分,我们就可以使用 template 模块来进行替换。template模块使用的是 Python 中的 Jinja2 模板引擎,这里我们不需要过多的去关注这个模板引擎,只需要知道变量的表示法是 {{}} 就可以了。比如这里就有一个 http.conf.j2 的模板文件,文件内容如下:

Listen {{ansible_default_ipv4.address}}
Port {{http_port}}

其中 {{ansible_default_ipv4.address}} 就是需要根据不同的主机,动态变化的。接下来,我们就可以这样使用 template 模块来完成变量的替换。

---

- hosts: server1
  vars:
    http_port: 8080

  tasks:
  - name: Write Config File
    template:
      src: http.conf.j2
      dest: /home/test1/http.conf

在目的主机上,文件内容如下:

Listen 192.168.1.3
Port 8080

copy 模块一样,template模块也可以进行权限设置和文件备份等功能。

file 模块

file模块可以用来设置远程主机上的文件、软链接和文件夹的权限,也可以用来创建和删除它们。

我们可以使用 mode 参数进行权限修改,可以直接赋值数字权限(必须以 0 开头)。

---

- hosts: server1
  tasks:
  - name: Modify Mode
    file:
      path: /home/test1/http.conf
      mode: 0777

我们还可以根据 state 参数的不同,实现不同的行为,比如创建软链接:

---

- hosts: server1
  tasks:
    - name: Create Soft Link
      file:
        src: /home/test1/http.conf
        dest: /home/test1/conf
        state: link

也可以设置 state: touch 创建一个新文件,比如这样:

---

- hosts: server1
  tasks:
    - name: Create a new file
      file:
        path: /home/test1/touchfile
        state: touch 
        mode: 0700

还可以设置 state: directory 新建一个文件夹,比如这样:

---

- hosts: server1
  tasks:
    - name: Create directory
      file: 
        path: /home/test1/testDir
        state: directory
        mode: 0755

user 模块

user模块可以对用户进行管理,实现增、删、改 Linux 远程节点的用户账户。比如增加用户:

---

- hosts: server1
  tasks:
    - name: Add user
      user:
        name: test3

删除用户:

---

- hosts: server1
  tasks:
    - name: Add user
      user:
        name: test3
        state: absent
        remove: yes

但是在使用这个 user 模块时,需要注意权限问题。

shell 模块

在远程节点上通过 /bin/sh 执行命令。如果一个命令可以通过模块 yumcopy 模块实现时,那么建议不要使用 shell 或者 command 这样通用的命令模块。因为通用的命令模块不会根据具体操作的特点进行状态判断,所以当没有必要再重新执行的时候,它还是会重新执行一遍。

  • 支持 <>|;&

    --- 
    - hosts: server1
      tasks:
        - name: Test shell

- 调用脚本
---

- hosts: server1
  tasks:
    - shell: ~/test.sh >> somelog.txt
```

在执行命令之前,我们可以改变工作目录,并且仅在文件 somelog.txt 不存在时执行命令,除此之外,还可以指定用 bash 运行命令:```
---

- hosts: server1
  tasks:
    - shell: ~/test.sh >> somelog.txt
      args:
        chdir: ~/testDir
        creates: somelog.txt
        executable: /bin/bash
```

command 模块

在远程节点上执行命令。和 shell 模块类似,但不支持 <>|;&等操作,其它的大抵都是相似的。

总结

Ansible 提供了非常多的常用模块,我们可以使用 ansible-doc -l 命令查看这些模块。这篇文章只是总结了几个用的频率更高一点的,对于这里总结的常用模块,我们需要做到“手到擒来”,熟练到上手就能写的地步,大家需要在理解的基础上,多上手写,多练习。在今后的工作中多用这些常用的模块来提升自己的工作效率。

夜,又静了!

2019 年 9 月 29 日,于内蒙古呼和浩特。


退出移动版