Ansible的常用模块

ansible · 浏览次数 : 0

小编点评

ansible常用模块总结 Ansible 是一款流行的 IT 自动化工具,它可以帮助用户轻松地在多个主机上执行各种任务。本文将介绍一些常用的 Ansible 模块,包括 file、copy、yum_repository、yum、service、systemd、user、group、fetch 和 get_url 等。 1. file 模块 file 模块用于在远程主机上执行文件操作,如创建、删除、更新文件属性等。其选项包括 path(必选,定义文件/目录路径)、state(查看文件状态,默认,文件不存在会报错)、touch(创建文件,如果已存在则更新时间戳)、absent(删除文件/目录)等。 2. copy 模块 copy 模块用于将文件或目录从本地复制到远程主机。其选项包括 src(本地文件路径,必选)、dest(远程主机上的路径,必选)、force(覆盖目标文件时的选项)、backup(覆盖前备份原文件)、content(直接指定文件内容)等。 3. yum_repository 模块 yum_repository 模块用于配置和管理 yum 仓库。其选项包括 file(配置文件名)、reponame(yum 仓库名)、description(仓库描述)、baseurl(yum 仓库地址)、enabled(是否启用仓库)、gpgcheck(是否启用 gpg 检查)等。 4. yum 模块 yum 模块用于使用 yum 命令在远程主机上安装、卸载、更新软件包。其选项包括 name(软件包名)、state(安装、卸载、更新等)、latest(最新版本)等。 5. service 模块 service 模块用于管理远程主机上的服务。其选项包括 name(服务名)、state(启动、停止、重启等)、enabled(是否开机自启)等。 6. systemd 模块 systemd 模块用于管理远程主机上的 systemd 服务。其选项包括 name(服务名)、state(启动、停止、重启等)、enabled(是否开机自启)等。 7. user 模块 user 模块用于管理远程主机上的用户。其选项包括 name(用户名)、uid(用户 ID)、group(用户组)、shell(用户 shell 环境)、password(加密后的密码,必须指定)等。 8. group 模块 group 模块用于管理远程主机上的用户组。其选项包括 gid(组 ID)、name(组名)等。 9. fetch 模块 fetch 模块用于从远程主机收集文件。其选项包括 src(远程主机文件路径,必选)、dest(收集到的本地路径)等。 10. get_url 模块 get_url 模块用于从网络上下载文件。其选项包括 url(下载的 URL)、url_password / url_username(用于身份验证的用户名和密码)、dest(保存到本地的路径)、mode(权限设置)、owner(指定拥有者)、group(指定所属组)等。 通过以上介绍,相信读者对 Ansible 的常用模块有了基本的了解。在实际应用中,可以根据需要选择合适的模块进行自动化部署和管理。

正文

ansible常用模块

这些写的都是常用的模块,还有更多其他的模块可以自行查文档

模块的使用这里都使用Ad-Hoc的方式。playbook的方式后面会说

  • file 模块
  • copy 模块
  • yum_repository 模块
  • yum 模块
  • service 模块
  • systemd 模块
  • user 模块
  • group 模块
  • fetch 模块
  • get_url 模块

1. file模块

1.1 file模块的选项

file 模块主要用于远程主机上的文件操作,有一下选项

  • path:必选项,定义文件/目录的路径
  • state:
    • file:查看文件状态,默认选项,如果文件不存在会报错,并不会创建
    • touch:如果文件不存在,则创建,如果已经存在,会更新时间戳
    • absent:删除目录,文件,或取消软链接
    • directory:如果目录不存在,就创建目录
    • link:创建软链接
    • hard:创建硬链接
  • owner:定义文件/目录的拥有人
  • group:定义文件/目录的所属组
  • mode:定义文件的权限
  • src:要被链接的源文件的路径,只应用于state=link的时候
  • dest:被链接到的路径,只应用于state=link的时候

1.2 file模块的使用

1.2.1 使用file模块在远程主机创建文件

[ansible@master ansible]$ ansible all -m file -a "path=/tmp/file1 state=touch owner=ansible group=root mode=666"

