运维开发网

ansible 专题(1)

运维开发网 https://www.qedev.com 2020-11-13 13:46 出处:51CTO 作者:wx5ddda4c97f426
ansible 专题(1)

任务背景

公司的服务器越来越多,

维护一些简单的事情都会变得很繁琐。用shell脚本来管理少量服务器效率还行,

服务器多了之后,

shell脚本无法实现高效率运维。这种情况下,我们需要引入自动化运维工具,

对多台服务器实现高效运维。

ansible 专题(1)

任务要求

通过管理服务器能够按照需求灵活高效地管理所有应用服务器的运维操作

任务拆解

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

2, 考虑如何只针对一部分应用服务器进行运维操作如何实现(服务器分组)

3, 学会将平台烂熟于心的Linux操作命令转化为自动化运维的方式(常见模块的学习)

4, 如果操作非常的冗长, 学会使用playbook和role的方式来管理

学习目标

能够安装ansible

能够定义ansible主机清单进行服务器分组能够使用hostname模块修改主机名

能够使用file模块做基本的文件操作

能够使用copy模块把文件拷贝到远程机器能够使用fetch模块把文件从远程拷贝到本地能够使用user模块管理用户

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

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

能够使用yum_repository模块配置yum 能够使用yum模块安装软件包

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

认识自动化运维配置

问题:

假设我要去1000台服务上做一个操作(如nginx服务器修改配置文件里的某一个参数),

下面两种方法缺点明显:

  1. 按传统的方法, 一台连着一台服务器的ssh上去手动操作。缺点:

    效率太低。

  2. 写个shell脚本来做。

    缺点:

    管理的机器平台不一致,脚本可能不具备通用性。

    传密码麻烦(在非免密登录的环境下, 需要expect来传密码)

    ansible 专题(1)

    效率较低,循环1000次也需要一个一个的完成,如果用 &

    符放到后台执行,则会产生1000个进程。

自动化运维:

将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”的IT运维。

自动化运维配置工具主要关注的方面

假如管理很多台服务器,主要关注以下几个方面:

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

  2. 服务器信息收集

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

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

管理内容的主要分类

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

用户和组管理

cron时间任务管理

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

远程执行脚本远程执行命令

常见的开源自动化运维配置工具比较

  1. puppet(拓展)

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

  2. saltstack(拓展)

    基于python语言。相对简单,大并发能力比ansible要好,

    需要维护被管理端的服务。如果服务断开,连接就会出问题。

  3. ansible

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

ansible

ansible介绍

ansible 专题(1)

ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)

的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

特点:

部署简单

默认使用ssh进行管理,基于python里的paramiko模块开发管理端和被管理端不需要启动服务

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

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

ansible 专题(1)

ansible应用环境部署

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

ansible 专题(1)

  1. 静态ip

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

  3. 关闭防火墙, seLinux

  4. 时间同步

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

实验过程:

第1步: 所有服务器(管理与被管理)都要安装ansible

# yum install epel-release

  1. # yum install ansible

  2. # ansible --version

  3. ansible 2.7.0

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

  5. configured module search path = [u'/root/.ansible/plugins/modules',

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

  6. ansible python module location = /usr/lib/python2.7/site-packages/ansible

  7. executable location = /usr/bin/ansible

    9 python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5

    20150623 (Red Hat

    4.8.5-28)]

第2步:

实现master对被管理机的免密登录,只在master上做。(如果这一步不做,则在后面操作被管理机时都要加-

k参数传密码;或者在主机清单里传密码)

master# ssh-keygen

master# ssh-copy-id -i 10.1.1.12

master# ssh-copy-id -i 10.1.1.13

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

master# vim /etc/ansible/hosts

  1. [group1] 3 10.1.1.12 4 10.1.1.13

1 master# ansible -m ping group1 2 10.1.1.13 | SUCCESS =\> {

  1. "changed": false,

  2. "ping": "pong" 5 }

    6 10.1.1.12 | SUCCESS =\> {

  3. "changed": false,

  4. "ping": "pong"

    1 master# ansible -m ping all 2 10.1.1.13 | SUCCESS =\> {

  5. "changed": false,

  6. "ping": "pong" 5 }

    6 10.1.1.12 | SUCCESS =\> {

  7. "changed": false,

  8. "ping": "pong" 9 }

服务器分组(主机清单)

[nginx]

组名

apache[1:10].aaa.com 表示apache1.aaa.com到apache10.aaa.com这10台机器

nginx[a:z].aaa.com

10.1.1.[11:15]

表示nginxa.aaa.com到nginxz.aaa.com共26台机器表示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 ansible_ssh_port=2222

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

1 nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222

ansible_ssh_user=root ansible_ssh_pass="123456"

示例: 利用别名来分组

[nginx] nginx1

nginx2

nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222 ansible_ssh_user=root

ansible_ssh_pass="123456"

nginx2 ansible_ssh_host=10.1.1.12

小结:

主机清单的作用: 服务器分组。主机清单的常见功能:

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

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

  3. 没有做免密登录,可以传密码。

