自动化运维工具ansible

Ansible

Ansible简介

【管理机----业务机】

ansible是什么

ansible—-自动化运维工具

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

优点及特点:

Ansible优点

  • Ansible是一款开源运维自动化工具,可以实现运维自动化,提高运维工程师的工作效率,减少人为失误

  • Ansible可以通过本身集成的非常丰富的模块实现各种管理任务,其自带模块数量已超过上千个

  • Ansible操作非常简单,即使新手也比较容易上手

  • Ansible提供的功能却非常丰富,在运维领域,几乎可以实现任何事情。

Ansible 特点 Ansible自2012年发布以来,很快在全球流行,其特点表现如下:

  • Ansible 基于python开发,集合了众多运维工具的优点,运维工程师对其二次开发相对较容易;

  • Ansible 拥有丰富的内置模块,基本可以满足一切要求;

  • 管理模式非常简单,一条命令可以影响上千台机器;

  • 无客户端模式设计,底层基于SSH通信; Ansible发布后也陆续被AWS,Google Cloud Platfrom,Microsoft Azure,Cisco,HP,Mware.Twitter 等大公司接纳并投入使用;

常见自动化运维工具

常见的运维工具有puppet、ansible、saltstack,重点介绍最常用的自动化运维工具ansible

常见的运维自动化工具

  • Puppet

  • Ansible

  • SaltStack

三款自动化运维工具对比

(表格内容 来源于:腾讯云 作者:咻一咻)

名称PuppetSaltStackAnsible
开发语言RubyPythonPython
客户端
二次开发不支持支持支持
通信验证
同学加密标准SSL协议AES加密OpenSSH
平台支持AIX,BSD,HP-UX,Linux,Mac OS X,Solaris,WindowsBSD,Linux,Mac OS X,Solaris,WindowsAIX,BSD,HP-UX,Linux,Mac OS X,Solaris
配置文件格式Ruby语法格式YAMLYAML
Web UI提供提供提供(商业版本)
命令执行不支持(配置模块可实现)支持支持
名称优势劣势
Puppet模块由Ruby或Ruby子集编写,push命令可以即刻触发变更,Web界面生成处理报表、资源清单、实时节点管理代理运行端进行详细、深入的报告和对节点进行配置相对其他工具较复杂,需学习Puppet的DSL或Ruby安装过程缺少错误校验和产生错误报表
Saltstack状态文件可用简单YAML配置模块,或复杂的Python/PyDSL脚本,与客户端可以基于SSH,或在被管节点安装代理,Web界面可看到运行的工作、minion状态、事件日志、可在客户端执行命令扩展能力极强Web界面像毒药竞争产品不稳定与相对不完善缺乏生成深度报告的能力
Ansible模块可以用任何语言开发;备管节点不需要安装代理软件,有Web管理界面、可配置用户、组、资源清单和执行Playbook安装、运行极其简单对备管理节点为Windows有待加强Web管理界面是内置的Ansible的一部分需导入资源清单执行效率较低

ansible优势:

  • 一次性任务定制:任务一次性发布给所有机器

  • 节省任务执行时间:任务主机并发完成任务,节省部署时间

  • 错误率低:避免重复,保证一次任务定制准确即可

  • 方便,操作简单

(ansible仅依赖)ssh

  • 只需要集群管理服务器上安装ansible

  • ssh 免密钥登录

分组管理

三种不同环境:

dev 开发服务器 develop(敏捷开发---快速上线项目,边用边改;)

qa 测试服务器 quality (测试原理:黑盒测试、白盒测试)

prod 生产服务器 production

  • 灰度发布(测试服务器)

  • 部分发布

ansible安装 实验环境:

主机名称IP地址
manage01(管理)192.168.8.20/24
node1192.168.8.21/24
node2192.168.8.22/24
node3192.168.8.23/24

manage01上操作:

切换到/etc/yum.repos.d中

1.[root@manage01 ~]# yum -y install epel-release

(这一步不成功,可以去192.168.3.200局域网复制 local.repo链接,切换到cd /etc/yum.repos.d下面,wget +链接;

http://192.168.3.200/mirrors/local.repo

查看yum源里是否有该软件包 yum info ansible

安装软件

2.安装ansible

[root@manage01 ~]# yum -y install ansible

安装好之后可以查看版本 ansible --version

3.[如果想不需要运维人员干预,被管理端必须允许管理端证书免密登录。]

管理端manage01生成密钥对

ssh-keygen

查看密钥:cd /root/.ssh

切换到该目录下查看:ls

4.切换到 cd /root/.ssh

发送公钥

方式一:交互式传送

[root@manage01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.8.23

方式二:非交互式传送,

安装yum -y install sshpass

sshpass -proot123 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@192.168.8.21

sshpass -proot123 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@192.168.8.22

sshpass -proot123 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@192.168.8.23

*起别名,就不用记IP了,方便以后管理; cd /etc/

vim /etc/hosts

测试证书是否生效

[root@manage01 ~]# for i in seq 21 23;do

>ssh root@192.168.8.$i "hostname"

>done

node1

node2

node3

5.切换到 cd /etc/ansible 下,编辑文件hosts,里面可添加IP,也可分组添加IP

1)直接添加IP

192.168.8.12

2)添加连续IP

