Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

目录

一、ansible概述

1、简介

2、Ansible主要功能:

3、Ansible的另一个特点:所有模块都是幂等性

4、Ansible的优点:

5、Ansible的四大组件:

二、ansible环境部署:

1、环境:

2、安装ansible:

3、Ansible的配置文件:

[4、 配置远程主机清单](#4、 配置远程主机清单)

三、ansible的模块(重要)

1、ansible的命令格式:

2、模块1:command模块

3、模块二:shell模块

4、模块3:cron模块

5、模块4:USER模块

6、模块5:group模块(了解)

7、模块6:ping模块

8、模块7:hostname模块

9、模块8:COPY模块

10、模块9:file模块

11、模块10:yum模块

12、模块11:service/systemd模块

13、模块12:script模块

14、模块13:setup模块

四、管理主机清单

1、主机变量

2、组变量

3、组嵌套


一、ansible概述

1、简介

Ansible是自动化运维工具,能实现跨主机对应用编排管理部署。

Ansible能批量配置、部署、管理上千台主机,是应用级别的跨主机编排工具。

比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。

是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起

2、Ansible主要功能:

远程操控主机功能

自动化运维(playbook剧本yaml格式)

Ansible能批量的配置、部署、管理上千台主机。类似于xshell的一键输入的工具,不需要每次都切换主机进程操作,只要有一台Ansible的固定主机,就可以实现所有节点的操作

不需要agent(客户端)的概念,只需要一台主机上配置了Ansible即可

Ansible是基于模块来进行工作的,只是提供了一种运行的架构,真正执行操作和变更的是Ansible的模块来实现的。

Ansible默认是通过ssh的密钥对实现通信。(可以改)

3、Ansible的另一个特点:所有模块都是幂等性

所谓幂等性,指的是多次操作和多次执行对系统资源的影响是一致的

systemctl stop firewalld 是幂等性

systemctl restart firewalld不是幂等性

http的get是幂等性

http的post不是幂等性

Ansible的幂等性,决定了你可以放心大胆的使用,重复执行摸个任务不会对结果产生任何影响(绝大多数情况)

4、Ansible的优点:

部署较为简单,只要在控制主机部署即可。被控制主机需要有ssh和python2.5以上版本。基本上Linux虚拟机都能满足这两个

Ansible只能控制Linux系统,Windows不行

基于模块工作,可以使用任意语言开发模块(二次开发,底层架构)

5、Ansible的四大组件:

  1. inventory主机清单(主机组):定义Ansible可以远程操作的服务器
  2. 模块:常用的有13个模块。通过模块可以实现远程的配置和操作
  3. plugins插件
  4. playbook:基本(shell脚本)yaml格式

二、ansible环境部署:

1、环境:

管理端:20.0.0.21 Ansible

被管理端:20.0.0.22、20.0.0.23

2、安装ansible:

bash 复制代码
基于epel源安装
先安装 epel 源
yum install -y epel-release

yum安装ansible
yum install -y ansible

3、Ansible的配置文件:

/etc/ansible/

ansible.cfg:ansible的主配置文件,一般无需修改

hosts:主机组,声明可以被控制的主机

roles:公共角色目录

4、 配置远程主机清单

修改hosts文件:

vim hosts

配置主机有两种方式:1、直接声明主机的IP地址 2、主机名(要在/etc/hosts中做映射)

主机上生成密钥对并且传给被控制主机:

ssh-keygen -t rsa

配置密钥对验证

ssh-keygen -t rsa #一路回车,使用免密登录

sshpass -p '123' ssh-copy-id ++++root@20.0.0.22++++

sshpass -p '123' ssh-copy-id root@20.0.0.23

若发送密钥对不成功,先到目标主机上执行一个命令,然后再传

ansible 20.0.0.23 -m command -a 'date'

ansible 20.0.0.22 -m command -a 'date'

三、ansible的模块(重要)

1、ansible的命令格式:

bash 复制代码
ansible 组名/IP地址 -m 模块名称 -a '参数列表(执行的命令)'

ansible 20.0.0.23 -m shell -a 'touch /opt/123 && echo 123 > /opt/123 && cat /opt/123'
&& 逻辑且,前一个命令成功才会执行下一个命令

ansible 20.0.0.23 -m shell -a 'touch /opt/456 ; ehco 456 > /opt/456 ; cat /opt/456'
;分号表示逻辑或,前面不管成功与否,后面的命令都会执行

ansible不适用交互式的命令

2、模块1:command模块

在远程主机执行Linux命令,不支持管道符,重定向输出

指定IP地址:

bash 复制代码
ansible 20.0.0.23 -m command -a 'date'
ansible 20.0.0.22 -m command -a 'date'

指定组,组内所有的声明主机都会执行:

bash 复制代码
ansible webserver -m command -a 'date'
ansible dbservers -m command -a 'date'

所有声明的主机全都执行:

bash 复制代码
ansible all -m command -a 'date'

不加-m,不声明使用的模块,默认就是command模块:

bash 复制代码
ansible 20.0.0.23  -a 'date'

command的一些常用参数:

**chdir:**在远程主机上运行命令,提前进入目录

先进home目录,然后再执行命令

bash 复制代码
ansible all -m command -a 'chdir=/opt ls'

**creates:**判断指定文件是否存在,若存在,不执行后续的操作

bash 复制代码
ansible all -m command -a 'creates=/opt/123 ls/opt'

**removes:**ansible all -m command -a 'chdir=/opt ls'

bash 复制代码
ansible 20.0.0.22 -m command -a 'removes=/opt/123 ls/opt'

3、模块二:shell模块

在远程主机上执行命令,相当于远程主机

bash 复制代码
ansible 20.0.0.22 -m shell -a 'useradd test'

#创建用户test
bash 复制代码
ansible 20.0.0.22 -m shell -a 'echo 123456 | passwd --stdin test'

#给test用户创建密码

**举个例子:**将IP地址切片出来:

bash 复制代码
ansible 20.0.0.22 -m shell -a "echo $(ifconfig ens33 | awk  'NR==2{print $2}')"

在ansible当中,多个引号之间要做隔离

创建脚本,再写入内容,最后执行

**举个例子:**写一个脚本

bash 复制代码
ansible 20.0.0.22 -m shell -a 'echo -e "#/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'

4、模块3:cron模块

远程给主机设置定时任务

两种状态: present表示添加(默认就是添加,可以省略)

**absent:**表示移除。在ansible中absent都可以表示移除的意思(删除)

* * * * * 分时日月周

分=minute

时=hour

日=day

月=month

周=weekday

**job:**任务计划需要执行的命令或者脚本

**name:**任务计划的名称,可以不加

bash 复制代码
ansible 20.0.0.22 -m cron -a 'minute="*/5" job="ls /opt" name=test1'

举个例子:

写一个9月1号8点30分,执行ls /opt 任务名:test2

30 8 1 9 *

bash 复制代码
ansible 20.0.0.22 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"'

查看定时任务:

bash 复制代码
ansible 20.0.0.22 -m command -a 'crontab -l'

删除定时任务:

bash 复制代码
ansible 20.0.0.22 -m cron -a 'name=test1 state=absent'

删除未命名的定时任务(所有的None都会删除):

多个定时任务,如果不给名字都是None,一旦删除None,全部删除,不推荐(最好是指定一个不重复的名称)

bash 复制代码
ansible 20.0.0.22 -m cron -a 'name=None state=absent'

5、模块4:USER模块

用户管理模块

常用的参数:

name 指定用户名,必须要有

state present:创建用户,可以不加,默认

absent :删除一定要加absent

system=yes|no。标记用户使用是一个程序用户

uid:用户的唯一标识

group:指定用户的所在组

create_home=yes|no:替换用户的家目录,不替换可以不写,可省略

password:给用户创建密码

comment:添加用户的注释信息,可有可无

remove=yes|no,当删除用户时,加上remove=yes,删除用户的家目录,相当于userdel -r。如果不需要删除用户家目录,可省略这一项

bash 复制代码
ansible 20.0.0.22 -m user -a 'name=koeda system=yes '

在创建用户时,虽然我声明了是一个程序用户,但是默认的登录shell如果没有额外的声明,还是默认的/bin/bash,UID会按照程序用户来指定

创建程序用户:

bash 复制代码
ansible 20.0.0.22 -m user -a 'name=koeda1 system=yes shell=/sbin/nologin'

使用ansible的USER模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash

如果创建程序用户,一定要声明system=yes,声明shell的类型 shell=/sbin/nologin

也可以指定uid的方式,给用户分配一个uid

创建用户,选择uid,创建密码,指定家目录:

bash 复制代码
ansible 20.0.0.22 -m user -a 'name=koeda3 uid=1010 password=123456 home=/opt/test1'

更改用户家目录:

bash 复制代码
ansible 20.0.0.22 -m user -a 'name=koeda3 home=/home/koeda3 create_home=yes'

删除用户及其家目录:

bash 复制代码
ansible 20.0.0.22 -m user -a 'name=koeda remove=yes state=absent'

6、模块5:group模块(了解)

用户组的管理模块

gid 设置组的id

name必须要有

创建用户组:

bash 复制代码
ansible 20.0.0.22 -m group -a 'name=test1 gid=306 system=yes'

创建用户时添加到指定的组:

bash 复制代码
ansible 20.0.0.22 -m user -a 'name=test uid=1011 group=test1 '

删除用户组:

bash 复制代码
ansible 20.0.0.22 -m group -a 'name=test1 state=absent'

7、模块6:ping模块

bash 复制代码
ansible all -m ping

能ping通的主机必须是声明的主机

只有在/etc/ansible/hosts文件中声明的主机,ansible的控制端才可以进行远程操作

8、模块7:hostname模块

更改被控制端的主机名:

bash 复制代码
ansible 20.0.0.22 -m hostname -a 'name=webservers'

ansible 20.0.0.23 -m hostname -a 'name=dbservers'

9、模块8:COPY模块

用于复制指定的主机文件到远程主机的模块

常用的参数:

dest:指出要复制的文件在哪,必须使用绝对路径。如果源目标是目录,指目标也得是目录。如果目标的文件存在,会覆盖原有的内容

src:复制文件的源,最好使用绝对路径,源目标是目录,指目标也得是目录

owner:支出文件的所有者

group:指定文件的所在组

content:从主机复制指定的内容到目标主机,用content就不能使用src

mode:指定复制之后的文件的权限

bash 复制代码
ansible 20.0.0.22 -m copy -a 'src=/opt/123 dest=/opt/123.txt owner=test mode=655'

****举个例子:****将ky32.txt文件复制到22主机,所有者test程序用户,所在组test,文件的权限600

bash 复制代码
ansible 20.0.0.22 -m user -a 'name=test system=yes shell=/sbin/nologin'
#创建程序用户
ansible 20.0.0.22 -m group -a 'name=test gid=333 system=yes'
#创建用户组
ansible 20.0.0.22 -m copy -a 'src=/opt/ky32.txt dest=/opt/32.txt owner=guoqi group=guoqi mode=600'
#复制文件,并且给权限

复制目录:

复制目录时,要保证不是空目录,要有文件

bash 复制代码
ansible 20.0.0.22 -m copy -a 'src=/opt/test dest=/opt/test1/ mode=777'

指定输入一个内容:

相当于echo功能

echo一个hello world!到22主机的opt下

bash 复制代码
ansible 20.0.0.22 -m copy -a 'content="hello world!" dest=/opt/hello.txt'

10、模块9:file模块

文件模块跟目录没有关系

管理文件属性

相关参数:

owner、group、mode等

state=link:创建链接文件

state=touch:创建文件

state=directory 创建目录

state=absent:删除文件

修改文件的所有者和所在组

bash 复制代码
ansible 20.0.0.22 -m file -a 'owner=test group=test mode=777 path=/opt/demo.txt'

file模块创建文件

bash 复制代码
ansible 20.0.0.22 -m file -a 'path=/opt/ky32.txt state=touch'
#创建文件

file模块创建目录

bash 复制代码
ansible 20.0.0.22 -m file -a 'path=/opt/ky32 state=directory'

将本机的/etc/fatab文件复制到远程主机,再用这个文件创建一个连接文件:

bash 复制代码
ansible 20.0.0.23 -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak'
#先复制
ansible 20.0.0.23 -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
#在创建链接文件

基于file模式删除远程文件

bash 复制代码
ansible 20.0.0.23 -m file -a 'path=/opt/fstab.link state=absent'

11、模块10:yum模块

在远程主机上安装软件包

bash 复制代码
ansible 20.0.0.23 -m yum -a 'name=httpd'

ansible 20.0.0.23 -m yum -a 'name=tree'

在目标主机上的操作都是后台运行,不影响其他用户的使用。在日志中能打印

卸载软件:

bash 复制代码
ansible 20.0.0.23 -m yum -a 'name=tree state=absent'

12、模块11:service/systemd模块

常用参数:

state=started|stopped|restarted 三种管理动作

enabled=true 表示是否设置开机自启,默认就是开机不自动启动

runlevel:配合enabled的,若设置开机自启,可以设置运行级别。在命令行可以设置,但是不生效,必须要在playbook中使用

bash 复制代码
ansible 20.0.0.52 -m service -a 'enabled=ture name=nginx state=restarted'

****举个例子:****nginx 安装nginx 设置为开机自动,设置访问页面this is nginx

bash 复制代码
ansible 20.0.0.52 -m yum -a 'name=epel-release'

ansible 20.0.0.52 -m yum -a 'name=nginx'

ansible 20.0.0.52 -m service -a 'enabled=true name=nginx state=restarted'

ansible 20.0.0.52 -m shell -a 'echo this is nginx > /usr/share/nginx/html'

13、模块12:script模块

运行本地脚本,然后将结果输出到目标主机

先创建一个脚本

chmod 777 test.sh

运行脚本,将内容输出到远程主机上

bash 复制代码
ansible all -m script -a 'test.sh'

14、模块13:setup模块

主要作用就是查看目标主机的环境信息(facts),目标节点的系统信息

查看所有环境信息

bash 复制代码
ansible all -m setup

查看目标主机的IP信息

bash 复制代码
ansible all -m setup -a 'filter=*ipv4'

查看CPU信息:

bash 复制代码
ansible all -m setup -a 'filter=*memory*'
ansible_processor

查看内存信息:

bash 复制代码
ansible all -m setup -a 'filter=*memory*'
ansible_memory_mb

查看内核:

bash 复制代码
ansible all -m setup -a 'filter=*proc*'
ansible_processor

查看os系统:

bash 复制代码
ansible all -m setup -a 'filter=*os*'
ansible_os_family

查看硬盘信息:

bash 复制代码
ansible all -m setup -a 'filter=*dev*'
ansible_devices

四、管理主机清单

快速声明多个主机

bash 复制代码
vim /etc/ansible/hosts
20.0.0.6[1:3]
#声明主机范围。表示声明20.0.0.61-63主机

取消密钥队免密登录

ansible_host:声明连接时的IP地址

ansible_port:声明对方的连接端口。默认是ssh的默认端口

ansible_user:指定连接时使用对方主机的用户名。不指定表示主机执行ansible的用户即为使用目标主机的用户名

ansible_password:指定连接ssh时的密码。这里是目标主机的用户密码

ansible_become:提升用户权限。也可以改变用户的身份

例如:ansible_become root。需要声明用户的密码

ansible_become-password:指定切换用户的密码。基于免密钥登录实现。

1、主机变量

vim /etc/ansible/hosts

#声明主机变量

bash 复制代码
#指定ip,定义好ssh连接的端口,用户,密码。做到免密连接
20.0.0.2[5:6] ansible_port=22 ansible_user=root ansible_password=123

这里将25、26主机生面变量,27没有声明

vim /etc/ansible/ansible.cfg

取消ssh的秘钥对验证

bash 复制代码
#---71行取消注释---
host_key_checking = False

测试连通性:

ansible webservers -m ping

这里注意:

声明好的主机节点的端口必须是22,root用户的密码必须是123

2、 组变量

bash 复制代码
声明组变量
[webservers:vars]        #表示为 webservers 组内所有主机定义变量
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22
bash 复制代码
声明所有的主机都是用相同的用户名密码和端口
[all:vars1]                            #表示为所有组内的所有主机定义变量
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22

3、 组嵌套

bash 复制代码
[nginx]
20.0.0.20
20.0.0.21
20.0.0.22

[apache]
20.0.0.3[0:3]

[webs:children]	#表示为 webs 主机组中包含了 nginx 组和 apache 组内的所有主机
nginx
apache
相关推荐
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_1 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈1 天前
Unix 与 Linux 异同小叙
linux·服务器·unix