192.168.200.210 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "dest": "/tmp/file1",
    "gid": 0,
    "group": "root",
    "mode": "0666",
    "owner": "ansible",
    "size": 0,
    "state": "file",
    "uid": 1000
}

使用path定义了文件的路径,state为touch,则为创建/更新时间戳,文件的拥有人是ansible,所属组是root,并且权限是666,那么我们来到远程主机来看看是不是这样

[ansible@master ansible]$ ansible all -m shell -a "ls -l /tmp/file1"
192.168.200.210 | CHANGED | rc=0 >>
-rw-rw-rw- 1 ansible root 0 Jun 20 13:38 /tmp/file1

可以看到,一切都是按照我们的想法来创建的

1.2.2 创建目录

[ansible@master ansible]$ ansible all -m file -a "path=/tmp/dire1 state=directory"

192.168.200.210 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/tmp/dire1",
    "size": 40,
    "state": "directory",
    "uid": 0
}

这次我们没有指定权限,拥有人,所属组那些,他就是按照默认的来创建的,通过回显可以看到group是root,owner是root,权限是755

1.2.3 删除文件/目录

[ansible@master ansible]$ ansible all -m file -a "path=/tmp/dire1 state=absent"
192.168.200.210 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "path": "/tmp/dire1",
    "state": "absent"
}

[ansible@master ansible]$ ansible all -m file -a "path=/tmp/file1 state=absent"
192.168.200.210 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "path": "/tmp/file1",
    "state": "absent"
}

在删除的时候,是不分目录还是文件的,只需要给定文件的路径就可以删除

2. copy模块

见名知意,就是拷贝文件到远程主机的

2.1 copy模块的选项

  • src: 本地的哪个文件需要复制到远程主机
    • 注意:如果目标是一个目录,他会递归复制,在这种情况下,如果路径是以 / 结尾,那么他会复制目录下的所有文件,如果不以 **/ **结尾的话,就会将本地目录原样的复制过去,类似于rsync
  • dest:必选项,要将源文件复制到远程主机的哪个路径
  • force:如果目标主机存在此文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制,默认为yes
  • backup:在覆盖之前将原文件备份
  • content:用于替代src,可以直接指定文件内容
  • remote_src:如果需要复制的文件在远程主机上而不在ansible的控制节点上使用这个,注意:他只是将src改为远程主机了,并不是从远程主机将文件复制到本地,而是将某个远程主机的文件复制到其他的远程节点

2.2 copy模块的使用

[ansible@master ansible]$ ansible all -m copy -a "src=./ansible.cfg dest=/tmp/ansible.cfg"
192.168.200.210 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "checksum": "b4eeb9b83b919c3f57d7e92dbde263a35713dca4",
    "dest": "/tmp/ansible.cfg",
    "gid": 0,
    "group": "root",
    "md5sum": "156467e44d3da8b3a40b2ca409f86ae8",
    "mode": "0644",
    "owner": "root",
    "size": 19974,
    "src": "/root/.ansible/tmp/ansible-tmp-1718863118.8950412-44119-223733622484954/source",
    "state": "file",
    "uid": 0
}

指定文件内容到远程主机

[ansible@master ansible]$ ansible all -m copy -a "content='hello,world' dest=/tmp/hello"
[ansible@master ansible]$ ansible all -m shell -a "cat /tmp/hello"
192.168.200.210 | CHANGED | rc=0 >>
hello,world

3. yum_repository模块

yum_repository是用来指定yum仓库的repo文件的

3.1 yum_repository的选项

  • file:配置文件的名字,不用包含repo
  • name:yum仓库的名字
  • description:仓库的描述信息
  • baseurl:yum仓库的地址
  • enabled:是否开启这个yum仓库
  • gpgcheck:是否开启gpg检查

3.2 yum_repository的使用

[ansible@master ansible]$ ansible all -m yum_repository -a "file=ansible name=AppStream baseurl=http://test.com enabled=1 gpgcheck=0 description='this is test repo file'"
192.168.200.210 | CHANGED => {
    "changed": true,
    "repo": "AppStream",
    "state": "present"
}

我们来到远程主机查看这个文件

[root@node1 tmp]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# ls
ansible.repo  kubernetes.repo  openEuler.repo

