Linux服务器教程之十四Ansible进阶之常见模块

举报
tea_year 发表于 2025/01/21 07:14:13 2025/01/21
270 0 0
【摘要】 Ansible 是一种 IT 自动化工具。它可以配置系统,部署软件以及协调更高级的 IT 任务, 例如持续部署,滚动更新。Ansible 适用于管理企业 IT 基础设施,从具有少数主机的小规 模到数千个实例的企业环境。Ansible 也是一种简单的自动化语言,可以完美地描述 IT 应 用程序基础结构

Ansible?

**Ansible 是一款开源的自动化工具,广泛应用于配置管理、应用部署、任务自动化以及多节点管理等领域。**它由 Michael DeHaan 于 2012 年创建,ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

任务

        掌握Ansible常见的模块

ansible模块⭐⭐⭐⭐⭐⭐⭐

总目录模块(https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin)

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

ansible支持的模块非常的多,我们并不需要把每个模块都记住,而只需要熟悉一些常见的模块,其它的模块在需要用到时再查询即可。

查看所有支持的模块

 # 该命令会显示已安装的Ansible模块及其相关信息,例如模块名称、适用的Ansible版本等。
 ansible-doc -l      
 ​
 如果要查看ping模块的用法,使用下面命令(其它模块以此类推)
 # ansible-doc ping

command与shell模块

两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。

shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)

 ansible all -m command -a 'hostname'
 ansible all  -a 'hostname'
 ​
 ansible all -m command -a 'ls /tmp'
 ansible all -a 'rm -rf /tmp/*'
 ​
 ansible all -m command -a 'ls /tmp'--# -m shell shell指令;
 ansible all -m shell  -a 'rm -rf  /tmp/*'
 ansible all -m command -a 'ls /tmp'
 ​
 m1# ansible -m command web -a "cat /etc/passwd |wc -l"      --报错
 m1# ansible -m shell web -a "cat /etc/passwd |wc -l"        --成功
 ​
 m1# ansible -m command web -a "cd $HOME;pwd"      --报错
 m1# ansible -m shell  web -a "cd $HOME;pwd"   --成功

注意: shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好。

hostname模块

hostname模块用于修改主机名(注意: 它不能修改/etc/hosts文件)

将其中一远程机器主机名修改为my.cluster.com

 m1# ansible 目标机ip  -m hostname -a 'name=my.cluster.com'
 语法: ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2"

script模块

script模块用于在远程机器上执行本地脚本。

 在m1上准备一个脚本
 m1# vim /server/scripts/ansible-scripts.sh
 ​
 #!/bin/bash
 hostname 
 hostname -I 
 uptime 
 whoami 
 date +%F
 ​
 在all组的远程机器里都执行(此脚本不用给执行权限)
 m1# ansible all -m script -a '/server/scripts/ansible-scripts.sh'

扩展: 使用shell脚本实现在db的被管理机里的mariadb里创建一个abc库

 #!/bin/bash
 #!/bin/bash
 ​
 systemctl start mariadb
 ​
 mysql -uroot -p123456 -e "create database abc";
 #把上面的脚本使用script模块在db被管理机里执行即可
 ansible -m script db -a '/server/scripts/ansible-crdb.sh' 

file模块(⭐⭐⭐⭐⭐⭐)

file模块用于对文件相关的操作(创建, 删除, 软硬链接等)

创建一个目录

 m1# ansible all -m file -a 'path=/test state=directory'

创建一个文件

 m1# ansible all -m file -a 'path=/test/111 state=touch'

递归修改owner,group,mode

 m1# ansible all -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'

删除目录(连同目录里的所有文件)

 m1# ansible all -m file -a 'path=/test state=absent'

创建文件并指定owner,group,mode等

 m1# ansible all -m file -a 'path=/tmp/111 state=touch owner=bin group=daemon mode=1777'

删除文件absent:缺席!!!

 m1# ansible all -m file -a 'path=/tmp/111 state=absent'

创建软链接文件

 m1# ansible all -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'

创建硬链接文件

 m1# ansible all -m file -a 'src=/etc/fstab path=/tmp/fstab2 state=hard'

stat模块(了解)

stat模块类似linux的stat命令,用于获取文件的状态信息。