192.168.8.[12:15]

3)添加小组IP,组名+IP

[group1]

192.168.8.12

192.168.8.13

6..测试管理机和业务机的连通性

1)测试一台

ansible -m ping 192.168.8.21 -k

-k 交互式输入,需要输入密码

2)测试一组

ansible -m ping group1

3)测试管理的所有机器

ansible -m ping all

其他概念

主机清单 inventory

【/etc/ansible/hosts ansible的主机清单,也可以自己划分主机清单,主机清单是可以配置很多份的】

创建主机清单/关于业务主机分组

touch /root/new_hosts

[web]

node1

node2

lvs1 ansible_ssh_host=192.168.8.200 ansible_ssh_pass=root123

  • 查看清单有效内容:

egrep -v “^$|^#” /etc/ansible/hosts

  • 查看以server开头的内容

    [root@manage01 ~]# egrep "^server" /etc/chrony.conf

    根据环境可以设置不同的主机清单,测试是否能ping通;

ansible -i /root/new_hosts web -m ping

机器分组实验步骤

【具体步骤】

  1. 在 vim /etc/hosts 里面添加对应的主机名和IP;

    192.168.8.12 node1

    192.168.8.13 node2

    192.168.8.14 node3

  2. 自己添加主机清单,并在里面设置分组

    vim /root/new_hosts

    [web]

    node1

    node2

  3. 测试连通性

    ansible -i /root/new_hosts web -m ping

关于业务机器分组

分组中使用范围

[nginx] 组名

apache[1:10].aaa.com

  • 表示apache1.aaa.com到apache10.aaa.com这10台机器

nginx[a:z].aaa.com

  • 表示nginxa.aaa.com到nginxz.aaa.com共26台机器

10.1.1.[11:15]

  • 表示10.1.1.11到10.1.1.15这5台机器

  • 指定业务机器别名,未做免密登陆的机器可以通过下面的机器设置账号密码

    nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass="123456"

  • ansible_ssh_host 指定业务机器的IP或域名

  • ansible_ssh_port 指定业务机器的ssh端口

  • ansible_ssh_user 指定业务机器的ssh用户名

  • ansible_ssh_pass 指定业务机器的ssh用户名密码

 #分组
 [group1]
 192.168.8.21
 #未做免密登陆机器
 192.168.8.22:12121 ansible_ssh_user=sko ansible_ssh_pass='123'
 #别名机器
 web1 ansible_ssh_user=sko ansible_ssh_pass='123'

ansible命令参数

ansible -i 参数的路径

-i 参数指定主机清单

-C 测试但不执行,使用剧本时,可以测试剧本功能

ansible配置文件

管理端ansible目录:/etc/ansible

 [root@manage01 ansible]# tree 
 .
 ├── ansible.cfg           #ansible配置文件,不需要配置
 ├── hosts                 #主机列表
 └── roles                 #角色列表
 ​
 1 directory, 2 files

Ansible命令的格式

ansible 机器 -m 模块名称 -a '模块参数'

 ansible  192.168.8.12  -m  hostname -a  “name=abcd”

基本格式为:

ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2"

ansible基本模块

hostname模块

修改主机名

ansible 192.168.8.12 -m hostname -a “name=abcd”

正确演示:

错误案例:错误原因,“” 符号有错误

file模块

可以创建文件、目录、链接……

等价于touch、chmod、chown…

参数说明
path文件绝对路径
state操作(touch文件新建、absent删除、link软连接、hard硬链接、directory目录创建)
owner设置所有者
group设置所属的组
mode权限 0000
recurse递归 yes or no,用于递归设置权限,不能删除文件(chmod root:root -R,相当于R)
src软硬链接的原始文件路径

例1:state=directory 在group1上创建一个目录,属主属组为root,权限700,路径/root/tom

 ansible  group1  -m   file  -a  “path=/root/tom  state=directory  owner=root  group=root  mode=700”

