Ansible简介
Ansible是一个IT自动化配置工具。它能备注系统、部署软件、编排更复杂的IT任务,如连续部署或零停机时间滚动更新。
Ansible特性
- Agentless:不需要在被管理节点上安装插件,只需要有sshd和python即可
- Serverless:在服务端不需要启动任何服务,只需要执行命令就行
- Module in any language:基于模块工作,可以使用任意语言开发ansible模块
- YAML,not code:使用yaml语言定制playbook
- SSH by default:默认使用ssh控制各节点
Ansible基本组件
- 核心模块(Core Modules):这些都是ansible自带的模块
- 扩展模块(Costome Modules):如果核心模块不足以完成某些功能,可以添加扩展模块
- 插件(Plugins):完成模块功能的补充,比如执行完了发个邮件,记录日志等等
- 主机组(Host Inventory):可以选择只在哪些主机上执行playbook
- 剧本(Playbooks):剧本,运行的指令
ansible安装
环境信息
角色 | IP地址 |
---|---|
ansible主控端 | 192.168.10.130 |
ansible被控端 | 192.168.10.131 |
- 权限委派
生产环境下,一般不建议使用root来执行playbook,因为权限太大,万一playbook写错,会导致不可挽回的结果
ALL=(ALL)代表可以在所有机器上变换所有身份执行
vim /etc/sudoers
admin ALL=(ALL) NOPASSWD: /usr/sbin/useradd, /usr/bin/ls
- 关闭防火墙与SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config
- 免密登录
打通ansible主控端到被控端的admin用户免密登录
ssh-keygen
#连续三次回车
ssh-copy-id -i /home/admin/.ssh/id_rsa.pub root@192.168.10.131
#由于秘钥名称和存储路径都是默认的,所以也可以用如下简写命令代替
ssh-copy-id 192.168.10.131
- hosts文件拷贝
# 在主控端hosts里写好所有节点的ip到主机名的映射,然后分发给所有节点
vim /etc/hosts
scp /etc/hosts root@node2:/etc/
- 使用yum安装ansible
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install ansible
ansible --version
ansible配置文件
配置文件优先级
ansible的配置文件名为ansible.cfg
,它一般会存在于四个地方,优先级按顺序排列:
-
ANSIBLE_CONFIG:首先,Ansible命令会检查该环境变量,及这个环境变量将指向的配置文件
-
./ansible.cfg:当前工作目录,即当前执行ansible指令的目录,如果ANSIBEL_CONFIG环境变量未定义,则优先使用该配置文件
-
~/.ansible.cfg:当前用户家目录下的一个隐藏文件,如果当前工作目录下不存在ansible.cfg配置文件,则会查找用户家目录下的该隐藏文件
-
/etc/ansible/ansible.cfg:默认配置文件,如果上面两个路径下的ansible.cfg都不存在,则使用该文件
配置文件详解
vim /etc/ansible/ansible.cfg
#全局配置
[defaults]
#Ansible需要连接管理的主机列表hosts文件路径,默认/etc/ansible/hosts
inventory = /etc/ansible/hosts
#ansible role存放路径,默认/etc/ansible/roles
roles_path = /etc/ansible/roles
#Ansible日志路径,默认/var/log/ansible.log
log_path = /var/log/ansible.log
#SSH连接超时时间,默认10s
timeout = 10
#ansible第一次连接客户端是是否要检查ssh密钥
host_key_checking = False
#ansible执行并发数,默认5
forks = 5
#异步执行任务时查询间隔,默认15s
poll_interval = 15
#执行ansible命令时使用的用户,默认root
sudo_user = root
#远程主机SSH端口,默认22
remote_port = 22
#ansible执行playbook时远程认证用户,默认root
remote_user = root
#Ansible搜寻模块的位置,默认/usr/share/my_modules/
library = /usr/share/my_modules/
module_utils = /usr/share/my_module_utils/
#ansible模块运行语言环境,默认C
module_lang = C
module_set_locale = False
#ansible使用模块,默认command
module_name=command
#提权
[privilege_escalation]
#打开提权
become=True
#提权命令
become_method=sudo
#提取为谁的权限
become_user=root
#是否检查提权密码
become_ask_pass=False
vim /etc/ansible/hosts
[webservers]
192.168.7.1
192.168.7.2
[prod]
192.168.7.1
192.168.7.3
#定义一个prod和webservers的子组,使用it会调用子组,children是固定写法
[it:children]
prod
webservers