目录
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模块在远程主机创建文件
[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目录下
11. setup 模块
这个模块用来收集远程主机的信息,一般不需要指定参数
11.1 setup模块的使用
这个模块的使用方式有些特别,是将远程主机的信息收集过来之后供我们来看的,方便后面编写不同场景下的通用型playbook
[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再讲
本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/18258735
分类: Ansible