练习: 不论你用哪种环境(免密或不免密,端口是否22),

请最终将两台被管理机器加入到group1组即可

ansible模块

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

供一种框架。

ansible支持的模块非常的多,我们并不需要把每个模块都记住,而只需要熟悉一些常见的模块,其它的模块在需要

用到时再查询即可。

查看所有支持的模块

# ansible-doc -l a10_server a10_server_axapi3 a10_service_group

a10_Virtual_server

aci_aaa_user

。。。。。。

Manage A10 Networks AX/SoftAX... Manage A10 Networks AX/SoftAX... Manage A10

Networks AX/SoftAX... Manage A10 Networks AX/SoftAX...

Manage AAA users (aaa:User)

如果要查看ping模块的用法,使用下面命令(其它模块以此类推)

# ansible-doc ping

官网模块文档地址:

<https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html>

hostname模块

hostname模块用于修改主机名(注意:

它不能修改/etc/hosts文件,但是会修改/etc/hostname)

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

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

master# ansible 10.1.1.12 -m hostname -a 'name=agent1.cluster.com'

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

file模块(重点)

file 模 块 用 于 对 文 件 相 关 的 操 作 ( 创 建 , 删 除 , 软 硬 链 接 等 )

https://docs.ansible.com/ansible/latest/modules/file_module.html\#file-module

创建一个目录

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

创建一个文件

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

递归修改owner,group,mode

1 master# ansible group1 -m file -a 'path=/test recurse=yes owner=bin

group=daemon mode=1777'

删除目录(连同目录里的所有文件)

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

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

1 master# ansible group1 -m file -a 'path=/tmp/111 state=touch owner=bin

group=daemon mode=1777'

删除文件

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

创建软链接文件

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

state=link'

创建硬链接文件

1 master# ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab2

state=hard'

stat模块(了解)

stat模块类似Linux的stat命令,用于获取文件的状态信息。<https://docs.ansible.com/ansible/latest/modules/stat_module.html#stat-module>

获取/etc/fstab文件的状态信息

1 master# ansible group1 -m stat -a 'path=/etc/fstab'

copy模块(重点)

copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)

<https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module>

在master上准备一个文件,拷贝此文件到group1的所有机器上

master# echo master \> /tmp/222

  1. master# ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333'

使用content参数直接往远程文件里写内容(会覆盖原内容)

master# ansible group1 -m copy -a 'content="ha ha\n" dest=/tmp/333'

  1. 注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题

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

如果目标文件已经存在,则不覆盖

  1. master# ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333 force=no'

  2. 如果目标文件已经存在,则会强制覆盖

  3. master# ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333 force=yes'

使用backup参数控制是否备份文件

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

  1. group1的机器上会将/tmp/333备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/333

  2. master# ansible group1 -m copy -a 'src=/etc/fstab dest=/tmp/333 backup=yes

    owner=daemon group=daemon mode=1777'

copy模块拷贝时要注意拷贝目录后面是否带"/"符号

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

  1. master# ansible group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'

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

  3. master# ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'

练习: 在master上配置好所有的yum源,然后拷贝到group1的远程机器上(要求目录内的内容完全一致)

master# ansible group1 -m file -a "path=/etc/yum.repos.d/ state=absent"

  1. master# ansible group1 -m copy -a "src=/etc/yum.repos.d dest=/etc/"

练习:

使用hostname模块修改过主机名后.在master上修改/etc/hosts文件,并拷贝到group1的远程机器上

先在master上修改好/etc/hosts文件,然后使用下面命令拷贝过去覆盖

  1. master# ansible group1 -m copy -a "src=/etc/hosts dest=/etc/hosts"

template模块(拓展)

与copy模块功能几乎一样.

template模块首先使用变量渲染jinja2模板文件成普通文件,然后再复制过去.而copy模块不支持.(jinja2是一个基于python的模板引擎)

<https://docs.ansible.com/ansible/latest/modules/template_module.html#template-module>

1 master# ansible -m template group1 -a "src=/etc/hosts dest=/tmp/hosts"

template模块不能拷贝目录(源)

1 master# ansible -m template group1 -a "src=/etc/yum.repos.d/

dest=/etc/yum.repos.d/"

fetch模块

fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。<https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module>

第1步: 在两台被管理机上分别创建一个同名文件(但内容不同)

agent1# echo agent1 \> /tmp/1.txt

  1. agent2# echo agent2 \> /tmp/1.txt

第2步:

从master上fecth文件(因为group1里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)

1 master# ansible group1 -m fetch -a 'src=/tmp/1.txt dest=/tmp/'

10.1.1.12 | CHANGED =\> { "changed": true,

"checksum": "d2911a028d3fcdf775a4e26c0b9c9d981551ae41",

"dest": "/tmp/10.1.1.12/tmp/1.txt",

10.1.1.12的在这里

"md5sum": "0d59da0b2723eb03ecfbb0d779e6eca5", "remote_checksum":

"d2911a028d3fcdf775a4e26c0b9c9d981551ae41",

"remote_md5sum": null

}

