8.16笔记

任务背景

公司的服务器越来越多, 维护⼀些简单的事情都会变得很繁琐。⽤shell脚本来管理少量服务器效率还⾏, 服务器多了之后, shell脚本⽆法实现⾼效率运维。这种情况下,我们需要引⼊⾃动化运维⼯具, 对多台服务器实现⾼效运维。

任务要求

 

通过管理服务器能够按照需求灵活⾼效地管理所有应⽤服务器的运维

操作

任务拆解

1, 需要⼀台服务器做管理端, 来连接管理所有的应⽤服务器

2, 考虑如果只针对⼀部分应⽤服务器进⾏运维操作如何实现(服务器分组)

3, 学会将平台烂熟于⼼的linux操作命令转化为⾃动化运维的⽅式(常⻅模块的学习)

4, 如果操作⾮常的冗⻓, 学会使⽤playbook和role的⽅式来管理

学习⽬标学习⽬标

能够安装ansible服务器和客户端

能够定义ansible主机清单进⾏服务器分组

能够使⽤hostname模块修改主机名

√ 能够使⽤file模块做基本的⽂件操作

能够使⽤copy模块把⽂件拷⻉到远程机器

能够使⽤fetch模块把⽂件从远程拷⻉到本地

能够使⽤user模块管理⽤户

能够使⽤group模块管理⽤户组

能够使⽤cron模块管理时间任务

能够使⽤yum_repository模块配置yum

能够使⽤yum模块安装软件包

能够使⽤service模块控制服务的启动,关闭,开机⾃启动

能够使⽤script模块在远程机器上执⾏本地脚本

能够使⽤command与shell模块远程执⾏命令

能够编写playbook实现httpd

能够使⽤roles实现lamp⼀、认识⾃动化运维

问题:

假设我要去1000台服务上做⼀个操作(如nginx服务器修改配置⽂件⾥的某⼀个参数), 下⾯两种⽅法缺点明显:

1. 按传统的⽅法, ⼀台连着⼀台服务器的ssh上去⼿动操作。

缺点:效率太低。

2. 写个shell脚本来做。

缺点:

管理的机器平台不⼀致,脚本可能不具备通⽤性。传密码麻烦(在⾮免密登录的环境下, 需要expect来传密码) 效率较低,循环1000次也需要⼀个⼀个的完成,如果⽤ & 符放到后台执⾏,则会产⽣1000个进程。

⾃动化运维:

将⽇常IT运维中⼤量的重复性⼯作,⼩到简单的⽇常检查、配置变更和软件安装,⼤到整个变更流程的组织调度,由过去的⼿⼯执⾏转为⾃动化操作,从⽽减少乃⾄消除运维中的延迟,实现“零延时”的IT运维。

⾃动化运维主要关注的⽅⾯

假如管理很多台服务器,主要关注以下⼏个⽅⾯:

1. 管理机与被管理机的连接(管理机如何将管理指令发送给被管理 机)

2. 服务器信息收集 (如果被管理的服务器有centos7.5外还有其它 linux发⾏版,如suse,ubuntu等。当你要做的事情在不同OS上有 所不同,你需要收集信息,并将其分开处理)

3. 服务器分组(因为有些时候我要做的事情不是针对所有服务器, 可能只针对某⼀个分组)

4. 管理内容的主要分类

⽂件⽬录管理(包括⽂件的创建,删除,修改,查看状态,远程拷⻉等)

⽤户和组管理

cron时间任务管理

yum源配置与通过yum管理软件包

服务管理

远程执⾏脚本

远程执⾏命令常⻅的开源⾃动化运维⼯具⽐较

1. puppet(拓展)

基于ruby语⾔,成熟稳定。适合于⼤型架构,相对于ansible和saltstack会复杂些。

2. saltstack(拓展)

基于python语⾔。相对简单,⼤并发能⼒⽐ansible要好, 需要维护被管理端的服务。如果服务断开,连接就会出问题。

3. ansible

基于python语⾔。简单快捷,被管理端不需要启服务。直接⾛ssh协议,需要验证所以机器多的话速度会较慢。

⼆、ansible

ansible是⼀种由Python开发的⾃动化运维⼯具,集合了众多运维⼯具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运⾏命令等功能。

特点:

部署简单

默认使⽤ssh进⾏管理,基于python⾥的paramiko模块开发

管理端和被管理端不需要启动服务

配置简单,功能强⼤,扩展性强

能过playbook(剧本)进⾏多个任务的编排

 

ansible环境搭建

实验准备: 三台机器,⼀台管理,两台被管理

 

1. 静态ip

2. 主机名及主机名互相绑定

3. 关闭防⽕墙, selinux

4. 时间同步

5. 确认和配置yum源(需要epel源)

