Ansible简介

必须掌握:ansible(CE考)

ansible命令使用场景:

非固化需求
临时一次性操作
二次开发接口调用
Ansible基于Python语言实现,由paramiko和PyYAML两个关键模块构建。Ansible的编排引擎可以出色地完成配置管理,流程控制,资源部署等多方面工作。

ansible主要承担的工作有以下几种:

配置管理
    服务即时开通
    应用部署
    流程编排
    监控告警
    日志记录

Ansible公司负责Ansible开源软件的维护,管理

Ansible架构模式

Ansible维护模式通常由控制机和被管理机组成。因为Ansible的特性不像其他运维工具那样需要在被监控的目标上安装agent,所以我们的侧重点只需要放在安装了Ansible的服务器上(当然用于实验环境的话可以是一台笔记本,台式机或者仅仅只需要一台虚拟机即可)。

Ansible可以通过SSH进行远程链接到对端主机上,然后执行想要执行的playbook或者指令。所有的远程主机都可以在inventory中被定义。

Ansible中最亮眼的是集配置,部署,自动化于一身的playbook,playbook是ansible的核心,先掌握ansible的基本使用方式,再去掌握playbook

变量的检索位置

Playbook中vars目录下的文件
Roles中vars目录下的文件
Roles同级目录group_vars和hosts_vars目录下的文件
设置变量时尽量沿用同一种方式,以方便维护人员管理
Inventory文件配置
Inventory是Asible管理主机信息的配置文件,相当于系统HOSTS文件的功能,
默认路径/etc/ansible/hosts
【】Ansible命令
ansible使用模块来完成任务,比如安装软件,复制文件以及使用模板。
模块aret the way to use absible, 因为模块可以使用上下文来确定完成任务需要做些什么。
如果没有模块,我们只能运行shell命令,其实是使用的shell模块

ansible参数详解

-m:要执行的模块,默认为command
 -a:给模块传递参数
 -b 成为另一个用户
 --become-user=root 以用户root运行命令
 -u:ssh连接的用户名,默认用root,ansible.cfg中可以配置
 -k:提示输入ssh登录密码,当使用密码验证的时候用到
 -s:sudo运行(sudo可以指定哪些用户拥有root权限)
 -U:sudo到哪个用户,默认为root
 -K:提示输入sudo密码,当不是NOPASSWD模式时使用
 -C:只是测试一下会改变什么内容,不会真正去执行
 -c:连接类型(default=smart)
 -f:fork多少进程并发处理,默认为5个
 -i:指定hosts文件路径,默认default=/etc/ansible/hosts
 -I:指定pattern,对已匹配的主机中再过滤一次
 --list-host:只打印有哪些主机会执行这个命令,不会实际执行
 -M:要执行的模块路径,默认为/usr/share/ansible
 -o:压缩输出,摘要输出
 --private-key:私钥路径
 -T:ssh连接超时时间,默认是10秒
 -t:日志输出到该目录,日志文件名以主机命名
 -v:显示详细日志

举例:
1:以devops用户执行ping存活检测
ansible  all -m ping -u devops
 
2:以devops sudo至root(默认拥有root权限)执行ping存活检测
ansible  all -m ping -u devops -b

3:以devops sudo至user1(指定有user1权限)执行ping存活检测
ansible  all -m ping -u devops -b --become-user user1


【】指定执行机器
 定义主机和组
遵循从上到下依次匹配,逐级过滤。
Inventory可以直接为ip地址
172.25.78.2
端口号不是默认22端口时,可明确的表示为
server2:2222
server2 ansible_port=2222 ansible_host=172.25.78.2

[]表示一个组,以可以表示一个范围
[test]
www[1:10].example.com
172.25.78.2
172.25.78.3

【】定义主机变量:
在Playbook中使用时对主机进行个性化定制
[test]
172.25.78.2
172.25.78.3

[webserver:vars]  ##使用80端口
http_port=80

定义组变量
[test]
172.25.78.2

[db]
172.25.78.3

[webserver:children]   ##即包含test和db两个组
test
db

Ansible与正则

A 指定A组
A:B 指定A和B两个组
A:!B 指定在A组但不在B组
A:&B 指定同时在A组和B组
例如:
在test组但不在db组的主机,用感叹号表示
ansible "test:!db" -m ping

匹配所有主机,all与"*"功能相同:
ansible '*' -m ping
ansible all -m ping 
匹配172.25.78.*网段的所有主机:
ansible 172.25.78.* -m ping

前面是简单的介绍,下面进行实例进行深刻的认识

Ansible安装与配置

三台虚拟机
server1:配置上网

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql

