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
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/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
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;
更多推荐
ansible自动化运维学习(2)——基本环境部署以及常用模块的使用(Inventory文件配置+ad-hoc指令)
发布评论