例2:对单独一台机器操作

 ansible  192.168.8.12  -m   file  -a  “path=/root/tom  state=directory  owner=root  group=root  mode=700”

![image-20240410150025969](C:\Users\联想小新\Desktop\vx图片\image-20240410150025969.png

  • state=absent 删除空目录,操作完 bash 刷新一下,node1查看结果;

      ansible  192.168.8.12  -m   file  -a  "path=/root/tom  state=absent "

例3:在主机192.168.8.12上,创建属主属组为zjx的目录(192.168.8.12上必须有zjx用户)

例4:递归创建

copy模块

把本地文件拷贝到远程服务器上,使用sftp

参数说明
src文件源路径
dest目标路径
content往目标文件输入内容
force强制 yes or no,默认强制覆盖模式;
backup是否备份有冲突的源文件[文件名相同,内容不同] yes or no
checksum拷贝完整性校验,使用sha1sum生成校验码
owner目标文件所有者
group目标文件所属组
mode目标文件权限

例1:复制文件内容

方法一:简便方法;

将管理机上的/root下a.txt文件复制到192.168.8.12主机上

ansible -m copy group1 -a “src=/root/a.txt dest=/tmp/”

src自己的文件路径,dest对方的文件路径

例2:[root@manage01 ~]# ansible group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'

/etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下

例3:root@manage01 ~]# ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'

/etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下

方法二:创建文件,生成校验码,copy操作

[root@manager01 tmp]# sha1sum hhh.txt f53126f18c2571ecec28ccf968fa9f9a7d6904d8 hhh.txt

[root@manager01 tmp]# ansible -m copy 192.168.8.12 -a "src=/tmp/hhh.txt dest=/opt checksum=f53126f18c2571ecec28ccf968fa9f9a7d6904d8 owner=zjx group=zjx mode=0400"

content
  • 使用content参数直接往远程文件里写内容(会覆盖原内容);将内容直接添加到远程服务器文件中

先创建内容<file模块>------<comment>追加

[root@manager01 ~]# ansible -m file 192.168.8.12 -a "path=/code state=touch"

[root@manager01 ~]# ansible -m copy 192.168.8.12 -a "content='baism\nhello world\n' dest=/code"

force

使用force参数控制是否强制覆盖;不写默认强制覆盖;

[root@manager01 ~]# ansible -m copy group1 -a "content=666666 dest=/tmp/zuolaoshi_333 force=yes"

backup 备份

force=yes backup=yes 强制覆盖时会先备份;

backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份

如果拷贝过来的文件本机存在,group1的机器上会将/tmp/333备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/333

[root@manage01 ~]# ansible group1 -m copy -a "src=/etc/fstab dest=/tmp/zuolaoshi_333 backup=yes"

fetch 与copy模块类似,但作用相反

用于把远程机器的文件拷贝到本地。只能拷贝文件不能拷贝目录;

[root@manager01 ~]# ansible -m fetch 192.168.8.12 -a "src=/tmp/zuolaoshi_333 dest=/tmp"

user模块

user模块用于管理用户账号和用户属性

常用参数说明
name=""指定用户名
password=""指定密码,必须是密文
state= absent|present删除|创建
system= yes|no是否为系统用户
shell=""指定登陆shell
generate_ssh_key= yes|no是否创建秘钥对
uid=指定用户的uid
append= yes|no用户是否追加到其他组
group=用户属组
groups=将现有用户加入到某个组,空值就会把该用户从所有所属组中删除
create_home= yes|no是否建立家目录
remove= yes|no删除家目录

创建新用户:

密码必须是密文,所以先要把明文转换一下,生成md5密文 [root@manage01 ~]# echo 123|openssl passwd -1 -stdin

$1$5V.qzSEd$Yr08MU8K.vXeBZcmavypk1

[root@manage01 ~]# ansible -m user group1 -a 'name=sky password="$1$5V.qzSEd$Yr08MU8K.vXeBZcmavypk1" state=present system=yes shell=/sbin/nologin generate_ssh_key=yes'

验证:

在对应的业务机上 cat /etc/shadow

用户删除

[root@manage01 ~]# ansible -m user 192.168.8.21 -a "name=baishuming1 state=absent remove=yes"

systemctl=yes 系统用户

注:

1)最外层:有$符号时,最外层使用单引号可以生成密码

$变量名 在Linux中获取变量的值;

“$var”在双引号中会显示结果

‘$var’表示$var本身

group模块

group模块用于管理用户组和用户组属性。

参数说明
name=组名
state= present|absent创建|删除
system= yes|no是否为系统组
gidgid

组创建

[root@manage01 ~]# ansible -m group group1 -a "name=admin gid=4444 state=present"

