Ansible

发布时间:2023年12月20日

Ansible?

Ansible的作用:

远程操作主机功能

自动化运维(playbook 剧本 yaml)

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

Ansible能批量配置、部署、管理上千台主机。类似于shell的一键输入的工具,不需要每次都切换主机进行操作

只要有一台ansible的固定主机,就可以所有节点的操作

不需要agent,客户端

只需要一台主机上配置了ansible

ansible是基于模块进行工作,只是提供了一种运行的架构,执行操作和辩证的是ansible的模块来实现的

copy

service

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

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

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

systemctl stop firewalld

systemctl stop firewalld

systemctl stop firewalld

只要发现要停止的目标服务已经停止,那么后续同样的停止操作不会改变任何结果,什么也不做

systemctl restart firewalld 每一次的操作都会先停再起

http和get是幂等性

post不是幂等性,多次执行相同的post,可能会创建多个相同的资源

ansible的幂等性,决定了你可以放心大胆的使用,重复执行某个任务(绝大多数情况)

Ansible的四大组件:

1、inventory主机清单(主机组)定义ansible可以远程操作的服务器

2、模块 13个模块(常用的)。通过模块可以实现远程的配置和操作

3、plugins插件

4、playbook剧本(shell脚本)yaml格式

Ansible的优缺点:

部署较为简单,只需要在控制主机部署即可,被控制主机需要有ssh和python(2.5以上版本)。基本上linux都是自带的

ansible只能控制linux系统,windows不行

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

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

配置主机有两种方式:

1、直接声明主机的ip地址

2、主机名(/etc/hosts做映射)

ansible的命令格式:

ansible 组名/ip -m 模块名称(ip地址也可以) -a 参数列表(执行的命令)

1、command模块

一般用于执行linux的命令,不支持管道符和重定向

2、shell模块

相当于command的升级版,也可以执行linux的命令,支持管道符和重定向

3、cron模块

在远程主机生成定时任务

分 时 日 月 周

minute

hour

day

month

weekday

job=

name声明计划任务的名称,可以不加,以后声明定时任务的名称是必须的

4、user模块

远程管理用户的模块,创建用户

system=yes | no

声明是普通还是系统用户

yes程序用户

no普通用户

登录的shell还是需要用户自己声明

remove=yes | no

删除用户时是否删除家目录

userdel -r

password创建密码

5、group模块

创建用户组

6、ping模块

测试和远程主机的连通性

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

7、hostname模块

模块1 ?command模块:

command模块,在远程主机执行linux的命令,不支持管道符以及重定向输出

ansible 192.168.233.30 -m command -a 'date'指定ip地址,只会目标主机执行

ansible webservers -m command -a ls/opt:指定组,组内所有的声明的主机都会执行

ansible all -m command -a ls/opt:所有声明的主机都会执行

ansible 192.168.233.30 -a ls/opt:不加-m也就是不声明使用的模块,默认就是command模块

常用参数:

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

creates:判断指定文件是否存在,如果存在,不指定后面的操作

removes:判断指定的文件是否存在,如果存在,执行后续的命令

模块2 ?shell模块:

shell模块,在远程主机执行命令,相当于远程主机的shell禁止,支持管道符和重定向

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

模块3 ?cron模块:

远程主机设置当时任务

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

??????????absent:表示移除。#absent在整个ansible的语法中都表示移除的意思(删除)

分 时 日 月 周

分=minute

时=hour

日=day

月=month

周=weekday

job:任务执行的命令

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

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

模块4 ?user模块:

user模块:用户管理模块

常用的参数:

name:指定用户名,必须要有

state ?present ?absent ?创建用户可以不加present,但是删除一定要加absent

system=yes | no,标记用户是否是一个程序用户

uid:用户的所在组

group:用户的所在组

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

password:创建用户的密码

comment:用户的注释信息(可有可无)

remove=yes | no当删除用户时,加上remove=yes,删除用户的家目录,userdel -r。如果不需要删除家目录,可以不写

ansible 192.168.233.20 -m user -a name=guoqi system=yes

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

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

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

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

模块5 ?group模块:

用户组的管理模块

name 必须要有

gir ?设置组的id

ansible不适用交互式的命令

模块6 ?ping模块:

模块7 ?hostname模块:

模块8 ?copy模块

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

常用的参数:

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

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

owner:指出文件的所有者

group:指定文件的所在组

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

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

复制目录时,还是复制完整的目录,即目录当中不能为空,里面最终要有一个文件

模块9 ?file模块:

文件模块,也可以生成目录

owner

group

mode

state=link ????创建连接文件

state=touch ???创建文件

state=absent ??删除文件

state=directory ?创建目录

模块10 ?yum模块:

