Ansible纸上谈兵02:自动化部署时可能用到的模块

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
云数据库 Tair(兼容Redis),内存型 2GB
简介: Ansible纸上谈兵02:自动化部署时可能用到的模块

背景


这里以 ad-hoc 命令的方式介绍下 Ansible 经常用到的模块。 Ansible 已经具备丰富的模块生态,我们可以借助 Ansible 的模块完成日常在 Linux 操作系统上的运维工作。


一般常用的模块有:


  • 执行命令


command(默认)  shell


Note: command , shell 本质上执行的都是基础命令(区别在于 command 模块不支持管道命令)


  • 管理安装包

yum

  • 管理文件

file copy get_url

  • 管理服务

service

  • 管理用户

group user

  • 管理定时任务

cron


主机清单


主机清单配置与上一篇Ansible纸上谈兵01:认识一下Ansible文章中的一致,并对其进行分组(1个控制端,3个web服务,1个数据库服务,1个缓存服务)。

# Ansible默认的配置文件位于/etc/ansible/hosts
[root@ecs-kunpeng-0001 ~]# vim /etc/ansible/hosts
# 配置以下内容
[controller]
192.168.0.6
[web]
192.168.0.53
192.168.0.39
192.168.0.46
[db]
192.168.0.235
[cache]
192.168.0.166


ad-hoc


  • ad-hoc 命令语法格式:

ansible [一般为主机清单] -m [模块] -a [模块选项]

所谓的 ad-hoc ,是指每次执行一条命令,类似于 Shell 命令行的交互式脚本。


  • 查看模块使用文档语法格式:
    ansible-doc [模块]


不用看其他书籍,关键是学会查看文档(可直接定位到Example查看示例),eg: ansible-doc yum


执行命令


# 指定一个组,执行命令
[root@ecs-kunpeng-0001 ~]# ansible cache -m ping 
192.168.0.166 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
# 指定多个组(db组、cache组),执行命令
[root@ecs-kunpeng-0001 ~]# ansible db:cache -m ping 
192.168.0.166 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.0.235 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
# command模块执行管道操作时报语法错误
[root@ecs-kunpeng-0001 ~]# ansible cache -m command -a "ps aux|grep redis"
192.168.0.166 | FAILED | rc=1 >>
error: unsupported option (BSD syntax)
Usage:
 ps [options]
 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.
For more details see ps(1).non-zero return code
# shell模块可以执行管道操作
[root@ecs-kunpeng-0001 ~]# ansible cache -m shell -a "ps aux|grep redis"
192.168.0.166 | CHANGED | rc=0 >>
systemd+   75292  0.1  0.0 136256  6080 ?        Ssl  4月16 100:18 redis-server *:6379
root     1292536  0.0  0.0 214464  1728 pts/0    S+   21:59   0:00 /bin/sh -c ps aux|grep redis
root     1292538  0.0  0.0 214080  1536 pts/0    S+   21:59   0:00 grep redis
root     1848214  0.0  0.1 1298368 7488 ?        Ssl  5月20   1:11 ./bin/redis-server *:6380

Note:


  • 如果不指定模块,则默认采用command模块;


  • 基础的Linux命令,都可以通过commandshell模块执行,区别在于command模块不支持管道命令。


管理安装包


# 安装当前最新的Apache软件
[root@ecs-kunpeng-0001 ~]# ansible cache -m yum -a "name=httpd state=latest"
192.168.0.166 | SUCCESS => {
    "ansible_facts": {
        "pkg_mgr": "dnf"
    },
    "changed": false,
    "msg": "Nothing to do",
    "rc": 0,
    "results": []
}
# 通过公网URL安装rpm软件
[root@ecs-kunpeng-0001 ~]# ansible cache -m yum -a "name=https://mirrors.huaweicloud.com/openeuler/openEuler-20.03-LTS/everything/aarch64/Packages/httpd-2.4.34-15.oe1.aarch64.rpm state=latest"
# 通过本地包安装rpm软件
[root@ecs-kunpeng-0001 ~]# ansible cache -m yum -a "name=/tmp/package.rpm state=present"  
# 卸载删除httpd软件
[root@ecs-kunpeng-0001 ~]# ansible cache -m yum -a "name=httpd state=absent"


管理文件


file copy get_url


  • file:创建文件、目录,授权模块
