自动化运维——Ansible

一、自动化运维工具

自动化运维工具可分为两类

1.C/S架构,需要使用代理工具,也就是基于专用的Agent程序来管理,如:Puppet、Func
2.不需要配置代理工具的,可以直接基于ssh服务来完成管理功能,如:Ansible、Fabric

二、Ansible概述

1.Ansible基于Python开发,实现了批量运行命令、程序部署、配置系统等功能
2.Ansible核心组件

1)Ansible core核心引擎
 Host inventory主机清单:用来Ansible管理的主机,默认是在Ansible的host配置文件中定义被管理的主机
 2)connection plugins连接插件:负责和被管理主机实现通信,除支持ssh连接外,Ansible还支持其他连接方式,但需要有连接插件将各个主机连接到Ansible
 3)Playbooks剧本:用来集中定义Ansible任务的配置文件,即将多个任务定义到一个剧本中由Ansible自动执行
 4)Core modules核心模块:是Ansible自带的模块,使用这些模块将资源分配到被管理主机,使其执行特定任务
 5)Custom modules自定义模块:用于完成模块功能的补充,可借助相关插件完成记录日志、发送邮件等功能

二、安装部署Ansible

1.Ansible不在官方的yum源中,下载epel源
yum -y install epel-release
2.修改epel配置文件
vim /etc/yum.repos.d/epel.repo

在这里插入图片描述
将http行的注释取消,注释https行

3.安装Ansible
yum -y install ansible
4.Ansible配置文件

1)主配置文件:/etc/ansible/ansible.cfg
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2)管控主机清单:/etc/ansible/hosts
在这里插入图片描述
[webserver]、[dbserver]是定义的被管理的主机组,也可以直接写ip,不定义组

5.生成秘钥对设置ssh无密码登录
ssh-keygen -t rsa		#生成秘钥对,-t指定加密算法
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.4   #上传公钥并自动导入

root禁止远程登录的可以在hosts文件中添加一下内容

IP ansible_ssh_user=普通用户 ansible_ssh_pass=普通用户密码 ansible_become_user=root ansible_become=true ansible_become_method=su  ansible_become_pass='root密码'

三、Ansible命令应用基础

1.语法:

pansible <host> [-m module_name] [-a args]
<host>:被管理的主机组或ip,所有主机用all代替
[-m module_name]:要使用的模块
[-a args]:模块的参数
ansible-doc:查看模块帮助信息
-l    列出可使用模块
-s+模块名   查看模块的详情和使用示例

四、Ansible模块

1.command模块:ansible管理工具默认使用的模块,用于在被管理主机上运行命令,单纯运行命令使用该模块

例:
在这里插入图片描述
在这里插入图片描述

2.cron模块:用于定义计划任务,有两种状态state:present表示添加,省略状态时默认使用,absent表示移除

例:创建计划任务
在这里插入图片描述

minute:分,图中表示每十分钟执行一次,hour、day、mouth、weekday
job:具体执行的任务
name:对任务的描述,可以不写
删除计划任务:ansible webserver -m cron -a "minute='*/10' job='/bin/echo hello' disabled='yes'"
查看计划任务:ansible webserver -a 'crontab -l'
3.user模块:用于创建新用户和更改、删除已存在用户

例:

创建用户:ansible dbserver -m user -a 'name="user1"
# name:用户名
删除用户:ansible dbserver -m user -a 'name="user1" state=absent'
# 不删除宿主目录
更改用户组:ansible dbserver -m user -a 'name=user1 uid=500 system=yes group=mysql'
4.group模块:用于对用户组进行管理

例:

创建组:ansible 192.168.1.5 -m group -a 'name=mysql gid=306 system=yes'
删除组:ansible 192.168.1.5 -m group -a 'name=mysql gid=306 system=yes state=absent'
5.copy模块:用于实现ansible与被管理主机文件复制和批量下发
src:本地源路径
dest:被管理主机路径
例:
复制:ansible dbserver -m copy -a 'src=/root/123.test dest=/root/'	
将数据写入某个文件(会覆盖原数据):ansible dbserver -m copy -a 'content="1234567" dest=/root/桌面/123.test
6.file模块:设置文件属性、设置连接文件
owner:属主
group:属组
mode:权限
path:路径
例:
ansible dbserver -m file -a 'owner=mysql group=mysql mode=644 path=/root/桌面/123.test'
#设置属主、属组、权限
ansible dbserver -m file -a 'path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'
#设置文件fstab.link为fstab.ansible的连接文件
7.ping模块:检测指定主机的连通性
例:ansible all -m ping

在这里插入图片描述

8.service模块:控制管理服务的运行状态
enable:是否开机自动启动,取值为true或false
name:服务名
state:服务状态,started、stoped、restarted、status
例:
ansible 192.168.1.5 -a 'service httpd status'
 #查看httpd的状态
ansible dbserver -m service -a 'enable=true name=httpd state=started'
 #启动httpd并设为开机启动
9.shell模块:可以在被管理主机上运行命令,并支持像管道等功能的复杂命令
例:
ansible dbserver -m shell -a 'echo 123456 | passwd --stdin user1'
#给用户设置密码
10.script模块:将本地脚本复制到被管理主机上运行,使用相对路径来指定脚本
例:ansible dbserver -m script -a 'test.sh'
11.yum模块:负责在被管理主机上安装和卸载软件包,需要在被管理主机上配置yum仓库
name:指定安装的软件包及其版本号
state:软件包的状态,present、latest表示安装(默认安装),absent表示卸载
例:
安装:ansible webserver -m yum -a 'name=httpd'
卸载:ansible webserver -m yum -a 'name=httpd state=absent'
12.setup模块:收集、查看被管理主机的facts(ansible采集被管理主机设备信息的一个功能),每个被管理主机在接受并运行管理命令之前,都会向管理主机发送自己的相关信息
例:ansible dbserver -m setup

四、YAML介绍

1.YAML是一种用来表达资料序列的格式,是一种标记语言
2.YAML语法

1)文件的第一行应该以"—”(三个连字符)开始,表明YMAL文件的开始。
2)在同一行中,#之后的内容表示注释,类似于shell, python和ruby。
3)YMAL中的列表元素以”-”开头然后紧跟着-一个空格,后面为元素内容。
4)同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。

3.常用数据类型

1)list:列表(list)的所有元素均使用“-”开头

如:
	-Apple
	-orange
	-mango

2)dictionary:字典(dictionary)通过key与value进行标识

如:
	name:zhangsan
	job:techear
也可以使用key:value的形式放置于{}中
如:
	{name:zhangsan,job:techear}

五、ansible基础元素介绍

1.inventory(主机清单)

1)系统默认/etc/ansible/hosts
2)主机清单可以设置为多个,且同个主机可添加到不同的组中
3)默认ssh端口管理。若非ssh端口管理,可以在主机名后同冒号加端口号来表示,如:

db2.kgc.org:223

4)如果被管理主机由规则的命名,可以用列表的方式表示,如:

www[01:05].kgc.org
www-[a:f].kgc.org
2.inventory几个重要的概念

1)主机变量:可以在定义主机时添加主机变量,便于在playbook中使用,如:

[webservers]
www1.kkk.com http_port=80 maxRequestsChild=808
www2.kkk.com http_port=8080  maxRequestsChild=909

2)组变量:给指定主机设置可以在playbook中直接使用的变量,如:

[servers-vars]
ntp_server=ntp.kgc.crg
nfs_server=nfs.kgc.org

3)组嵌套:在inventory中的组可以嵌套其他的组,只能在playbook中使用,如:

[apache]
http1.kkk.org
http2.kkk.org
[nginx]
nginx1.kkk.org
nginx2.kkk.org
[wenserver:children]
apache
nginx

4)inventory参数:ansible基于ssh连接inventory中的主机时,还可通过参数指定交互方式
参数 含义

在这里插入图片描述
如果不配置SSH密钥认证,就可以这样对被管理主机进行认证:

vim /etc/ansible/hosts
	[websrvs]
	192.168.1.6 ansible_ssh_user=root ansible_ssh_pass=redhat