[root@node1 yum.repos.d]# cat ansible.repo 
[AppStream]
baseurl = http://test.com
enabled = 1
gpgcheck = 0
name = this is test repo file

这个模块相对比较简单,功能也比较单一

4. yum 模块

用来使用yum去安装软件包

4.1yum模块的选项

  • name:指定要安装的软件包的名字
  • state:指定动作
    • present:安装
    • latest:最新版本
    • absent:删除

4.2 yum模块的使用

删除nginx

[ansible@master ansible]$ ansible all -m yum -a "name=nginx state=absent"
192.168.200.210 | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "dnf"
    },
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Removed: nginx-1:1.21.5-6.oe2203sp3.x86_64",
        "Removed: nginx-all-modules-1:1.21.5-6.oe2203sp3.noarch",
        "Removed: nginx-mod-http-image-filter-1:1.21.5-6.oe2203sp3.x86_64",
        "Removed: nginx-mod-http-perl-1:1.21.5-6.oe2203sp3.x86_64",
        "Removed: nginx-mod-http-xslt-filter-1:1.21.5-6.oe2203sp3.x86_64",
        "Removed: nginx-mod-mail-1:1.21.5-6.oe2203sp3.x86_64",
        "Removed: nginx-mod-stream-1:1.21.5-6.oe2203sp3.x86_64"
    ]
}

安装httpd

[ansible@master ansible]$ ansible all -m yum -a "name=nginx state=present"
192.168.200.210 | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "dnf"
    },
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Installed: nginx-mod-http-xslt-filter-1:1.21.5-6.oe2203sp3.x86_64",
        "Installed: nginx-mod-mail-1:1.21.5-6.oe2203sp3.x86_64",
        "Installed: nginx-mod-stream-1:1.21.5-6.oe2203sp3.x86_64",
        "Installed: nginx-1:1.21.5-6.oe2203sp3.x86_64",
        "Installed: nginx-all-modules-1:1.21.5-6.oe2203sp3.noarch",
        "Installed: nginx-mod-http-image-filter-1:1.21.5-6.oe2203sp3.x86_64",
        "Installed: nginx-mod-http-perl-1:1.21.5-6.oe2203sp3.x86_64"
    ]
}

5. service模块

这个模块完全可以使用systemd来替代,有这个模块的原因是因为centos的早期版本是使用service xxx start 来管理服务的

5.1 service模块的选项

  • name:必选项,服务的名称
  • state:对当前服务执行的操作
  • enabled:是否开机自启

5.2 service模块的使用