# 创建文件,并设定属主、属组、权限
[root@ecs-kunpeng-0001 ~]# ansible cache -m file -a "path=/var/www/html/index.html state=touch owner=apache group=apache mode=644"
192.168.0.166 | CHANGED => {
    "changed": true,
    "dest": "/var/www/html/index.html",
    "gid": 48,
    "group": "apache",
    "mode": "0644",
    "owner": "apache",
    "size": 0,
    "state": "file",
    "uid": 48
}
# 创建目录,并设定属主、属组、权限
[root@ecs-kunpeng-0001 ~]# ansible cache -m file -a "path=/var/www/html/dir state=directory owner=apache group=apache mode=755"
192.168.0.166 | CHANGED => {
    "changed": true,
    "gid": 48,
    "group": "apache",
    "mode": "0755",
    "owner": "apache",
    "path": "/var/www/html/dir",
    "size": 4096,
    "state": "directory",
    "uid": 48
}
# 通过shell模块验证下是否创建了文件与目录
[root@ecs-kunpeng-0001 ~]# ansible cache -m shell -a "ls -l /var/www/html"
192.168.0.166 | CHANGED | rc=0 >>
总用量 4
drwxr-xr-x 2 apache apache 4096  5月 21 22:20 dir
-rw-r--r-- 1 apache apache    0  5月 21 22:17 index.html
  • copy:文件传输模块
# 将本地的file.txt文件推送到远端服务
[root@ecs-kunpeng-0001 ~]# ansible cache -m copy -a "src=./file.txt dest=/var/www/html/file.txt owner=root group=root mode=644"
192.168.0.166 | CHANGED => {
    "changed": true,
    "checksum": "d4d55684a3d4d6a3c31c36f788f01f30d0d22d02",
    "dest": "/var/www/html/file.txt",
    "gid": 0,
    "group": "root",
    "md5sum": "1ae9367e28d7d3173e93a92d09e76708",
    "mode": "0644",
    "owner": "root",
    "size": 25,
    "src": "/root/.ansible/tmp/ansible-tmp-1621607368.0554242-3109318-111286480082069/source",
    "state": "file",
    "uid": 0
}
# 往远程的主机文件中写入内容
[root@ecs-kunpeng-0001 ~]# ansible cache -m copy -a "content=writesomething.. dest=/var/www/html/file.txt"
192.168.0.166 | CHANGED => {
    "changed": true,
    "checksum": "dd3c25def1f5204fd618a0a3346b68feac393c1e",
    "dest": "/var/www/html/file.txt",
    "gid": 0,
    "group": "root",
    "md5sum": "b30d3b6c1a4327a291e271d7e502247e",
    "mode": "0644",
    "owner": "root",
    "size": 16,
    "src": "/root/.ansible/tmp/ansible-tmp-1621607386.0447457-3110984-150399809437238/source",
    "state": "file",
    "uid": 0
}
# 通过shell模块验证下是否创建了文件与目录
[root@ecs-kunpeng-0001 ~]# ansible cache -m shell -a "cat /var/www/html/file.txt"
192.168.0.166 | CHANGED | rc=0 >>
writesomething..
  • get_url:下载文件模块
# 下载互联网的软件至本地,url支持http, https, ftp,这里以之前中招的挖矿病毒脚本为例测试下载
[root@ecs-kunpeng-0001 ~]# ansible cache -m get_url -a "url=http://45.9.148.37/cf67356a3333e6999999999/init.sh dest=/var/www/html/"
192.168.0.166 | CHANGED => {
    "changed": true,
    "checksum_dest": null,
    "checksum_src": "1bf6b644228a468e6f90643d7a5efdd447dd169d",
    "dest": "/var/www/html/init.sh",
    "elapsed": 0,
    "gid": 0,
    "group": "root",
    "md5sum": "179fd51fe6b061e8b54b0f3ca2e8bd26",
    "mode": "0600",
    "msg": "OK (37907 bytes)",
    "owner": "root",
    "size": 37907,
    "src": "/root/.ansible/tmp/ansible-tmp-1621607722.632395-3141898-83452532208350/tmpbt07hddb",
    "state": "file",
    "status_code": 200,
    "uid": 0,
    "url": "http://45.9.148.37/cf67356a3333e6999999999/init.sh"
}
# 验证是否下载成功init.sh
[root@ecs-kunpeng-0001 ~]# ansible cache -m shell -a "ls -l /var/www/html"
192.168.0.166 | CHANGED | rc=0 >>
总用量 48
drwxr-xr-x 2 apache apache  4096  5月 21 22:20 dir
-rw-r--r-- 1 root   root      16  5月 21 22:29 file.txt
-rw-r--r-- 1 apache apache     0  5月 21 22:17 index.html
-rw------- 1 root   root   37907  5月 21 22:35 init.sh
# 使用默认命令模块删除文件时,有个警告,并建议使用file模块来操作文件的删除。
[root@ecs-kunpeng-0001 ~]# ansible cache -a "rm /var/www/html/init.sh"
[WARNING]: Consider using the file module with state=absent rather than running 'rm'.  If you
need to use command because file is insufficient you can add 'warn: false' to this command
task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.0.166 | CHANGED | rc=0 >>
# 使用file模块删除文件
[root@ecs-kunpeng-0001 ~]# ansible cache -m file -a "path=/var/www/html/file.txt state=absent"
192.168.0.166 | CHANGED => {
    "changed": true,
    "path": "/var/www/html/file.txt",
    "state": "absent"
}
# 验证是否已经删除了init.sh以及file.txt
[root@ecs-kunpeng-0001 ~]# ansible cache -m shell -a "ls -l /var/www/html"
192.168.0.166 | CHANGED | rc=0 >>
总用量 4
drwxr-xr-x 2 apache apache 4096  5月 21 22:20 dir
-rw-r--r-- 1 apache apache    0  5月 21 22:17 index.html