3.变量:在Ansible中变量名仅能由字母、数字和下划线组成,并且只能以字母开头。 可以使用两种方式来传递Ansible变量。

1)通过命令行传递变量
 在运行playbook的时候,可以通过命令行的方式来传递一些变量提供给playbook
使用,如:

ansble-playbook test.yml -extra-vars "hots-www use-mageedue"

2)通过roles传递变量
  当给一个主机应用角色(roles)的时候可以传递变量,然后在角色内使用这些变量,
如:

-hosts: webservers
roles:
	-common
	-{role:foo_app_instance,dir:'/web/htdocs/a.com',port:8080}
4.条件测试

如果需要根据变量、facts或之前任务的执行结果来作为某task执行与否的前提时,就要用到条件测试语句
1)when 语句
 使用条件测试只需要在task之后添加when语句就可以,when语句支持jinja2表语法,如:

tasks:
    -name:"shutdown Debin flavored systems"
	 command: /sbin/shutdown -h now
	 when:ansible_os_family -"Debian"

when语句中还可以使用jinja2的大多“fiter”,例如要忽略此前某语句的错误并其结果(failed或者success) 去运行后面指定的语句,可以使用类似示例如下:

tasks:
    - command: /bin/false
	    register: result
		ignore_errors: True
	 -command: /bin/something
		when: result|success
	-command: /bin/still/something_else
		when: resutlskipped
此外,when语句中还可以使用facts或Playbook中定义的变量,条件测试的简单示例如下:
```p
vim cond.yml
	- hosts: all
	  remote_user: root
   vars:
	- username: user10
   tasks:
    - name: create {{usermame}}user
	  user: name={{ usemame }
	  when: ansible_fqdn == "node4"
ansible-playboo cond.yml

2)迭代
当需要去执行重复任务时,可以使用迭代机制,直接将需要迭代的内容定义为item变量并进行引用,然后通过with_items 语句来指明迭代的元素,如:

-name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
	-testuser1
	-testuser2

从功能上来说,上面的语句等同于下面的语句:

-name: add user testuser1
  user: name=testuser1 state=present groups=wheel
-name: add user testuser2
  user: name= testuser2 state=present groups=wheel

定义循环列表with items 如下:

-apache
-php
-mysql-server

注意with items 中的列表值也可以是字典,但引用时需要使用item.KEY格式

-{ name: apache,conf: conffiles/httd.conf}
-{ name: php,conf: conffiles/php.ini}
-{ name: mysl-server,conf: conffiles/my.cnf}

事实上,在with items中可以使用的元素还可为hashes,如:

-name: add several users
user: name={{ item.name }} stat=present groups={{ item.goups }}
with_items:
-{ name: 'testuser1,groups:'wheel'}
-{ name: 'testuser2,groups:'root'}

六、Playbook介绍

Plavbook是由一个或多个play组成的列表主要功能是将task定义好的角色归并为一组进行统一管理,也就是通过task调用Ansible的模板将多个play组织在一个Playbook中运行。

1.Playbooks本身由以下各部分组成:

1)Tasks: 任务,即调用模块完成的某操作;
2) Variables: 变量;
3) Templates: 模板;
4) Handers:处理器,当某条件满足时,触发执行的操作
5) Roles:角色
例:

-hosts: webnodes		#定义的主机组,即应用的主机
	 vars:		#定义变量
		 	http_port:80
			max_clients:256
		 	remote_user:root
tasks:		#执行的任务
		-name: ensure apache is at then lastest version
		 yum: name=httpd sates=tarted
handlers:		#处理器
		 -name: restart apache
		 service: name= httpd sate restarted

6)play中hosts, variables, roles, tasks等对象的表示方法都是键值中间以”:”分隔表示,":” 后面还要增加一个空格
例:

vim test. yml
	- var iables:
	- hosts: websrvs
	  remote_ user: root
	  tasks:
			   - name: install mysql- server package  #描述
				 yum:
			   - name=mysql-server state=persent
				 name: starting mysqld service
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值