ansible自动化运维学习(2)——基本环境部署以及常用模块的使用(Inventory文件配置+ad-hoc指令)

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:配置上网

在这里插入图片描述开启火墙,作为路由作用
在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

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

UseDNS no GSSAPIAuthentication no

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

在这里插入图片描述

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 ##测试运行脚本

在这里插入图片描述

复制成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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

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

6:添加普通用户使用ansible

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

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

cp /etc/ansible/hosts  .

vim hosts
[test]
172.25.78.2

[db]
172.25.78.3

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

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

在这里插入图片描述在这里插入图片描述
设置ssh免密登陆

【server2,server3】配置密码

echo westos | passwd --stdin devops

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

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

在这里插入图片描述在这里插入图片描述 passwd -l devops ##锁定指定devops用户的密码
在这里插入图片描述在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

在这里插入图片描述将本地的文件拷贝到远程主机(test组的主机)的/mnt目录下面
这个是不可以的,因为server1和server2的 免密是devops用户的免密,devops用户对/mnt没有权限

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

在这里插入图片描述

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

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

再次拷贝,发现就成功了
-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

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

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

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

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  ##不认证密码

在这里插入图片描述在这里插入图片描述使用devops的身份去检测

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

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
定义组变量
创建webserver组,批量检测

[test]
172.25.78.2

[db]
172.25.78.3

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

[webserver:vars]
http_port=80

创建webserver组,批量检测
在这里插入图片描述在这里插入图片描述ping test组和db组
在这里插入图片描述!db找出在test组里面但是不在组里db面的主机
&找出在test组里面也在prod组里面的主机
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述server1执行成功
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述 报错,防火墙没有开启
在这里插入图片描述在这里插入图片描述

网页目录访问:
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

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

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  #此参数会返回默认发布目录的文件内容结果,如果不加参数,看不到返回的结果

在这里插入图片描述查看帮助文档
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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"

安装数据库
在这里插入图片描述安装成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值