获取/etc/fstab文件的状态信息

 m1# ansible all -m stat -a 'path=/etc/fstab'

copy模块(重点)⭐⭐⭐⭐⭐⭐

copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)

在m1上准备一个文件,拷贝此文件到all的所有机器上

 m1# echo master > /tmp/222
 m1# ansible all -m copy -a 'src=/tmp/222 dest=/tmp/333'

使用content参数直接往远程文件里写内容(会覆盖原内容)

 m1# ansible all -m copy -a 'content="ha ha\n" dest=/tmp/333'
 注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题

使用force参数控制是否强制覆盖

 如果目标文件已经存在,则不覆盖
 m1# ansible all -m copy -a 'src=/tmp/222 dest=/tmp/333 force=no'
 如果目标文件已经存在,则会强制覆盖
 m1# ansible all -m copy -a 'src=/tmp/222 dest=/tmp/333 force=yes'

使用backup参数控制是否备份文件

 backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
 all的机器上会将/tmp/333备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/333
 m1# ansible all -m copy -a 'src=/etc/fstab dest=/tmp/333 backup=yes owner=daemon group=daemon mode=1777'

copy模块拷贝时要注意拷贝目录后面是否带"/"符号

 /etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下
 m1# ansible all -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'
 /etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下
 m1# ansible all -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'

练习: 在m1上配置好所有的yum源,然后拷贝到all的远程机器上(要求目录内的内容完全一致)

 m1# ansible all -m file -a "path=/etc/yum.repos.d/ state=absent"
 m1# ansible all -m copy -a "src=/etc/yum.repos.d dest=/etc/"

练习: 使用hostname模块修改过主机名后.在m1上修改/etc/hosts文件,并拷贝到all的远程机器上

 先在m1上修改好/etc/hosts文件,然后使用下面命令拷贝过去覆盖
 m1# ansible all -m copy -a "src=/etc/hosts dest=/etc/hosts"

关于DNS的补充:

  • 域名为公网的唯一名字,主机名为内网的名字(可以重名,但最好不要这么做)

  • 目前自建DNS做域名解析已经很少了, 但可以通过DNS解析主机名来实现内网多台服务器的解析

  • 现在学了ansible的hostname与copy模块,轻松实现N多台服务器的主机名管理,DNS也不需要再搭建了

template模块(拓展)

与copy模块功能几乎一样.

template模块首先使用变量渲染 jinja2模板文件成普通文件,然后再复制过去.而copy模块不支持.(jinja2是一个基于python的模板引擎)

 m1# ansible -m template all -a "src=/etc/hosts dest=/tmp/hosts"

template模块不能拷贝目录

 m1# ansible -m template all -a "src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/"

fetch模块

fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。

第1步: 在两台被管理机上分别创建一个同名文件(但内容不同)

 agent1# echo agent1 > /tmp/1.txt
 agent2# echo agent2 > /tmp/1.txt

第2步: 从m1上fecth文件(因为all里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)

 m1# ansible all  -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
 10.1.1.12 | CHANGED => {
     "changed": true, 
     "checksum": "d2911a028d3fcdf775a4e26c0b9c9d981551ae41", 
     "dest": "/tmp/10.1.1.12/tmp/1.txt",     10.1.1.12的在这里
     "md5sum": "0d59da0b2723eb03ecfbb0d779e6eca5", 
     "remote_checksum": "d2911a028d3fcdf775a4e26c0b9c9d981551ae41", 
     "remote_md5sum": null
 }
 10.1.1.13 | CHANGED => {
     "changed": true, 
     "checksum": "b27fb3c4285612643593d53045035bd8d972c995", 
     "dest": "/tmp/10.1.1.13/tmp/1.txt",     10.1.1.13的在这里
     "md5sum": "cd0bd22f33d6324908dbadf6bc128f52", 
     "remote_checksum": "b27fb3c4285612643593d53045035bd8d972c995", 
     "remote_md5sum": null
 }

第3步: 先删除上面fetch过来的, 然后尝试只fetch其中一台机器的,也会使用名称来做子目录区分

 m1# rm /tmp/10.1.1.* -rf
 ​
 ​
 m1# ansible 10.1.1.12  -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
 10.1.1.12 | CHANGED => {
     "changed": true, 
     "checksum": "d2911a028d3fcdf775a4e26c0b9c9d981551ae41", 
     "dest": "/tmp/10.1.1.12/tmp/1.txt",     只fetch一个,也会这样命名
     "md5sum": "0d59da0b2723eb03ecfbb0d779e6eca5", 
     "remote_checksum": "d2911a028d3fcdf775a4e26c0b9c9d981551ae41", 
     "remote_md5sum": null
 }

