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

目录

一、ansible概述

1、简介

2、Ansible主要功能:

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

4、Ansible的优点:

5、Ansible的四大组件:

二、ansible环境部署:

1、环境:

2、安装ansible:

3、Ansible的配置文件:

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:

基于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的命令格式:

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地址:

ansible 20.0.0.23 -m command -a 'date'
ansible 20.0.0.22 -m command -a 'date'

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

ansible webserver -m command -a 'date'
ansible dbservers -m command -a 'date'

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

ansible all -m command -a 'date'

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

ansible 20.0.0.23  -a 'date'

command的一些常用参数:

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

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

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

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

ansible all -m command -a 'creates=/opt/123 ls/opt'

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

ansible 20.0.0.22 -m command -a 'removes=/opt/123 ls/opt'

3、模块二:shell模块

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

ansible 20.0.0.22 -m shell -a 'useradd test'

#创建用户test
ansible 20.0.0.22 -m shell -a 'echo 123456 | passwd --stdin test'

#给test用户创建密码

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

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

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

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

举个例子:写一个脚本

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:任务计划的名称,可以不加

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 *

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

查看定时任务:

ansible 20.0.0.22 -m command -a 'crontab -l'

删除定时任务:

ansible 20.0.0.22 -m cron -a 'name=test1 state=absent'

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

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

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。如果不需要删除用户家目录,可省略这一项

ansible 20.0.0.22 -m user -a 'name=koeda system=yes '

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

创建程序用户:

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,创建密码,指定家目录:

ansible 20.0.0.22 -m user -a 'name=koeda3 uid=1010 password=123456 home=/opt/test1'

更改用户家目录:

ansible 20.0.0.22 -m user -a 'name=koeda3 home=/home/koeda3 create_home=yes'

删除用户及其家目录:

ansible 20.0.0.22 -m user -a 'name=koeda remove=yes state=absent'

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

用户组的管理模块

gid 设置组的id

name必须要有

创建用户组:

ansible 20.0.0.22 -m group -a 'name=test1 gid=306 system=yes'

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

ansible 20.0.0.22 -m user -a 'name=test uid=1011 group=test1 '

删除用户组:

ansible 20.0.0.22 -m group -a 'name=test1 state=absent'

7、模块6:ping模块

ansible all -m ping

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

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

8、模块7:hostname模块

更改被控制端的主机名:

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:指定复制之后的文件的权限

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

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'
#复制文件,并且给权限

复制目录:

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

ansible 20.0.0.22 -m copy -a 'src=/opt/test dest=/opt/test1/ mode=777'

指定输入一个内容:

相当于echo功能

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

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:删除文件

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

ansible 20.0.0.22 -m file -a 'owner=test group=test mode=777 path=/opt/demo.txt'

file模块创建文件

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

file模块创建目录

ansible 20.0.0.22 -m file -a 'path=/opt/ky32 state=directory'

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

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模式删除远程文件

ansible 20.0.0.23 -m file -a 'path=/opt/fstab.link state=absent'

11、模块10:yum模块

在远程主机上安装软件包

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

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

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

卸载软件:

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中使用

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

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

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

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

ansible all -m script -a 'test.sh'

14、模块13:setup模块

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

查看所有环境信息

ansible all -m setup

查看目标主机的IP信息

ansible all -m setup -a 'filter=*ipv4'

查看CPU信息:

ansible all -m setup -a 'filter=*memory*'
ansible_processor

查看内存信息:

ansible all -m setup -a 'filter=*memory*'
ansible_memory_mb

查看内核:

ansible all -m setup -a 'filter=*proc*'
ansible_processor

查看os系统:

ansible all -m setup -a 'filter=*os*'
ansible_os_family

查看硬盘信息:

ansible all -m setup -a 'filter=*dev*'
ansible_devices

四、管理主机清单

快速声明多个主机

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
#声明主机变量

#指定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的秘钥对验证

#---71行取消注释---
host_key_checking = False

测试连通性:

ansible webservers -m ping

这里注意:

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

2、组变量

声明组变量
[webservers:vars]        #表示为 webservers 组内所有主机定义变量
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22

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

3、组嵌套

[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

相关推荐

  1. ansible模块

    2023-12-20 20:42:03       6 阅读
  2. ansible 管理工具以及模块

    2023-12-20 20:42:03       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-20 20:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-20 20:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-20 20:42:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-20 20:42:03       20 阅读

热门阅读

  1. Ansible

    2023-12-20 20:42:03       31 阅读
  2. C++常见STL容器基本用法

    2023-12-20 20:42:03       44 阅读
  3. 阶数RC低通滤波器详解及Matlab示例

    2023-12-20 20:42:03       41 阅读
  4. Python基础入门:语法与数据类型

    2023-12-20 20:42:03       41 阅读
  5. ARFoundation系列探索-第一人称视角技术编程

    2023-12-20 20:42:03       38 阅读
  6. 【.NET】MD5加密

    2023-12-20 20:42:03       41 阅读
  7. 2.Redis10大数据类型

    2023-12-20 20:42:03       29 阅读