10.1.1.13 | CHANGED =\> { "changed": true,

"checksum": "b27fb3c4285612643593d53045035bd8d972c995",

"dest": "/tmp/10.1.1.13/tmp/1.txt",

10.1.1.13的在这里

"md5sum": "cd0bd22f33d6324908dbadf6bc128f52", "remote_checksum":

"b27fb3c4285612643593d53045035bd8d972c995",

"remote_md5sum": null

}

第3步: 先删除上面fetch过来的,

然后尝试只fetch其中一台机器的,也会使用名称来做子目录区分

}

"md5sum": "0d59da0b2723eb03ecfbb0d779e6eca5", "remote_checksum":

"d2911a028d3fcdf775a4e26c0b9c9d981551ae41",

"remote_md5sum": null

只fetch一个,也会这样命名

"dest": "/tmp/10.1.1.12/tmp/1.txt",

master# ansible 10.1.1.12 -m fetch -a 'src=/tmp/1.txt dest=/tmp/'

10.1.1.12 | CHANGED =\> { "changed": true,

"checksum": "d2911a028d3fcdf775a4e26c0b9c9d981551ae41",

master# rm /tmp/10.1.1.* -rf

注意: fetch模块也不能从远程拷贝目录到本地

user模块

user模块用于管理用户账号和用户属性。<https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module>

创建aaa用户,默认为普通用户,创建家目录

1 master# ansible group1 -m user -a ‘name=aaa state=present’

创建bbb系统用户,并且登录shell环境为/sbin/nologin

1 master# ansible group1 -m user -a ‘name=bbb state=present system=yes

shell="/sbin/nologin"’

创建ccc用户, 使用uid参数指定uid, 使用password参数传密码

下一句命令注意一下格式,密码要用双引号引起来,单引号的话验证时会密码不正确

master# ansible group1 -m user -a 'name=ccc uid=2000 state=present

password="\$1\$DpcyhW2G\$Kb/y1f.lyLI4MpRlHU9oq0"'

master# echo 123456 | openssl passwd -1 -stdin

\$1\$DpcyhW2G\$Kb/y1f.lyLI4MpRlHU9oq0

创建一个普通用户叫hadoop,并产生空密码密钥对

1 master# ansible group1 -m user -a 'name=hadoop generate_ssh_key=yes'

删除aaa用户,但家目录默认没有删除

1 master# ansible group1 -m user -a 'name=aaa state=absent'

删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录

1 master# ansible group1 -m user -a 'name=bbb state=absent remove=yes'

group模块

group模块用于管理用户组和用户组属性。<https://docs.ansible.com/ansible/latest/modules/group_module.html#group-module>

创建组

1 master# ansible group1 -m group -a 'name=groupa gid=3000 state=present'

删除组(如果有用户的gid为此组,则删除不了)

1 master# ansible group1 -m group -a 'name=groupa state=absent'

cron模块

cron模块用于管理周期性时间任务。<https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module>

创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。

如果

minute,hour,day,month,week不指定的话,默认都为*

master# ansible group1 -m cron -a 'name="test cron1" user=root job="touch

/tmp/111" minute=*/2'

  1. or

  2. master# ansible group1 -m cron -a 'name="test cron1" job="ntpdate

    time1.aliyun.com" minute=0 hour=*/1'

删除cron任务

1 master# ansible group1 -m cron -a 'name="test cron1" state=absent'

yum_repository模块

yum_repository模块用于配置yum仓库。<https://docs.ansible.com/ansible/latest/modules/yum_repository_module.html>

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

master# ansible group1 -m yum_repository -a "name=local

description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"

  1. #name指的是repo文件名及仓库标识名称

  2. #description指源名称

    4

注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱到/mnt目录

  1. # mount /dev/cdrom /mnt

yum模块

yum模块用于使用yum命令来实现软件包的安装与卸载。<https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module>

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

1 master# ansible group1 -m yum -a 'name=vsftpd state=present'

使用yum安装httpd,httpd-devel软件,state=latest表示安装最新版本

1 master# ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest'

使用yum卸载httpd,httpd-devel软件

1 master# ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent'

service模块

service模块用于控制服务的启动,关闭,开机自启动等。<https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module>

启动vsftpd服务,并设为开机自动启动

1 master# ansible group1 -m service -a 'name=vsftpd state=started

enabled=on'

关闭vsftpd服务,并设为开机不自动启动

1 master# ansible group1 -m service -a 'name=vsftpd state=stopped

enabled=false'

练习: 在group1的被管理机里的mariadb里创建一个abc库

1

练习:

假设我主机清单里定义的group1里有多台机器,它们现在要做一个集群。此集群要求实现一个名为hadoop的普通

用户之间的两两免密登录,如何实现(要求只在master上进行操作)?

把另外99个机器的公钥fetch过来

  1. 把这100个公钥全追加放到一个文件/home/hadoop/.ssh/authorized_keys

  2. 把/home/hadoop/.ssh/authorized_keys传到另外99台

ssh-keygen

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号