一、Ansible模块
- conmand&shell模块
- script模块
- copy模块
- yum模块
- systend模块
- group模块
- user模块
- file模块
- cron模块
- debug模块
- lineinfile模块
- ini_file模块
二、模块使用
1. conmand&shell模块
两个模块都是在远程服务器上去执行命令。
但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名字则默认使用此模块。
#example
# ansible all -i hosts -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
# ansible all -i hosts -m shell -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
两个模块的区别:
shell模块可以执行shell的内置命令和特性(比如管道符)
command模块无法执行shell的内置命令和特性
2. script模块
将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行。
# cat /root/a.sh #ansible管理节点上的一个脚本
touch /tmp/testfile
# ansible webservers -i hosts -m script -a "/root/a.sh"
#对hosts资产清单中的webserver组进行管理
172.18.0.4 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.18.0.4 closed.\r\n",
"stderr_lines": [
"Shared connection to 172.18.0.4 closed."
],
"stdout": "",
"stdout_lines": []
}
3. copy模块
copy 模块的主要用于管理节点和被管理节点之间的文件拷贝。
常用参数:
-
src 指定拷贝文件的源地址
-
dest 指定拷贝文件的目标地址
-
owner 指定新拷贝文件的所有者
-
group 指定新拷贝文件的所有组
-
mode 指定新拷贝文件的权限
-
backup 拷贝文件前,若原目标文件发生了变化,则对目标文件进行备份
#copy 管理节点上的 `nginx.repo` 到被管理节点上
# cat nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
#ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
#copy 前, 对被管理节点上原文件进行备份
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
#copy 文件的同时对文件进行用户及用户组设置
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"
#copy 文件的同时对文件进行权限设置
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"
4. yum模块
- 等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进行管理。
-
常用参数:
- name 要安装的软件包名, 多个软件包以英文逗号(,) 隔开
- state 对当前指定的软件安装、移除操作(present installed latest absent removed)
支持的参数 - present 确认已经安装,但不升级
- installed 确认已经安装
- latest 确保安装,且升级为最新
- absent 和 removed 确认已移除
#安装一个软件包
# ansible webservers -i hosts -m yum -a "name=nginx state=present"
# ansible webservers -i hosts -m yum -a "name=nginx state=installed"
# ansible webservers -i hosts -m yum -a "name=nginx state=latest"
#移除一个软件包
# ansible webservers -i hosts -m yum -a "name=nginx state=absent"
# ansible webservers -i hosts -m yum -a "name=nginx state=removed"
!#安装一个软件包组
# ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
5. systemd模块
Centos6 之前的版本使用 service
模块。
请使用 ansible-doc service
命令自行查看帮助信息。
-
常用参数:
- daemon_reload 重新载入 systemd,扫描新的或有变动的单元
- enabled 是否开机自启动 yes|no
- name 必选项,服务名称 ,比如 httpd vsftpd
- state 对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
#重新加载systemd
# ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
#启动nginx服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=started"
#关闭nginx服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
#重启nginx服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
#重新加载nginx服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
#jiangnginx设置为开机启动
# ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"
6. group模块
在被管理节点上,对组进行管理。
-
常用参数:
- name 组名称, 必须的
- system 是否为系统组, yes/no , 默认是 no
- state 删除或这创建,present/absent ,默认是present
#创建普通组 db_admin
# ansible dbservers -i hosts -m group -a "name=db_admin"
7.user 模块
用于在被管理节点上对用户进行管理。
-
常用参数:
-
name 必须的参数, 指定用户名
-
password 设置用户的密码,这里接受的是一个加密的值,因为会直接存到 shadow, 默认不设置密码
-
create_home 在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为 no。2.5版本之前使用 createhome
-
group 设置用户的主组
-
groups 将用户加入到多个其他组中,多个用逗号隔开。
默认会把用户从其他已经加入的组中删除。 -
append 可选值:
yes
|no
, 需要和 groups 配合使用,yes 时,不会把用户从其他已经加入的组中删除 -
state 删除或添加用户, present 为添加,absent 为删除;默认值 present
-
remove 当与
state=absent
一起使用,删除一个用户及关联的目录,比如家目录,邮箱目录。可选的值为:yes
或者no
-
#先生成加密密码
# pass=$(echo "123456" | openssl passwd -1 -stdin)
#执行命令,创建用户foo,并设置密码
# ansible all -i hosts -m user -a "name=foo password=${pass} state=present"
#创建用 tom, 并且加入到组 db_admin 中, 不改变用户原有加入的组。
# ansible dbservers -i hosts -m user -a "name=tom groups=db_admin append=yes"
date 命令说明
// 计算 3 小时之后是几点几分
# date +%T -d '3 hours'
// 任意日期的前 N 天,后 N 天的具体日期
# date +%F -d "20190910 1 day"
# date +%F -d "20190910 -1 day"
// 计算两个日期相差天数, 比如计算生日距离现在还有多少天
# d1=$(date +%s -d 20180728)
# d2=$(date +%s -d 20180726)
# echo $(((d1-d2)/86400))
8.file模块
file 模块主要用于远程主机上的文件操作。
-
常用参数:
-
owner 定义文件/目录的属主
-
group 定义文件/目录的属组
-
mode 定义文件/目录的权限
-
path 必选项,定义文件/目录的路径
-
recurse 递归的设置文件的属性,只对目录有效
yes
或者no
-
src 链接(软/硬)文件的源文件路径,只应用于state=link的情况
-
dest 链接文件的路径,只应用于state=link的情况
-
state
-
directory 如果目录不存在,创建目录,比如:
state=directory
-
file 文件不存在,则不会被创建,存在则返回文件的信息, 常用于检查文件是否存在。
-
link 创建软链接
-
hard 创建硬链接
-
touch 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
-
absent 删除目录、文件或者取消链接文件
-
-
// 创建一个文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
// 改变文件所有者及权限
# ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 创建一个软连接
# ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 创建一个目录
# ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
// 取消一个连接
# ansible all -i hosts -m file -a "path=/tmp/link.conf state=absent"
// 删除一个文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"
9.cron 模块
管理远程节点的CRON 服务。等同于Linux 中的 计划任务。
注意:使用 Ansible 创建的计划任务,是不能使用本地
crontab -e
去编辑,否则 Ansible 无法再次操作此计划任务了。
- 常用参数:
- name 指定一个cron job 的名字。一定要指定,便于日之后删除。
- minute 指定分钟,可以设置成(0-59, *, */2 等)格式。 默认是 * , 也就是每分钟。
- hour 指定小时,可以设置成(0-23, *, */2 等)格式。 默认是 * , 也就是每小时。
- day 指定天, 可以设置成(1-31, *, */2 等)格式。 默认是 * , 也就是每天。
- month 指定月份, 可以设置成(1-12, *, */2 等)格式。 默认是 * , 也就是每周。
- weekday 指定星期, 可以设置成(0-6 for Sunday-Saturday, * 等)格式。默认是 *,也就是每星期。
- job 指定要执行的内容,通常可以写个脚本,或者一段内容。
- state 指定这个job的状态,可以是新增(present)或者是删除(absent)。 默认为新增(present)
// 新建一个 CRON JOB 任务
# ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
// 删除一个 CRON JOB 任务,删除时,一定要正确指定job 的name参数,以免误删除。
# ansible all -i hosts -m cron -a "name='create new job' state=absent"
#登录任何一台管理机验证cron
# crontab -l
#Ansible: create new job
0 * * * * ls -alh > /dev/null
10. debug模块
debug 模块主要用于调试时使用,通常的作用是将一个变量的值给打印出来。
-
常用参数:
- var 直接打印一个指定的变量的值
- msg 打印一段可以格式化的字符串
#这里是打印出每台主机在 资产清单中的名称,可能是 IP,也可能是 主机名
#清单中写什么这里就会显示什么。
#这里 `inventory_hostname` 就是 ansible 内置的一个变量。
# ansible all -i hosts -m debug -a "var=inventory_hostname"
# ansible all -i hosts -m debug -a "msg='role is {{inventory_hostname}} '"
11.lineinfile 模块
在被管理节点上,用正则匹配的方式对目标文件的一行内容修改删除等操作。
如果是在一个文件中把所有匹配到的多行都进行统一处理,请参考replace 模块。
如果想对一个文件进行一次性添加/更新/删除连续多行内容等操作,参考blockinfile模块
-
常用参数
-
path 被管理节点的目标文件路径, 必须。
-
state 可选值absent 删除 |present 替换(默认值)。
-
regexp 在文件的每一行中查找的正则表达式。
-
对于 state=present ,仅找到的最后一行将被替换。
-
line 要在文件中插入/替换的行。需要
state=present
。 -
create 文件不存在时,是否要创建文件并添加内容。yes/no
-
#删除被控节点文件里的某一条内容
# ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
#替换某一行
# ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
12. ini_file 模块
对 ini 风格的配置文件进行修改。
- 常用参数
- path 目标文件路径
- block 文件中被操作的块内容
- state 块内容如何处理,absent 删除, present 添加/更新(默认值)
# ansible all -i hosts -m ini_file -a "path=/root/a.conf section=mysqld option=port value=3306"
#假如存在,则修改
# ansible all -i hosts -m ini_file -a "path=/root/a.conf section=mysqld option=port value=3307"
#验证
# cat a.conf
[mysqld]
port = 3307
# 再添加一个
# 验证ansible all -i hosts -m ini_file -a "path=/root/a.conf section=mysqld option=enable value='1'"
# 验证
# cat a.conf
[mysqld]
port = 3307
enable = 1
总结
在实际关于ansible模块的操作上,我们通常过结合playbook一起使用。如果想要学习更多关于ansible模块的知识,请阅读官方文档。