远程主机上安装与卸载软件包

在目标主机上的操作都是后台运行,不影响其他用户的使用

模块11 ?service/systemd模块:

?name,设定管理服务的名称

state=started | stopped | restarted管理动作

enabled=true 表示是否开机自启,如果不加,默认就是开机不自动启动

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

模块12 ?script模块:

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

模块13 ?setup模块:

setup查看目标主机的环境系统(facts),目标节点的系统信息

环境:

1、管理端:192.168.233.10 ansible

2、被管理端:192.168.233.20

?????????????192.168.233.30

???备用:192.168.233.40

ansible安装:

三台主机同步操作:

10:

安装ansilbe必须先安装epel源

yum -y install epel-release

yum -y install ansible

以下为ansible的命令实验:

cd /etc/ansible/

vim hosts

添加的就是被管理端

要先取消注释

systemctl restart sshd

设置密钥对

ssh-keygen -t rsa

然后一路回车

ansible 20.0.0.20 -m command -a 'date'

ansible 20.0.0.30 -m command -a 'date'

ssh-copy-id root@20.0.0.20

ssh-copy-id root@20.0.0.30

ansible 20.0.0.20 -m command -a 'date'

ansible 20.0.0.30 -m command -a 'date'

//配置密钥对验证

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

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

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

command模块:

ansible 192.168.233.30 -m command -a 'date'

sshpass -p ‘123’ ssh-copy-id root@192.168.233.30

ansible 192.168.233.100 -m command -a 'date'

命令的意思是在30主机上执行date命令,第一次可能报错,再执行一次

shell模块:

创建用户并查看

ansible 192.168.233.20 -m shell -a useradd test

创建密码

ansible 192.168.233.20 -m shell -a echo 123456 | passwd --stdin test

切出ifconfg的网卡

多个命令之间可以使用&&(仅限于shell)

也可以使用;隔开

corn模块:

每5分钟执行一次

9月1号早上8点30分,执行ls /opt 任务名:test2

删除有名字的定时任务

user模块:

删除用户和家目录

group模块:

ping模块:

hostname模块:

copy模块:

file模块

path就是路径

创建目录

yum模块

state=absent的意思就是卸载tree

要先开启httpd的服务,再查看状态

service模块:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

实验:

script模块

写一个脚本

实验:

?

setup模块

获取mysql组主机的facts信息

使用filter可以筛选指定的facts信息

查看cpu

查看内核

查看系统

查看系统信息

ansible webservers -m setup -a 'filter=ansible_*processor*' #查看cpu

inventory 主机清单

//Inventory支持对主机进行分组,每个组内可以定义多个主机,

每个主机都可以定义在任何一个或多个主机组内。

vim /etc/ansible/ansible.cfg

71 host_key_checking = False #取消注释,取消密钥队验证

//如果是名称类似的主机,可以使用列表的方式标识各个主机。

vim /etc/ansible/hosts

[webservers]

192.168.80.11:2222 #冒号后定义远程连接端口,默认是 ssh 的 22 端口

192.168.233.6[1:3] ?????#表示ip地址范围,1-3

[dbservers]

db-[a:f].example.org #支持匹配 a~f

//inventory 中的变量

Inventory变量名 ??????????????含义

ansible_host ?????????????????ansible连接节点时的IP地址

ansible_port ?????????????????连接对方的端口号,ssh连接时默认为22

ansible_user ?????????????????连接对方主机时使用的用户名。不指定时,

??????????????????????????????将使用执行ansible或ansible-playbook命令的用户

??

ansible_password ?????????????连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效

ansible_ssh_private_key_file ?指定密钥认证ssh连接时的私钥文件

ansible_ssh_common_args ??????提供给ssh、sftp、scp命令的额外参数

ansible_become ???????????????允许进行权限提升

ansible_become_method ????????指定提升权限的方式,例如可使用sudo/su/runas等方式

ansible_become_user ??????????提升为哪个用户的权限,默认提升为root

ansible_become_password ??????提升为指定用户权限时的密码

(1)主机变量

[webservers]

192.168.233.40 ansible_port=22 ansible_user=root ansible_password=123

(2)组变量

[webservers:vars] #表示为 webservers 组内所有主机定义变量

ansible_user=root

ansible_password=123

[all:vars] #表示为所有组内的所有主机定义变量

ansible_port=22

(3)组嵌套

[nginx]

192.168.80.20

192.168.80.21

192.168.80.22

[apache]

192.168.80.3[0:3]

[webs:children] #表示为 webs 主机组中包含了 nginx 组和 apache 组内的所有主机

nginx

apache

文章来源:https://blog.csdn.net/wyh20030130/article/details/135112762
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。