目录
- ansible常用模块
- [1. file模块](#1. file模块)
- [1.1 file模块的选项](#1.1 file模块的选项)
- [1.2 file模块的使用](#1.2 file模块的使用)
- [1.2.1 使用file模块在远程主机创建文件](#1.2.1 使用file模块在远程主机创建文件)
- [1.2.2 创建目录](#1.2.2 创建目录)
- [1.2.3 删除文件/目录](#1.2.3 删除文件/目录)
- [2. copy模块](#2. copy模块)
- [2.1 copy模块的选项](#2.1 copy模块的选项)
- [2.2 copy模块的使用](#2.2 copy模块的使用)
- [3. yum_repository模块](#3. yum_repository模块)
- [3.1 yum_repository的选项](#3.1 yum_repository的选项)
- [3.2 yum_repository的使用](#3.2 yum_repository的使用)
- [4. yum 模块](#4. yum 模块)
- 4.1yum模块的选项
- [4.2 yum模块的使用](#4.2 yum模块的使用)
- [5. service模块](#5. service模块)
- [5.1 service模块的选项](#5.1 service模块的选项)
- [5.2 service模块的使用](#5.2 service模块的使用)
- [6. systemd模块](#6. systemd模块)
- [6.1 systemd模块的选项](#6.1 systemd模块的选项)
- [6.2 systemd模块的使用](#6.2 systemd模块的使用)
- [7. user模块](#7. user模块)
- [7.1 user模块的选项](#7.1 user模块的选项)
- [7.2 user模块的使用](#7.2 user模块的使用)
- [8. group模块](#8. group模块)
- [8.1 group模块的选项](#8.1 group模块的选项)
- [8.2 group模块的使用](#8.2 group模块的使用)
- [9. fetch模块](#9. fetch模块)
- [9.1 fetch模块的选项](#9.1 fetch模块的选项)
- [9.2 fetch模块的使用](#9.2 fetch模块的使用)
- [10. get_url模块](#10. get_url模块)
- [10.1 get_url模块的选项](#10.1 get_url模块的选项)
- [10.2 get_url模块的使用](#10.2 get_url模块的使用)
- [11. setup 模块](#11. setup 模块)
- [11.1 setup模块的使用](#11.1 setup模块的使用)
- [1. file模块](#1. file模块)
ansible常用模块
这些写的都是常用的模块,还有更多其他的模块可以自行查文档
**模块的使用这里都使用Ad-Hoc的方式。**playbook的方式后面会说
- file 模块
- copy 模块
- yum_repository 模块
- yum 模块
- service 模块
- systemd 模块
- user 模块
- group 模块
- fetch 模块
- get_url 模块
- setup 模块
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模块在远程主机创建文件
bash
[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,那么我们来到远程主机来看看是不是这样
bash
[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 创建目录
bash
[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 删除文件/目录
bash
[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模块的使用
bash
[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
}
指定文件内容到远程主机
bash
[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的使用
bash
[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"
}
我们来到远程主机查看这个文件
bash
[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
bash
[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
bash
[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模块的使用
bash
[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模块的使用
bash
[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模块的使用
bash
[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来生成一个加密的密码
bash
[ansible@master ansible]$ openssl passwd -6
Password:
Verifying - Password:
$6$b4Ug/ub0EPkyRE5x$oN.c5c2ah.Ej.Eo8s3F0q1E5t1/MHCFanZZivkJ8S2ZzE8fR2I2e7uYL5HgZ5CLwo1MGMhnHd2mmFxkN49Kq20
将输出的这一段放在password字段就可以了
用户的删除
bash
[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模块的使用
bash
[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模块的使用
bash
# 将之前创建的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
这里就会有一个目录名是远程主机名,目录里面的内容就是我们收集过来的文件了
bash
[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模块的使用
bash
[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目录下
11. setup 模块
这个模块用来收集远程主机的信息,一般不需要指定参数
11.1 setup模块的使用
这个模块的使用方式有些特别,是将远程主机的信息收集过来之后供我们来看的,方便后面编写不同场景下的通用型playbook
bash
[ansible@master ansible]$ ansible all -m setup > host_info.yaml
[ansible@master ansible]$ vim host_info.yaml
92.168.200.210 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.200.210",
"172.17.0.1",
"10.245.149.0"
],
"ansible_all_ipv6_addresses": [
"fe80::20c:29ff:fe2c:d98",
"fe80::ecee:eeff:feee:eeee"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "11/12/2020",
"ansible_bios_version": "6.00",
信息很多,我没有全部粘贴,这个具体如何使用后面playbook再讲