用户添加进组

[root@manage01 ~]# ansible -m group group1 -a "name=zjx append=yes group=admin state=present"

删除组

[root@manage01 ~]# ansible -m group group1 -a "name=admin gid=4444 state=absent"

cron 模块

cron模块用于管理周期性时间任务。

参数说明
name计划任务的名称
user执行计划任务的用户
job计划任务命令
minute执行计划任务的分 默认为*
hour执行计划任务的时 默认为*
day执行计划任务的日 默认为*
month执行计划任务的月 默认为*
week执行计划任务的周 默认为*
state absent删除计划任务
 设置定时任务:
 10:23完成名叫:cron test的定时任务;任务内容为:将haha输入到 /tmp/test中
 [root@manage01 ~]# ansible -m cron group1 -a 'name="cron test" user=root job="echo haha > /tmp/test" minute=23 hour=10'
 ​
 [root@manage01 ~]# ansible -m cron group1 -a 'name="cron test" user=root job="echo haha > /tmp/test" minute=23 hour=10'
 ​
 删除定时任务
 ​

yum repository

yum_repository模块用于配置yum仓库。

参数说明
name仓库名 name.repo 源的名称 [name]
description描述
baseurl包下载路径
gpgcheck= 1 or 0包gpg验证
enabled = yes|no是否开启本源
state= absent删除源

增加一个/etc/yum.repos.d/dvd.repo配置文件

 配置yum源,会多一个dvd.repo配置文件
 [root@manage01 ~]# ansible -m yum_repository group1 -a "name=dvd description=BaseOS baseurl=file:///media/cdrom gpgcheck=0 enabled=yes"
 ​
 删除某个yum源
 state=absent
 ​

yum模块

yum模块用于使用yum命令来实现软件包的安装与卸载。

参数说明
name需要安装软件包的名称
list= installed, updates, available and repos列出已安装 需要更新 可获得的 和 yum源
state= absent removed installed present latest删除、删除、安装确认、安装确认、安装最新版本

使用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)

 例1:用yum安装软件,安装ftp,安装最新版本;
 [root@manage01 ~]# ansible -m yum group1 -a "name=ftp  state=latest"
 安装好之后测试:
 输入ftp
 ​
 删除软件:
 state=absent

service 模块

service模块:用于控制服务的启动,关闭,开机自启动等。

参数说明
name服务名称
state reloaded, restarted, started, stopped服务管理
enabled yes|no开启是否启动

例:

删除镜像