管理服务


# 启动httpd服务
[root@ecs-kunpeng-0001 ~]# ansible cache -m service -a "name=httpd state=started"
192.168.0.166 | CHANGED => {
    "changed": true,
    "name": "httpd",
    "state": "started",
    "status": {
        "ActiveEnterTimestampMonotonic": "0",
        "ActiveExitTimestampMonotonic": "0",
        ...
# 停止httpd服务
[root@ecs-kunpeng-0001 ~]# ansible cache -m service -a "name=httpd state=stopped"
# 重启httpd服务
[root@ecs-kunpeng-0001 ~]# ansible cache -m service -a "name=httpd state=restarted"
# 启动httpd服务,并加入开机自启
[root@ecs-kunpeng-0001 ~]# ansible cache -m service -a "name=httpd state=started enabled=yes"


管理用户


  • group: 分组模块
# 创建grpone基本组,指定uid为1234
[root@ecs-kunpeng-0001 ~]# ansible cache -m group -a "name=grpone gid=1234 state=present"
192.168.0.166 | CHANGED => {
    "changed": true,
    "gid": 1234,
    "name": "grpone",
    "state": "present",
    "system": false
}
# 创建grptwo系统组,指定uid为5678
[root@ecs-kunpeng-0001 ~]# ansible cache -m group -a "name=grptwo gid=5678 system=yes state=present"
192.168.0.166 | CHANGED => {
    "changed": true,
    "gid": 5678,
    "name": "grptwo",
    "state": "present",
    "system": true
}
# 删除grpone基本组
[root@ecs-kunpeng-0001 ~]# ansible cache -m group -a "name=grpone state=absent"
192.168.0.166 | CHANGED => {
    "changed": true,
    "name": "grpone",
    "state": "absent"
}
  • user: 用户模块
# 创建heartsuit用户,组是docker
[root@ecs-kunpeng-0001 ~]# ansible cache -m user -a "name=heartsuit group=docker"
192.168.0.166 | CHANGED => {
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": 989,
    "home": "/home/heartsuit",
    "name": "heartsuit",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 1000
}
# 删除用户
[root@ecs-kunpeng-0001 ~]# ansible cache -m user -a "name=heartsuit state=absent"
192.168.0.166 | CHANGED => {
    "changed": true,
    "force": false,
    "name": "heartsuit",
    "remove": false,
    "state": "absent"
}


管理定时任务


# 添加定时任务:每隔2分钟执行一次date >> /var/www/html/date.txt
[root@ecs-kunpeng-0001 ~]# ansible cache -m cron -a "name=job-datetime minute=*/2 job='date >> /var/www/html/date.txt'"
192.168.0.166 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "job-datetime"
    ]
}
# 验证是否生成了定时任务
[root@ecs-kunpeng-0001 ~]# ansible cache -m shell -a "crontab -l"
192.168.0.166 | CHANGED | rc=0 >>
#Ansible: job-datetime
*/2 * * * * date >> /var/www/html/date.txt
# 验证定时任务是否执行
[root@ecs-kunpeng-0001 ~]# ansible cache -m shell -a "cat /var/www/html/date.txt"
192.168.0.166 | CHANGED | rc=0 >>
Fri May 21 22:42:01 CST 2021
Fri May 21 22:44:01 CST 2021
Fri May 21 22:46:01 CST 2021
# 关闭定时任务
[root@ecs-kunpeng-0001 ~]# ansible cache -m cron -a "name=job-datetime minute=*/2 job='date >> /var/www/html/date.txt' disabled=yes"
192.168.0.166 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "job-datetime"
    ]
}
# 验证是否关闭定时任务,这里的结果是把定时任务配置注释了
[root@ecs-kunpeng-0001 ~]# ansible cache -m shell -a "crontab -l"192.168.0.166 | CHANGED | rc=0 >>
#Ansible: job-datetime
#*/2 * * * * date >> /var/www/html/date.txt

