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 执行命令. 如果一个命令可以通过模块 yum,copy 模块实现时, 那么建议不要使用 shell 或者 command 这样通用的命令模块. 因为通用的命令模块不会根据具体操作的特点进行状态判断, 所以当没有必要再重新执行的时候, 它还是会重新执行一遍.
支持<,>,|,; 和 &
- ---
- - hosts: server1
- tasks:
- - name: Test shell
- shell: echo "test1"> ~/testDir/test1 && echo "test2"> ~/testDir/test2
调用脚本
- ---
- - 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 日, 于内蒙古呼和浩特.
来源: https://www.cnblogs.com/vipygd/p/11625142.html