注意: fetch模块不能从远程拷贝目录到本地

1724832213639.png


user模块

useradd userdel userdel -r

user模块用于管理用户账号和用户属性。

创建aaa用户,默认为普通用户,创建家目录

 m1# ansible all -m user -a ‘name=aaa state=present’

创建bbb系统用户,并且登录shell环境为/sbin/nologin

 m1# ansible all -m user -a ‘name=bbb state=present system=yes  shell="/sbin/nologin"

创建ccc用户, 使用uid参数指定uid, 使用password参数传密码

 m1# echo 123456 | openssl passwd -1 -stdin
 $1$DpcyhW2G$Kb/y1f.lyLI4MpRlHU9oq0
 ​
 下一句命令注意一下格式,密码要用双引号引起来,单引号的话验证时会密码不正确
 m1# ansible all -m user -a 'name=ccc uid=2000 state=present password="$1$DpcyhW2G$Kb/y1f.lyLI4MpRlHU9oq0"'

创建一个普通用户叫hadoop,并产生空密码密钥对

 m1# ansible all -m user -a 'name=hadoop generate_ssh_key=yes'

删除aaa用户,但家目录默认没有删除

 m1# ansible all -m user -a 'name=aaa state=absent'

删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录

 m1# ansible all -m user -a 'name=bbb state=absent remove=yes'

group模块

group模块用于管理用户组和用户组属性。

创建组

 m1# ansible all -m group -a 'name=groupa gid=3000 state=present'

删除组(如果有用户的gid为此组,则删除不了)

 m1# ansible all -m group -a 'name=groupa state=absent'

cron模块

cron模块用于管理周期性时间任务

创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。 如果minute,hour,day,month,week不指定的话,默认都为*

 m1# ansible all -m cron -a 'name="test cron1" user=root job="touch /tmp/111" minute=*/2' 

删除cron任务

 m1# ansible all -m cron -a 'name="test cron1" state=absent'

yum_repository模块

yum_repository模块用于配置yum仓库 repository。

增加一个/etc/yum.repos.d/local.repo配置文件

 m1# ansible all -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"
 注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱到/mnt目录
 # -m mount /dev/cdrom    /mnt

删除/etc/yum.repos.d/local.repo配置文件

 m1# ansible all -m yum_repository -a "name=local state=absent" 

1724836145958.png


yum模块(重点)

yum模块用于使用yum命令来实现软件包的安装与卸载。

使用yum安装一个软件(前提:all的机器上的yum配置都已经OK)

 m1# ansible all -m yum -a 'name=vsftpd state=present'

使用yum安装httpd,httpd-devel软件,state=latest表示安装最新版本

 m1# ansible all -m yum -a 'name=httpd,httpd-devel state=latest' 

使用yum卸载httpd,httpd-devel软件

 m1# ansible all -m yum -a 'name=httpd,httpd-devel state=absent' 

service|systemd模块⭐⭐⭐⭐⭐⭐

service模块用于控制服务的启动,关闭,开机自启动等。

https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module

启动vsftpd服务,并设为开机自动启动

 m1# ansible all -m systemd -a 'name=vsftpd state=started enabled=on'

关闭vsftpd服务,并设为开机不自动启动

 m1# ansible all -m systemd -a 'name=vsftpd state=stopped enabled=false'

enabled=on/off或true/false

练习

假设我主机清单里定义的all里有多台机器,它们现在要做一个集群。此集群要求实现一个名为hadoop的普通用户之间的两两免密登录,如何实现(要求只在m1上进行操作)?

总结

Ansible是一款开源的自动化运维工具,它能够帮助我们自动化地管理服务器的配置和部署应用。Ansible主要通过调用各种模块来完成任务。Ansible自带了很多模块,能够下发执行Ansible的各种管理任务。

模块可执行各种用例所需的 IT 功能,其中包括网络连接、置备、安全防护、云管理、用户管理、配置管理和通信。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。