借助 Ansible 这些常用模块,执行基本的命令,可以实现对服务集群的简单管理;如果需要执行稍微复杂的运维任务,则可以通过 Playbook 来完成。


相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
11天前
|
运维 应用服务中间件 网络安全
自动化运维的新篇章:使用Ansible进行服务器配置管理
【10月更文挑战第34天】在现代IT基础设施的快速迭代中,自动化运维成为提升效率、确保一致性的关键手段。本文将通过介绍Ansible工具的使用,展示如何实现高效的服务器配置管理。从基础安装到高级应用,我们将一步步揭开自动化运维的神秘面纱,让你轻松掌握这一技术,为你的运维工作带来革命性的变化。
|
6天前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。
|
9天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
30 4
|
8天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible在配置管理中的应用
【10月更文挑战第37天】本文将深入探讨如何利用Ansible简化和自动化复杂的IT基础设施管理任务。我们将通过实际案例,展示如何用Ansible编写可重用的配置代码,以及这些代码如何帮助运维团队提高效率和减少人为错误。文章还将讨论如何构建Ansible playbook来自动部署应用、管理系统更新和执行常规维护任务。准备好深入了解这个强大的工具,让你的运维工作更加轻松吧!
23 2
|
9天前
|
运维 Devops 应用服务中间件
自动化运维的利器:Ansible实战指南
【10月更文挑战第36天】在快速迭代的数字时代,自动化运维成为提升效率、减少错误的关键。Ansible以其简洁性、易用性和强大的功能脱颖而出。本文将带你了解Ansible的核心组件,通过实际案例深入其应用,并探讨如何结合最佳实践优化你的自动化工作流程。无论你是新手还是有经验的运维人员,本指南都将为你提供宝贵的知识和技能。
|
9天前
|
运维 应用服务中间件 Linux
自动化运维:使用Ansible进行批量配置管理
【10月更文挑战第36天】在现代的IT基础设施中,高效和可靠的系统管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具来简化运维任务,包括安装、配置、部署应用程序以及管理系统更新。我们将探讨Ansible的核心概念,并通过实际代码示例展示其应用。通过阅读本文,读者将获得使用Ansible改善日常运维工作流程的实用知识。
|
13天前
|
运维 负载均衡 Ubuntu
自动化运维的利器:Ansible入门与实践
【10月更文挑战第31天】在当今快速发展的信息技术时代,高效的运维管理成为企业稳定运行的关键。本文将引导读者了解自动化运维工具Ansible的基础概念、安装步骤、基本使用,以及如何通过实际案例掌握其核心功能,从而提升工作效率和系统稳定性。
|
22天前
|
缓存 运维 应用服务中间件
自动化运维的新篇章:使用Ansible进行配置管理
【10月更文挑战第23天】随着云计算和微服务架构的兴起,传统的手动运维方式已经无法满足现代IT基础设施的需求。自动化运维成为提升效率、减少错误的关键。本文将介绍如何使用Ansible,一个流行的开源自动化工具,来简化配置管理和部署流程。我们将从基础概念出发,逐步深入到实战应用,展示如何通过编写Playbook来实现服务器的自动化配置和管理。
|
19天前
|
运维 应用服务中间件 调度
自动化运维:使用Ansible实现服务器批量管理
【10月更文挑战第26天】在当今快速发展的IT领域,自动化运维已成为提升效率、降低人为错误的关键技术手段。本文通过介绍如何使用Ansible这一强大的自动化工具,来简化和加速服务器的批量管理工作,旨在帮助读者理解自动化运维的核心概念和实践方法。文章将围绕Ansible的基础使用、配置管理、任务调度等方面展开,通过实际案例引导读者深入理解自动化运维的实现过程,最终达到提高运维效率和质量的目的。
|
24天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【10月更文挑战第21天】在现代IT基础设施的管理中,自动化运维已成为提升效率、降低错误率的关键。Ansible,作为一种简单而强大的自动化工具,正被广泛应用于配置管理、应用部署和任务自动化等领域。本文将引导你了解Ansible的基本概念,通过实际案例展示如何利用Ansible简化日常运维工作,并探讨其在现代IT运维中的应用价值。无论你是新手还是有经验的系统管理员,这篇文章都将为你开启Ansible的高效之旅提供指导。