1、Ansible基础知识与架构
1.1 什么是Ansible
ansible是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
1.2 Ansible的主要功能
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
主要包括:(1)、连接插件connection plugins:负责和被监控端实现通信;(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;(3)、各种模块核心模块、command模块、自定义模块;(4)、借助于插件完成记录日志邮件等功能;(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
1.3 Ansible的特点
1、部署简单,只需在主控端部署ansible环境,被控端无需做任何操作;
2、默认使用SSH协议对设备进行管理;
3、有大量常规运维操作模块,可实现日常绝大部分操作;
4、配置简单、功能强大、扩展性强;
5、支持API及自定义模块,可通过Python轻松扩展;
6、通过Playbooks来定制强大的配置、状态管理;
7、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
8、提供一个功能强大、操作性强的Web管理界面和REST API接口-AWX平台。
1.4 Ansible基础架构
2、Ansible安装与配置
2.1 Ansible安装方式
2.1.1 rpm安装
[root@vm001 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@vm001 ~]# yum -y install ansible
2.1.2 pip安装
[root@vm002 ~]# yum -y install python3 python3-devel python3-pip
[root@vm002 ~]# pip3 install --upgrade pip -i https://pypi.douban.com/simple/
[root@vm002 ~]# pip3 install ansible -i https://pypi.douban.com/simple/
2.1.3 确认安装
[root@vm001 ~]# ansible --version
ansible 2.9.27
[root@vm001 ~]# ansible localhost -m ping #验证是否安装好
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
2.2 Ansible 配置文件
2.2.1 Ansible 配置文件解析
[root@vm001 ~]# rpm -qc ansible
/etc/ansible/ansible.cfg #ansible主配置文件
/etc/ansible/hosts #主机清单文件
[root@vm001 ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts # 配置主机清单路径
#library = /usr/share/my_modules/ #模块存放路径
#module_utils = /usr/share/my_module_utils/ #模块存放路径
#remote_tmp = ~/.ansible/tmp #模块推送至被控端后临时存放路径,被控端执行完成后会删除
#local_tmp = ~/.ansible/tmp #本地模块临时存放路径
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml #插件过滤文件
#forks = 5 # 并发数量
#poll_interval = 15 #多久轮一次
#sudo_user = root
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22 #远程端口
#module_lang = C
#module_set_locale = False
#host_key_checking = False # ssh主机时会提示输入yes/no,这个参数可以设置不提示
2.2.2 Ansible 配置文件优先级
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first
配置优先级:
- 第一步读取:ANSIBLE_CONFIG 这个变量
- 第二步读取:当前项目目录下的ansible.cfg
- 第三步读取: 当前用户家目录下的.ansible.cfg
- 第四步读取: /etc/ansible/ansible.cfg
配置文件优先级演示 :
-
- ANSIBLE_CONFIG
[root@vm001 ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
[root@vm001 ~]# export ANSIBLE_CONFIG=/tmp/ansible.cfg
[root@vm001 ~]# touch /tmp/ansible.cfg
[root@vm001 ~]# ansible --version
ansible 2.9.27
config file = /tmp/ansible.cfg
[root@vm001 ~]# unset ANSIBLE_CONFIG #取消
-
- 当前项目目录下的ansible.cfg,常用
[root@vm001 ~]# mkdir project1
[root@vm001 ~]# cd project1/
[root@vm001 project1]# touch ansible.cfg
[root@vm001 project1]# ansible --version
ansible 2.9.27
config file = /root/project1/ansible.cfg
-
- 为当前用户植入配置文件,不常用
[root@vm001 ~]# touch ~/.ansible.cfg
[root@vm001 ~]# ansible --version
ansible 2.9.27
config file = /root/.ansible.cfg
-
- 默认的配置文件加载路径,优先级最低
[root@vm001 ~]# rm -rf .ansible.cfg
[root@vm001 ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
总结: 实际使用中会为每个项目建立不同的配置文件与主机清单,方便管理。
2.3 Ansible Inventory
2.3.1 Inventory是什么
Inventory 文件主要用来填写被管理主机以及主机组信息;
默认Inventory文件为/etc/ansible/hosts;
也可以自定义文件,当执行ansible命令时使用-i 选项指定Inventory文件位置
2.3.2 Inventory-密码连接方式
1.指定主机IP,端口,用户名,密码
[webservers]
192.168.1.1 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
# 通过域名的简写方式
web[1:10].panpancar.com ansible_ssh_pass '123456'
2.通过变量方式定义密码
[webservers:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass='123456'
2.3.3 Inventory-密钥链接方式
1.创建密钥对,然后推送密钥
[root@jenkins-001 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1
2.配置inventory主机清单
[webservers]
192.168.1.1
192.168.1.2
#定义别名:
web01 ansible_ssh_host=192.168.1.1 ansible_ssh_port=22
web02
2.3.4 使用普通用户管理被控端
说明: ansible使用 user001 普通用户统一管理所有的被控端节点
1、首先控制端、被控端,都要有user001用户
[root@jenkins-001 ~]# useradd user001
[root@jenkins-001 ~]# echo '123' | passwd --stdin user001
2.将控制端的user001用户公钥推送至被控端user001用户下,使普通用户能进行免密码登录
[root@jenkins-001 ~]# su - user001
[user001@jenkins-001 ~]$ ssh-keygen
[user001@jenkins-001 ~]$ ssh-copy-id -p22612 -i .ssh/id_rsa.pub 192.168.1.28
3.所有主机的user001用户必须添加sudo权限
[root@jenkins-001 ~]# visudo
user001 ALL=(ALL) NOPASSWD:ALL
[root@web-002 ~]# visudo -csf /etc/sudoers
/etc/sudoers:解析正确
4.修改/etc/ansible/ansible.cfg主配置文件,配置普通用户提权
[root@jenkins-001 ~]# vim /etc/ansible/ansible.cfg
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
2.4 Ansible相关工具
ansible命令格式:
ansible <host-pattern> [-m module_name] [-a args]
ansible的host-pattern使用:
#指定操作所有组
ansible all -m ping
#通配符
ansible "*" -m ping
ansible 10.0.0.* -m ping
# 与:在webserver组,并且在dbservers中的主机
ansible "webservers:&dbservers" -m ping
# 或:在webservers组,或者在appservers中的主机
ansible "webservers:appservers" -m ping
# 非: 在webservers组,但不在app组中的主机
ansible 'webservers:!apps' -m ping
# 正则表达式:
ansible "~(web|db.*\.panapncar\.com)" -m ping