Ansible基础
Ansible介绍
什么是ansible
Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命
令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
同类型软件对比
1.puppet 学习难,安装ruby环境难,没有远程执行功能
2.ansible 轻量级,大规模环境下只通过ssh会很慢,串行的
3.saltstack 一般选择salt会使用 C/S 结构的模式, salt-master 和 salt-minion ,并行的,大规模批量操作的情况
下,会比Ansible速度快一些,底层使用的是 zero-MQ 消协队列
自动化运维优势
1.提高工作效率
2.提高工作准确度
3.减少维护成本
4.减少重复性工作
Ansible优缺点
优点
1.远程执行 批量执行远程命令,可以对多台主机进行远程操作
2.配置管理 批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
3.事件驱动 通过Ansible的模块,对服务进行不同的事件驱动
比如: 1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理
4.管理公有云 通过API接口的方式管理公有云,不过这方面做的不如 saltstack . saltstack本身可以通过saltcloud管
理各大云厂商的云平台。
5.二次开发 因为语法是Python,所以便于运维进行二次开发。
6.任务编排 可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
7.跨平台,跨系统 几乎不受到平台和系统的限制,比如安装 apache 和启动服务
缺点
1.受到ssh的限制,一旦ssh无法启动,ansible也就无法运行
2.串行执行任务,遇到千级服务器时运行较慢
Ansible的架构
模块
1、连接插件 connection plugins 用于连接主机 用来连接被管理端
2、核心模块 core modules 连接主机实现操作, 它依赖于具体的模块来做具体的事情
3、自定义模块 custom modules 根据自己的需求编写具体的模块
4、插件 plugins 完成模块功能的补充
5、剧本 playbook ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6、主机清单 inventor 定义ansible需要操作主机的范围
注意:最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块
Ansible执行流程
1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。
安装ansible
环境准备
主机 | 角色 | 外网IP | 内网IP |
---|---|---|---|
m01 | Ansible管理端 | 10.0.0.61 | 172.16.1.61 |
lb01 | Ansible被管理端 | 10.0.0.5 | 172.16.1.5 |
lb02 | Ansible被管理端 | 10.0.0.6 | 172.16.1.6 |
web01 | Ansible被管理端 | 10.0.0.7 | 172.16.1.7 |
web02 | Ansible被管理端 | 10.0.0.8 | 172.16.1.8 |
nfs | Ansible被管理端 | 10.0.0.31 | 172.16.1.31 |
backup | Ansible被管理端 | 10.0.0.41 | 172.16.1.41 |
db01 | Ansible被管理端 | 10.0.0.51 | 172.16.1.51 |
安装
# 1.安装ansible
[root@m01 ~]# yum install -y ansible
# 2.ansible的配置文件
[root@m01 ~]# vim /etc/ansible/ansible.cfg
# 3.ansible配置文件读取顺序
1、$ANSIBLE_CONFIG
2、./ansible.cfg
3、~/.ansible.cfg
4、/etc/ansible/ansible.cfg
# 4.ansible配置文件
[root@m01 ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
#poll_interval = 15 #对于Ansible中的异步任务, 这个是设置定义,当具体的pollinterval 没有定义时,多少时间回查一下这些任务的状态, 默认值是一个折中选择15秒钟.这个时间是个回查频率和任务完成叫回频率和当任务完成时的回转频率的时钟。
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志
Ansible Inventory(主机清单)
/etc/ansible/hosts 是ansible默认主机资产清单文件,用于定义被管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息。Inventory文件中填写需要被管理的主机与主机组信息。还可以自定义Inventory主机清单的位置,使用-i指定文件位置即可。
ansible 语法
anisble [主机名] -m 指定模块
ansible all -m ping
ansible连接方式
---------------------------------------方式一:基于密码连接 ----------------------------------------
[root@m01 ~]# vim /etc/ansible/hosts
[zls_web]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=‘1‘
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=‘1‘
[zls_db]
172.16.1.51 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=‘1‘
[zls_lb]
172.16.1.5 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=‘1‘
172.16.1.6 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=‘1‘
[zls_nfs]
172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=‘1‘
[zls_backup]
172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=‘1‘
--------------------------------------方式二:基于主机名连接(变量) ----------------------------------
[webs]
web0[1:2]
[webs:vars]
ansible_ssh_pass=‘1‘
ansible_ssh_user=root
ansible_ssh_port=22
-------------------------------------ansible连接方式三:基于秘钥连接 ---------------------------------
# 1.在ansible管理端生成秘钥对
[root@m01 ~]# ssh-keygen
# 2.下发公钥
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.5
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.6
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.51
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.61
# 3.主机清单
[root@m01 ~]# vim /etc/ansible/hosts
[xxx]
172.16.1.7
172.16.1.8
172.16.1.5
172.16.1.6
172.16.1.31
172.16.1.41
172.16.1.51
[root@m01 ~]# ansible xxx -m ping
-------------------------------------方式四:主机名+IP+免密 -------------------------------------------
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[lb_group]
lb01 ansible_ssh_host=172.16.1.5
lb02 ansible_ssh_host=172.16.1.6
[nfs_group]
nfs ansible_ssh_host=172.16.1.31
[bakcup_group]
backup ansible_ssh_host=172.16.1.41
[db_group]
db01 ansible_ssh_host=172.16.1.51
Ansible的常用模块
ansible的执行
ad-hoc
playbook
ansible ad-hoc
ad-hoc:临时的命令,执行后结束,不会保存
** 使用场景**
比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等
ad-hoc的命令模式(语法)
语法:
ansible 主机名(主机清单中的主机名或者主机组) -m 模块名 [-a 动作]
ac-hoc返回结果的颜色
绿色:被管理端执行成功,并且结果不会发生改变
黄色:被管理端执行成功,但是结果是变化的
红色:执行失败,注意看报错
ansible帮助手册
ansible-doc 模块名
ansible模块
command
ansible web_group -m command -a ‘命令(不带特殊符号)‘
shell
ansible web_group -m shell -a ‘命令‘
script
# ansible远程执行脚本
ansible web_group -m script -a ‘/root/a.sh‘
ansible软件管理模块
yum
yum
- name:
- 直接指定包名:从仓库安装 yum install httpd
- http:// 从指定URL安装 yum install http://mirrors.aliyun.com/epel/http1.1.rpm
- file:// 从本地安装 类似 yum localinstall /root/http-1.1.rpm
- state
- absent:卸载
- present:安装
- lastest:安装最新版本
- download_only:
- true:只下载不安装
- false:下载并安装
-list
- 包名
"yumstate": "available" 证明包可以安装但是没装
"yumstate": "installed" 已经安装了
exclude=kernel*,foo* #排除某些包
list=ansible #类似于yum list查看是否可以安装
disablerepo="epel,ol7_latest" #禁用指定的yum仓库
yum_repository
## 创建新的仓库配置文件
ansible db01 -m yum_repository -a ‘name=local description=xxx baseurl=file:///mnt
gpgcheck=no enabled=yes‘
## 创建新的仓库配置,并且文件名和仓库名不同
ansible web01 -m yum_repository -a ‘name=local file=zls_local description=xxx
baseurl=file:///mnt gpgcheck=no enabled=yes‘
## 追加仓库
ansible lb01 -m yum_repository -a ‘name=test2_ansible file=test_ansible
description=xxx baseurl=http://www.baidu.com‘
## 删除仓库
ansible lb01 -m yum_repository -a ‘name=test2_ansible file=test_ansible state=absent‘
yum_repository
- name:仓库名字(如果有file,只是仓库名,如果没有file,文件名和仓库名)
- file:指定仓库的文件名
- description:仓库的描述(name)
- baseurl:仓库的url
- gpgcheck:
- no:不开启 0
- yes:开启 1(默认)
- enabled:
- no:不开启 0
- yes:开启 1 (默认)
copy
## 远程推送文件
ansible nginx -m copy -a ‘src=/etc/passwd dest=/root‘
copy
- src:指定源文件的路径
- dest:指定目标路径
- owner:指定属主
- group:指定属组
- mode:指定权限
- backup:
- yes:如果目标路径,存在同名文件,就将目标文件备份
- no:不备份直接覆盖(默认)
- content:将指定文本内容覆盖到目标文件中
- remote_src:将命令变成cp
- yes:将源文件,编程远端的源文件(ansible被管理端)
- no:源文件还是本地文件(ansible管理端 默认)
- follow:拷贝软连接
- yes:会将软连接一起拷贝
- no:会生成一个新的软连接文件