实验过程:

第1步: 管理机上安装ansible,被管理节点必须打开ssh服务.

 
  1. yum install epel-release

  2. # yum install ansible

  3. # ansible --version

  4. ansible 2.8.4

  5. config file = /etc/ansible/ansible.cfg

  6. configured module search path =

  7. [u'/root/.ansible/plugins/modules',

  8. u'/usr/share/ansible/plugins/modules']

  9. ansible python module location =

  10. /usr/lib/python2.7/site-packages/ansible

  11. executable location = /usr/bin/ansible

  12. python version = 2.7.5 (default, Oct 30 2018,

  13. 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

第2步: 实现master对agent的免密登录,只在master上做。(如果这⼀步不做,则在后⾯操作agent时都要加-k参数传密码;或者在主机清单⾥传密码)

 
  1. master# ssh-keygen

  2. master# ssh-copy-id -i 10.1.1.12

  3. master# ssh-copy-id -i 10.1.1.13

第3步: 在master上定义主机组,并测试连接性

 
  1. master# vim /etc/ansible/hosts

  2. [group1]

  3. 10.1.1.12

  4. 10.1.1.13

  5. master# ansible -m ping group1

  6. 10.1.1.13 | SUCCESS => {

  7. "changed": false,

  8. "ping": "pong"

  9. }

  10. 10.1.1.12 | SUCCESS => {

  11. "changed": false,

  12. "ping": "pong"

  13. }

  14. master# ansible -m ping all

  15. 10.1.1.13 | SUCCESS => {

  16. "changed": false,

  17. "ping": "pong"

  18. }

  19. 10.1.1.12 | SUCCESS => {

  20. "changed": false,

  21. "ping": "pong"

  22. }

服务器分组

ansible通过⼀个主机清单功能来实现服务器分组。

Ansible的默认主机清单配置⽂件为/etc/ansible/hosts.

示例:

 
  1. [nginx] 组名

  2. apache[1:10].aaa.com 表示apache1.aaa.com

  3. 到apache10.aaa.com这10台机器

  4. nginx[a:z].aaa.com 表示nginxa.aaa.com

  5. 到nginxz.aaa.com共26台机器

  6. 10.1.1.[11:15] 表示10.1.1.11到10.1.1.15这5台机器

示例:

 
  1. [nginx]

  2. 10.1.1.13:2222 表示10.1.1.13这台,但ssh端⼝为2222

示例: 定义10.1.1.12:2222这台服务器的别名为nginx1

 
  1. nginx1 ansible_ssh_host=10.1.1.13

  2. ansible_ssh_port=2222

示例: 没有做免密登录的服务器可以指定⽤户名与密码

 
  1. nginx1 ansible_ssh_host=10.1.1.13

  2. ansible_ssh_port=2222 ansible_ssh_user=root

  3. ansible_ssh_pass="123456"

示例: 利⽤别名来分组

 
  1. nginx1 ansible_ssh_host=10.1.1.13

  2. ansible_ssh_port=2222 ansible_ssh_user=root

  3. ansible_ssh_pass="123456"

  4. nginx2 ansible_ssh_host=10.1.1.12

  5. [nginx]

  6. nginx1

  7. nginx2

⼩结:

主机清单的作⽤: 服务器分组。

主机清单的常⻅功能:

1. 可以通过IP范围来分, 主机名名字的范围来分

2. 如果ssh端⼝不是22的,可以传⼊新的端⼝。

3. 没有做免密登录,可以传密码。练习: 不论你⽤哪种环境(免密或不免密,端⼝是否22), 请最将两

台被管理机器加⼊到group1组即可

 
  1. vim /etc/ansible/hosts

  2. web01 ansible_ssh_host=192.168.71.200

  3. ansible_ssh_user=root ansible_ssh_pass=root

  4. ansible_ssh_port=22

  5. web02 ansible_ssh_host=192.168.71.201

  6. ansible_ssh_user=root ansible_ssh_pass=root

  7. ansible_ssh_port=2222

  8. [group1]

  9. web01

  10. web02

  11. Ansbile 主机ip|域名|组名|别名 -m ping|copy|.... '参数'

ansible模块

ansible是基于模块⼯作的,本身没有批量部署的能⼒。真正具有批量部署的是ansible所运⾏的模块,ansible只是提供⼀种框架。

ansible⽀持的模块⾮常的多,我们并不需要把每个模块都记住,⽽只需要熟悉⼀些常⻅的模块,其它的模块在需要⽤到时再查询即可。

查看所有⽀持的模块

 
  1. # ansible-doc -l

  2. a10_server

  3. Manage A10 Networks AX/SoftAX...

  4. a10_server_axapi3

  5. Manage A10 Networks AX/SoftAX...

  6. a10_service_group

  7. Manage A10 Networks AX/SoftAX...

  8. a10_virtual_server

  9. Manage A10 Networks AX/SoftAX...

  10. aci_aaa_user

  11. Manage AAA users (aaa:User)

  12. 。。。。。。

  13. 如果要查看ping模块的⽤法,使⽤下⾯命令(其它模块以此类推)

  14. # ansible-doc ping

官⽹模块⽂档地址: https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.htmlhostname模块

hostname模块⽤于修改主机名(注意: 它不能修改/etc/hosts⽂件)

https://docs.ansible.com/ansible/latest/modules/hostname_module.html#hostname-module

将其中⼀远程机器主机名修改为agent1.cluster.com

 
  1. master# ansible 10.1.1.12 -m hostname -a

  2. 'name=agent1.cluster.com'

  3. 基本格式为: ansible 操作的机器名或组名 -m 模块名 -a "参数

  4. 1=值1 参数2=值2"

file模块(重点)

file模块⽤于对⽂件相关的操作(创建, 删除, 软硬链接等) https://docs.ansible.com/ansible/latest/modules/file_module.html#f

ile-module

创建⼀个⽬录

 
  1. master# ansible group1 -m file -a 'path=/test

  2. state=directory'

创建⼀个⽂件

 
  1. master# ansible group1 -m file -a 'path=/test/111

  2. state=touch'

递归修改owner,group,mode

 
  1. master# ansible group1 -m file -a 'path=/test

  2. recurse=yes owner=bin group=daemon mode=1777'

删除⽬录(连同⽬录⾥的所有⽂件)

 
  1. master# ansible group1 -m file -a 'path=/test

  2. state=absent'

创建⽂件并指定owner,group,mode等

 
  1. master# ansible group1 -m file -a 'path=/tmp/111

  2. state=touch owner=bin group=daemon mode=1777'

删除⽂件

 
  1. master# ansible group1 -m file -a 'path=/tmp/111

  2. state=absent'

创建软链接⽂件

 
  1. master# ansible group1 -m file -a 'src=/etc/fstab

  2. path=/tmp/fstab state=link'

创建硬链接⽂件

 
  1. master# ansible group1 -m file -a 'src=/etc/fstab

  2. path=/tmp/fstab2 state=hard‘

copy模块(重点)

copy模块⽤于对⽂件的远程拷⻉操作(如把本地的⽂件拷⻉到远程 的机器上)

https://docs.ansible.com/ansible/latest/modules/copy_module.htm

l#copy-module

在master上准备⼀个⽂件,拷⻉此⽂件到group1的所有机器上

 
  1. master# echo master > /tmp/222

  2. master# ansible group1 -m copy -a 'src=/tmp/222

  3. dest=/tmp/333'

使⽤content参数直接往远程⽂件⾥写内容(会覆盖原内容)

 
  1. master# ansible group1 -m copy -a 'content="ha

  2. ha\n" dest=/tmp/333'

  3. 注意:ansible中-a后⾯的参数⾥也有引号时,记得要单引双引交叉

  4. 使⽤,如果都为双引会出现问题

使⽤force参数控制是否强制覆盖

 
  1. 如果⽬标⽂件已经存在,则不覆盖

  2. master# ansible group1 -m copy -a 'src=/tmp/222

  3. dest=/tmp/333 force=no'

  4. 如果⽬标⽂件已经存在,则会强制覆盖

  5. master# ansible group1 -m copy -a 'src=/tmp/222

  6. dest=/tmp/333 force=yes'

使⽤backup参数控制是否备份⽂件

 
  1. backup=yes表示如果拷⻉的⽂件内容与原内容不⼀样,则会备份⼀

  2. group1的机器上会将/tmp/333备份⼀份(备份⽂件命名加上时

  3. 间),再远程拷⻉新的⽂件为/tmp/333

  4. master# ansible group1 -m copy -a 'src=/etc/fstab

  5. dest=/tmp/333 backup=yes owner=daemon group=daemon

  6. mode=1777'

copy模块拷⻉时要注意拷⻉⽬录后⾯是否带"/"符号

 
  1. /etc/yum.repos.d后⾯不带/符号,则表示

  2. 把/etc/yum.repos.d整个⽬录拷⻉到/tmp/⽬录下

  3. master# ansible group1 -m copy -a

  4. 'src=/etc/yum.repos.d dest=/tmp/'

  5. /etc/yum.repos.d/后⾯带/符号,则表示

  6. 把/etc/yum.repos.d/⽬录⾥的所有⽂件拷⻉到/tmp/⽬录下

  7. master# ansible group1 -m copy -a

  8. 'src=/etc/yum.repos.d/ dest=/tmp/'

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值