[ansible@master ansible]$ ansible all -m service -a "name=nginx state=started enabled=yes"
192.168.200.210 | CHANGED => {
    "changed": true,
    "enabled": true,
    "name": "nginx",
    "state": "started",
    "status": {

输出信息过多,不在这里完全展示

6. systemd模块

6.1 systemd模块的选项

  • name:指定服务的名称
  • state:管理服务状态
    • started
    • restarted
    • stopped
    • reloaded
  • daemon_reload:当服务配置文件发生改变重载服务
  • enabled:是否开机自启

6.2 systemd模块的使用

[ansible@master ansible]$ ansible all -m systemd -a "name=nginx state=stopped enabled=no"
192.168.200.210 | CHANGED => {
    "changed": true,
    "enabled": false,
    "name": "nginx",
    "state": "stopped",

7. user模块

7.1 user模块的选项

  • name:指定用户名
  • state:创建还是删除
  • uid:指定用户uid
  • group:指定用户组
  • groups:指定用户的附加组
  • comment:用户的描述信息
  • create_home:是否给他创建home目录
  • home:home目录的路径,需要配合create_home一起使用
  • shell:指定用户的shell环境
  • password:指定用户的密码,这里必须给定加密过后的密码,如果直接将密码明文写在这是没有用的,登录不了
  • remove:删除用户时是否删除home目录,相当于userdel -r

7.2 user模块的使用

[ansible@master ansible]$ ansible all -m user -a "name=natasha uid=1234 groups=root shell=/sbin/nologin password=123"
[WARNING]: The input password appears not to have been hashed. The 'password'
argument must be encrypted for this module to work properly.
192.168.200.210 | CHANGED => {
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
    "groups": "root",
    "home": "/home/natasha",
    "name": "natasha",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/sbin/nologin",
    "state": "present",
    "system": false,
    "uid": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER"
}

注意,我在这里指定了password,并且就是明文指定的,他会有一个警告,说我们给定的密码不是一个hash过的值,说白了就是没有经过加密的密码,这个密码是无法使用的,你使用123 是无法登录这个用户的,当然我们指定的shell是/sbin/nologin,你正常指定shell也是不能

我们可以使用openssl来生成一个加密的密码

[ansible@master ansible]$ openssl passwd -6
Password: 
Verifying - Password: 
$6$b4Ug/ub0EPkyRE5x$oN.c5c2ah.Ej.Eo8s3F0q1E5t1/MHCFanZZivkJ8S2ZzE8fR2I2e7uYL5HgZ5CLwo1MGMhnHd2mmFxkN49Kq20

将输出的这一段放在password字段就可以了

用户的删除

[ansible@master ansible]$ ansible all -m user -a "name=natasha state=absent remove=yes"
192.168.200.210 | CHANGED => {
    "changed": true,
    "force": false,
    "name": "natasha",
    "remove": true,
    "state": "absent"
}

8. group模块

group模块是用来创建用户组的

8.1 group模块的选项

  • gid:指定组的gid
  • name:指定组名
  • state:创建还是删除组,选项
    • present
    • absent

8.2 group模块的使用

[ansible@master ansible]$ ansible all -m group -a "name=test gid=2024 state=present"
192.168.200.210 | CHANGED => {
    "changed": true,
    "gid": 2024,
    "name": "test",
    "state": "present",
    "system": false
}

# 删除组
[ansible@master ansible]$ ansible all -m group -a "name=test gid=2024 state=absent"
192.168.200.210 | CHANGED => {
    "changed": true,
    "name": "test",
    "state": "absent"
}

9. fetch模块

这个模块正好与copy模块相反,copy是将文件复制到远程,这个则是将远程文件收集到本地

9.1 fetch模块的选项

  • src:远程主机文件路径,只能是文件,不能是目录
  • dest:文件收集到本地的哪个路径
  • flat:默认为no,标识在主控端目录下以远程主机名的方式来显示文件目录结构,yes标识不用主机名的方式来显示,dest的结尾必须是 /

9.2 fetch模块的使用

# 将之前创建的hello文件收集到本地
[ansible@master ansible]$ ansible all -m fetch -a "src=/tmp/hello dest=./ "
192.168.200.210 | CHANGED => {
    "changed": true,
    "checksum": "74f4f4eb1947b9ca08e5e68d04d081808777f9a0",
    "dest": "/home/ansible/ansible/192.168.200.210/tmp/hello",
    "md5sum": "3cb95cfbe1035bce8c448fcaf80fe7d9",
    "remote_checksum": "74f4f4eb1947b9ca08e5e68d04d081808777f9a0",
    "remote_md5sum": null
}
[ansible@master ansible]$ ls
ansible.cfg   roles   user.yaml 192.168.200.210   inventory     set

这里就会有一个目录名是远程主机名,目录里面的内容就是我们收集过来的文件了

[ansible@master ansible]$ cat 192.168.200.210/tmp/hello 
hello,world
[ansible@master ansible]$ rm -rf 192.168.200.210/
[ansible@master ansible]$ ansible all -m fetch -a "src=/tmp/hello dest=./ flat=yes"
192.168.200.210 | CHANGED => {
    "changed": true,
    "checksum": "74f4f4eb1947b9ca08e5e68d04d081808777f9a0",
    "dest": "/home/ansible/ansible/hello",
    "md5sum": "3cb95cfbe1035bce8c448fcaf80fe7d9",
    "remote_checksum": "74f4f4eb1947b9ca08e5e68d04d081808777f9a0",
    "remote_md5sum": null
}
[ansible@master ansible]$ ls
ansible.cfg   hello   inventory   roles   set   user.yaml

如果为yes的话就会直接显示文件名

10. get_url模块

功能从网上下载文件,类似于wget命令

10.1 get_url模块的选项

  • url:下载的url
  • url_password / url_username:主要用于需要用户名和密码验证的情况
  • dest:保存到本地的哪个地方
  • mode:给定权限
  • owner:指定拥有人
  • group:指定所属组

10.2 get_url模块的使用

[ansible@master ansible]$ ansible all -m get_url -a "url=https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo dest=/tmp"
192.168.200.210 | CHANGED => {
    "changed": true,
    "checksum_dest": null,
    "checksum_src": "42cd41801c59a7d62b8d936249817bb29c66c9aa",
    "dest": "/tmp/Centos-vault-8.5.2111.repo",
    "elapsed": 0,
    "gid": 0,
    "group": "root",
    "md5sum": "3861ff439b02834d39b225045a5b0f97",
    "mode": "0644",
    "msg": "OK (2495 bytes)",
    "owner": "root",
    "size": 2495,
    "src": "/root/.ansible/tmp/ansible-tmp-1718867579.1066597-109801-88317862966284/tmp65039pbq",
    "state": "file",
    "status_code": 200,
    "uid": 0,
    "url": "https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo"
}

将centos8的yum源下载到了/tmp目录下

与Ansible的常用模块相似的内容:

Ansible的常用模块

目录ansible常用模块1. file模块1.1 file模块的选项1.2 file模块的使用1.2.1 使用file模块在远程主机创建文件1.2.2 创建目录1.2.3 删除文件/目录2. copy模块2.1 copy模块的选项2.2 copy模块的使用3. yum_repository模块3.

[转帖]ansible小结(七)常用模块

ansible小结(七)常用模块 http://www.361way.com/ansible-modules/4415.html 在上一篇中介绍了commands部分模块,本篇承接上篇介绍下常用的模块。根据官方的分类,将模块按功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监

[转帖]太厉害了,终于有人能把Ansible讲的明明白白了,建议收藏

https://zhuanlan.zhihu.com/p/530678807 一: ansible 的概述 1. ansible简介 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。 它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要

[转帖]别让运维太忙,一文详解 Ansible 的自动化运维

https://zhuanlan.zhihu.com/p/270655214 一、Ansible 概述 Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。 Ansible 通过本身集成的非常丰富的模块可以实现各种管

Ansible 学习笔记 - 批量巡检站点 URL 状态

前言 不拖泥带水,不东拉西扯。 速战速决,五分钟学到一个工作用得上的技巧。 通过一个个具体的实战案例,来生动演示 Ansible 的用法。 需求 我需要定期巡检或定时监控我公司的所有站点的首页的可用性状态。 Ansible Playbook 实战脚本 check_url_status.yml 如下:

[转帖]ansible 安装 K8S

作者:山河已无恙链接:https://www.zhihu.com/question/315497851/answer/2898814729来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 写在前面分享一个 k8s 高可用集群部署的 Ansible 剧本以及涉及到的一些工

Python学习之十_paramiko的简单学习

Python学习之十_paramiko的简单学习 简介 pywinrm 是python用于连接访问windows的工具 paramiko 是python用于连接访问linux的工具 ansible等工具很多也是基于类似的组件进行的处理 连接不同的系统进行命令行的操作. paramiko的简介 par

云环境自动化(Terraform+Ansible)

应用的自动化部署由来已久,也有很多知名的工具,比如puppet,ansible,saltstack,chef等等。 但是对于基础设施部分,一般都是以事先准备的方式来提供的。 虽然各大云服务器厂商也逐步提供了各类的API,用来控制自己的基础设施, 但是,由于各类厂商的差异性,API差异很大且没有统一分

Ansible 学习笔记 - 定位主机和组的模式

中英文对照表 | 英文 | 中文 | 备注 | | | | | | host | 主机 | | | group | (主机)组 | | | pattern | 模式 | | | ad hoc | 特别命令 | | | playbook | 剧本 | Ansible 专有名词,一段复杂的编排 | |

ansible自定义模板部署apache服务

使用Ansible来部署Apache服务是一个很好的选择,因为它可以自动化部署过程,确保所有的服务器上都有相同的配置。以下是一个简单的步骤指南,展示如何使用Ansible来部署Apache服务: 1 创建角色目录 首先,在 /etc/ansible/roles 下创建 apache 目录: mkdi