ansible group1 -m shell -a “rm -rf /etc/repos.d/*.repo”

下载本地镜像

ansible group1 -m get_url -a “url=http://192.168.3.200/mirrors/local.repo dest=/etc/yum.repos.d”

挂载镜像

ansible group1 -m shell -a “mkdir -p /media/cdrom && mount /dev/cdrom /media/cdrom”

加载缓存

ansible group1 -m shell -a “yum makecache”

yum安装vsftpd

ansible group1 -m yum =a “name=vsftpd state=latest”

启动vsftpd

ansible group1 -m service -a “name=vsftpd state=started”

关闭vsftpd

ansible group1 -m service -a “name=vsftpd state=stoped”

删除软件包

ansible group1 -m service -a “name=vsftpd state=absent”

查看是否加载缓存:

ps -aux |grep yum

*script 模块

让远程服务器,执行我们本地的shell脚本

1.在管理机上创建一个脚本ansible_test.sh

 [root@manage01 ~]# cat ansible_test.sh 
 #!/bin/bash
 #ansible script module test script
 mkdir    /opt/log
 find     /   -name    "*.log"   -exec   cp   -a {}    /opt/log \;

2.执行命令

ansible group1 -m script -a “/root/ansible_test.sh”

command和shell模块

区别:shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)

shell模块
 [root@manage01 ~]# ansible -m shell 192.168.8.21 -a "ls /root"
command模块
 [root@manage01 ~]# ansible -m command 192.168.8.21 -a "ls /root"
 ​

setup 模块

setup模块用于收集远程主机的基本信息(如操作系统类型,主机名,ip,cpu信息,内存信息等)

 #打印192.168.8.21机器的所有信息
 [root@manage01 ~]# ansible -m setup 192.168.8.21
 ​
 #使用filter过滤输出
 #打印192.168.8.21机器的CPU信息
 [root@manage01 ~]# ansible -m setup 192.168.8.21 -a "filter='ansible_processor'"
 其它常见的过滤条件
 ansible_all_ipv4_addresses:显示ipv4的信息。
 ansible_devices:显示磁盘设备信息。
 ansible_distribution_major_version:显示是系统主版本。
 ansible_distribution_version:仅显示系统版本。
 ansible_machine:显示系统类型,例:32位,还是64位。
 ansible_lvm:显示lvm相关信息。
 ansible_memtotal_mb:显示系统总内存。
 ansible_memfree_mb:显示可用系统内存。
 ansible_memory_mb:详细显示内存情况。
 ansible_swaptotal_mb:显示总的swap内存。
 ansible_swapfree_mb:显示swap内存的可用内存。
 ansible_mounts:显示系统磁盘挂载情况。
 ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
 ansible_processor_vcpus:显示cpu个数(只显示总的个数)。

stat 模块

stat模块类似linux的stat命令,查看文件的状态信息。

知识补充

所有密码存储位置:

vim /etc/shadow

所有用户位置:

vim /etc/passwd

所有组位置:

vim /etc/group

linux用户可以分为3类:

root 管理员用户,admin 当uid=0 gid=0时为超级管理员;

uid 1-999 为系统用户,一般不能登录,用于目录的权限和运行软件

uid 1000+ 普通用户,可以登录

get_url用于下载文件

类似于wget

  • 远程下载模块

ansible group1 -m get_url -a “url= dest=”

  • 远程删除模块

ansible group1 -m shell -a “rm /root/mysql*”

  • 远程查看

ansible group1 -m shell -a

“ls”

  • 远程查看IP(-a 不能识别特殊符号,若有特殊符号 需要加 -m shell)

ansible group -a “ip ad sh”

ansible 如何查询

ansible-doc copy

ansible-doc file

ansible剧本

很像shell脚本

playbook是将模块进行组合使用,批量的实现复杂功能。

常用的配置文件格式

  • ini== conf

    1)系统的配置文件,初始化文件

    2)yum源,mysql配置

    [mysqld]

    [mysql]

  • Json

    1)网络数据传输

    2)html+css+js http/https json

    3)java,python,go,php,c++ json

  • yaml

    1)缩进统一,同一级别属性书写必须对齐,只能用空格进行缩进;

    2)前后端项目的配置文件

  • xml可扩展标记语言

    1)java项目和早期的项目比较流行

    2)类似于Html的格式

    3)apache 旗下的各种软件应用,httpd,tomcat

yaml

注意事项:

缩进使用空格,同一级别属性对齐,否则会报错;下一级属性使用两个空格进行缩进。

剧本格式

例1:

 ---
 - name: test
    hosts: group1
    remote_user: root
    var: 
        - name:tom
        
    tasks: 
        - name: test ping 
          ping:
        
        - name: test copy
           copy: src=/root/apache.yml  dest=/root/
           
         - name : useradd {{name}}   #x获取变量的值  相当于$name
           user: name="{{name}}"
                    state=present

ansible-playbook -C apache.yml -C检测功能

ansible-playbook apache.yml 执行

一:tasks 任务

任务在一行可以用等于号;


 name: test
 hosts: group1
 tasks:
     - name: test ping 
       ping:
     - name: test copy
        copy: src=/root/apache.yml  dest=/root/

多行用 冒号

 name: test
 hosts: group1
 tasks:
     - name: test 
        ping 
     - name: test copy
        copy:
            src: /root/apache.yml
            dest: /root/

方法一:

方法二:

二:handlers notify调用执行,

handlers 最佳使用场景:重启服务

三:循坏: with_items

role

分角色写剧本

httpd

php

mysql

httpd+php

mysql+php

http+mysql

http+php+mysql

其他服务也可以写,我们还学过:

nfs,httpd,nginx,lvs,keepalive,redis,php,mysql,ftp,samba,dns,ntp,dhcp,rsync

roles优点:

1)模块中指令较少,方便编写

2)重复调用方便

3)排错方便

怎么创建角色

每个角色都需要有一个剧本;

创建LAMP剧本(yum)

roles的默认路径:

/etc/ansible/roles

6个目录结构:切换到该目录下,需要写角色,每个角色包括

 files:用来存放由copy模块或script模块调用的文件。
 tasks:至少有一个main.yml文件,定义各tasks。
 handlers:有一个main.yml文件,定义各handlers。
 templates:用来存放jinjia2模板。
 vars:有一个main.yml文件,定义变量。
 meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。

注意: 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.

ansible-playbook中调用脚本

实现调用执行shell脚本并传参

 主从服务器主要区别:配置文件不一样;
         主服务器:追加主服务器的配置文件
         从服务器:追加从服务器的配置文件
  通过不同参数来实现
        -e  传参,name变量名
       ansible-playbook  test.yml   -e  name="-s"
       执行:ansible-playbook test.yml
  

  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值