Ansible 常用的几大模块-使用方法


一、Ansible模块

  1. conmand&shell模块
  2. script模块
  3. copy模块
  4. yum模块
  5. systend模块
  6. group模块
  7. user模块
  8. file模块
  9. cron模块
  10. debug模块
  11. lineinfile模块
  12. 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模块的知识,请阅读官方文档。

猜你喜欢

转载自blog.csdn.net/weixin_52099680/article/details/113678930