开启火墙,作为路由作用

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_02

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_03

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_04

1: 添加EPEL源,yum方式安装ansible
vim /etc/yum.repos.d/epel.repo

[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/  ##国内源比较快
gpgcheck=0

yum clean all
yum repolist

yum install ansible -y

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_05

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_06

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_07

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_08

2:查看主配置文件:
vim /etc/ansible/ansible.cfg
cd /etc/ansible/ --> ls

/etc/ansible/ansible.cfg    #主配置文件,配置ansible工作特性
/etc/ansible/hosts          #主机清单
/etc/ansible/roles/         #存放角色的目录

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_09

vim hosts  ##在文件末尾加入组
#不加组会默认一个组
[test]
172.25.78.2
172.25.78.3

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_10

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_11

3:
ansible test -m ping  ##会出错,因为没有输入密码

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_12

ansible test -m ping -k  ##提示输入密码,,通过对一组服务器进行存活性检测
#检测主机的存活,返回ping则是正常,这里使用了-m参数,采用ping模块进行检测目标主机的存活性

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_13

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_14


#PS:这里需要注意的是,远程连接采用的不是单纯的ping命令,如果没有做ssh密钥认证,是会出现无法ping通的错误,此时可以采用-k参数,默认执行使用root用户进行连接远程主机。

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_15

在使用ansible时,我们会发现ssh链接较慢的现象,这里则需要修改sshd服务的两个参数来解决该问题:

UseDNS no GSSAPIAuthentication no

-a:给模块传递参数
ansible test -a hostname -k ##获取test组的主机名称,-a 给模块传递参数
ansible test -a uptime -k ##获取test组的主机时间

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_16

4:使用脚本
vim /etc/ansible/test.sh
#!/bin/bash
echo "hello word"

ansible test -m copy -a "src=test.sh dest=/tmp/test.sh mode=755" -k 
##将当前目录的test脚本复制到test组包含的主机/tmp/目录下,并且加入755权限,否则运行脚本时会报错没有权限

ansible test -m shell -a "/tmp/test.sh" -k ##测试运行脚本

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_17

复制成功

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_18


ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_19


ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_20

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_21

5:【server1】【server2】【server3】都加devops用户
	为了方便不输入密码-k,则用普通用户去做实行免密
	useradd devops
	id  devops

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_22

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_23

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_24

为了安全起见,在三台主机上创建新的用户,并且在server1创建用户完成之后,创建ansible目录,进行试验

6:添加普通用户使用ansible

【server1】用普通用户去做
vim /etc/ssh/sshd_config ##超户下查看配置文件
切换到devops用户
su - devops
mkdir ansible
cd ansible
vim ansible.cfg  编辑ansible主配置文件
[defaults]
inventory = ./hosts  管理主机的清单

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_25

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_26

cp /etc/ansible/hosts  .

vim hosts
[test]
172.25.78.2

[db]
172.25.78.3

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_27

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_28


ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_29


ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_30

ansible test -m ping -k  ##会报错密码问题,需要免密

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_31

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_32


设置ssh免密登陆

【server2,server3】配置密码

echo westos | passwd --stdin devops

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_33

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_34

【server1】主机之间免密
server1与server2,3之间做免密
ssh-keygen
ssh-copy-id 172.25.78.2  ##输入密码westos
ssh-copy-id 172.25.78.3

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_35

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_36

passwd -l devops ##锁定指定devops用户的密码

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_37

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_38

测试:
ssh 172.25.78.2  ##不需要做输入密码,即可登陆成功,则免密成功
ssh 172.25.78.3

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_39

ansible test -m ping  ##在不需要-k参数下,直接ping出结果
ansible db -m ping

ansible '*' -m ping
ansible all -m ping  和"*"一样,都表示所有主机

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_40

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_41

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_42

ansible test -m copy -a "src=hosts dest=/tmp/hosts" 
ansible test -a "ls /tmp"  
将本地的文件拷贝到远程主机(test组的主机)的tmp目录下面
这个是可以的,因为远程主机的devops用户对tmp目录有权限

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_43

将本地的文件拷贝到远程主机(test组的主机)的/mnt目录下面

这个是不可以的,因为server1和server2的 免密是devops用户的免密,devops用户对/mnt没有权限

ansible test -m copy -a "src=hosts dest=/mnt/hosts"  
ll -d /mnt/
##报错权限问题,因为server2的/mnt权限为755,devops用户不能进行读写操作

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_44

在server2和server3上面授权,使devops具备root用户的权限
【server2,3】给devops用户设置权限,编写配置文件
	visudo:好处就是有语法检测
	visudo
	93:devops  ALL=(ALL)       NOPASSWD: ALL

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_45


ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_46

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_47

再次拷贝,发现就成功了
-b表示自动由devops用户转为root用户,
【server1】再次测试
	cd /home/ansible
	id
	ansible test -m copy -a "src=hosts dest=/mnt/hosts"  -b
	##-b 不提示密码,不加参数会报错
	也可以加入指定用户(意义是一样的)
	ansible test -m copy -a "src=hosts dest=/mnt/hosts" -u devops -b

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_48


ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_49

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_50

现在不想使用-b转换身份,想直接默认使用root身份
 
vim /etc/ansible/ansible.cfg  ##可以进行复制
340行:

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_51

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_52

vim ansible.cfg
[defaults]
inventory = ./hosts     ##读取当前目录下的hosts文件
remote_user = devops   ##表示以devops用户进行远程(remote)登陆

[privilege_escalation]
become=True   ##打开become开关
become_method=sudo ##将普通用户切换到root
become_user=root    ##设置为root用户
become_ask_pass=False  ##不认证密码

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_53

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_54

使用devops的身份去检测

- u表示指定用户
可以看出以devops用户的身份去ping远程主机的devops用户是可以的
以devops用户的身份去ping远程主机的root用户是不可以的
记住:这里的用户指的都是远程主机的用户

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_55

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_56


ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_57


定义组变量

创建webserver组,批量检测

[test]
172.25.78.2

[db]
172.25.78.3

[webserver:children]   ##即包含test和db两个组
test
db

[webserver:vars]
http_port=80

创建webserver组,批量检测

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_58

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_59

ping test组和db组

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_60

!db找出在test组里面但是不在组里db面的主机

&找出在test组里面也在prod组里面的主机

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_61


ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_62

ansible的并发特性

ansible和Ansible-Playbook默认会fork 5个线程并发执行命令,如果同时操作的主机比较多的话,可以调整到一个更大的值
ansible有许多模块,默认是command,也就是命令模块,我们可以通过-m选项指定不同的模块

远程安装httpd并开启

【server1】
ansible test -m yum -a "name=httpd state=present"  ##安装
ansible test -m service -a "name=httpd state=started"  ##开启
测试:【server2】
ps ax | grep httpd

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_63


ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_64

server1执行成功

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_65

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_66


ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_67

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_68

例如:防火墙
##查看有关firewall的命令
ansible-doc firewall  ##进去以后输入firewall,会找到有关帮助

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_69

##开机自启(注意!!!开启server2的防火墙后再开机自启)
ansible test -m firewalld -a "service=http state=enabled"

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_70

报错,防火墙没有开启

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_71

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_72

网页目录访问:
server1:
cd /home/devops/ansible/
mkdir apache
vim apache/index.html
www.westos.org
ansible test -m copy -a  "src=apache/index.html dest=/var/www/html"
server2:
iptables -L

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_73

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_74

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_75

server2:查看
cd /var/www/html/
cat index.html 

server1:进行访问
ansible test -m uri -a "url=http://172.25.78.2 return_content=yes"
return_content=yes  #此参数会返回默认发布目录的文件内容结果,如果不加参数,看不到返回的结果

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_76

查看帮助文档

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_77


ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_78

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_79


ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_80

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_81

mysql_user模块:

server1远程安装:
ansible test -m yum -a "name=mariadb-server"
ansible-doc service  ##查看相关帮助
启动数据库 
ansible test -m service -a "name=mariadb state=started"

server2:查看
ps aux
 
server1: 
创建数据库:
ansible-doc mysql_db  ##查看帮助
ansible test -m mysql_db -a "name=westos state=present"

安装数据库

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_82

安装成功

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_83


ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_84


ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_85

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_86


ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_87

远程主机需要安装MySQL-python
	server2安装:
	yum install MySQL-python -y
	也可以在server1
	ansible test -m yum -a "name=MySQL-python state=present"

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_88

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_89

server2查看:
mysql   ##进入数据库
show databases;

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_90

server1创建数据库用户并且授权
ansible-doc mysql_user
ansible test -m mysql_user  -a "name=hd password=westos priv='westos.*:ALL' state=present host=%"

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_91

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_92

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_93

server2查看:
select * from mysql.user where user='hd'\G;

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_94

ansible自动化运维技术教材电子版 ansible自动化运维实例_Ansible_95

ansible自动化运维技术教材电子版 ansible自动化运维实例_mysql_96

ansible自动化运维技术教材电子版 ansible自动化运维实例_vim_97

ansible自动化运维技术教材电子版 ansible自动化运维实例_ansible自动化运维技术教材电子版_98