目录
1. ansible简介
2. ansible特点
3. ansible程序的目录结构
4. ansible的执行
5. ansible的安装
6. ansible的部署
6.1 构建ansible清单
6.2 ansible的使用
7. 管理ansible文件
7.1 配置ansible文件
7.2 运行临时命令
7.3 ansible模块
8. 实验
Ansible是一种IT自动化工具
Ansible可以配置系统、应用部署、执行特定任务的开源平台,它基于python语言,由paramiko、PyYAML关键模块构建
Ansible集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能
Ansible是基于模块工作,本身没有批量部署的能力,真正具有批量部署的是ansible所运行模块
Ansible只是一种框架,ansible不需要在远程主机上安装client/agents,因为它是基于ssh来连接受管主机和远程主机通讯
常见自动化运维工具技术特性比较:
项目 | Puppet | SaltStack | Ansible |
开发语言 | Ruby | Python | Python |
是否有客户端 | 有 | 有 | 无 |
是否支持二次开发 | 不支持 | 支持 | 支持 |
服务器和远程机器是否相互验证 | 是 | 是 | 是 |
服务器和远程机器的通信是否加密 | 是·标准的SSL协议 | 是·使用AES加密 | 是·使用OpenSSH |
平台支持 | AIX,BSD,HP-UX,Linux,Mac OSC,Solaris,Windows | BSD,Linux,Mac OS X,Solaris,Windows | AIX,BSD,HP-UX,Linux,Mac OS X,Solaris |
是否支持Web UI | 提供 | 提供 | 提供·但是是商业版本 |
配置文件格式 | Ruby语法格式 | YAML | YAML |
命令行执行 | 不支持·可以通过配置模块实现 | 支持 | 支持 |
优点
配置文件: /etc/ansible/
执行文件目录: /usr/bin/
lib依赖库: /usr/lib/python2.7/site-packages/ansible/
help文件: /usr/lib/python2.7/site-packages/ansible
ansible主要组成部分
ansible任务执行模式
实验环境
## 执行以下命令启用EPEL仓库
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
## 安装ansible python sshpass等工具
sudo dnf install ansible -y
ansible --version
ansible -m setup localhost | grep ansible_python_version
清单:指的是定义了ansible将要管理的一批主机的文件
输入主机名或IP
workstation.dsd.com
192.168.43.40
定义主机组
[webservers]
servera.dsd.com
serverb.dsd.com
192.168.43.20
[dbservers]
node1.dsd.com
node2.dsd.com
定义嵌套组
[servers:children]
webservers
dbservers
通过范围简化主机规格(可以指定主机名称或IP范围或者数字和字母范围)
#yufa:[START:END]
192.168.[0:43].[1:254] # 192.168.0.0/24,192.168.1.0/24 ... 192.168.4.0/24
server[01:10].example.com # server01.example.com ... server10.example.com
[a:c].example.com # a.example.com ... c.example.com
ansible workstation.dsd.com --list-hosts ## 当前主机中没有受管主机
在主机workstation.dsd.com的hosts中添加servera
vim hosts
###
servera.dsd.com
[webservers]
serverb.dsd.com
###
ansible all --list-hosts ## 查看所有的host
ansible webservers --list-hosts ## 查看webservers组中的host
ansible ungrouped --list-hosts ## 查看所有不在组中的host
这里我们用servera测试
cd deploy-inventory/
ansible all -m ping
vim /etc/hosts
###
192.168.43.40 servera.dsd.com
###
# 免密操作
ssh-keygen ## 生成密钥
ssh-copy-id [email protected] ## 上传密钥
ansible all -m ping
但是这里会牵扯到一个问题,我们将所有的host都放在/etc/ansible/hosts默认清单中,会造成我们大家都要使用,但是清单供不应求的情况。
mkdir deploy-inventory ## 建立清单目录,专门用来存放inventory
cd deploy-inventory/
ansible all -i inventory --list-hosts ## 添加host前,查看内部是否已经存在host
vim inventory
###
[webservers]
servera.dsd.com
###
ansible all -i inventory --list-hosts
/etc/ansible/ansible.cfg ## 基本配置文件,若找不到其他配置文件,则使用该配置文件
~/.ansible.cfg ## 如果存在此配置并且当前工作目录中也没有ansible.cfg,此文件替代/etc/ansible/ansible.cfg
./ansible.cfg ## 执行ansible命令的目录中如果有ansible.cfg,直接使用该ansible.cfg(推荐使用)
[defaults] ## 部分设置ansible操作的默认值
[privilege_escalation] ## 配置ansible如何在受管主机上执行特权升级
vim deploy-inventory/ansible.cfg
###
[defaults]
inventory = ./inventory
remote_user = westos
ask_pass = false
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
###
优点:临时命令可以快速测试和更改,无需编写playbook
## 命令格式 ##
ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
## 检查能否在受管主机上运行python模块 ##
ansible all -m ping
## 使用临时命令通过模块执行任务 ##
ansible-doc -l ## 列出所有模块
ansible-doc ping ## 查看ping模块帮助文档
-copy:将本地文件复制到受管主机
-file:设置文件的权限和其他属性
-lineinfile:确保特定行是否在文件里
-synchronize:使用rsync同步内容
-firewalld:使用firewalld管理任意端口和服务
-reboot:重启
-service:管理服务
-user:添加、删除和管理用户账户
-get_url:通过http、https或者ftp下载文件
-nmcli:管理网络
-uri:与web服务交互
练习:使用user模块确保student用户存在于servera.lab.example.com且uid为1000
ansible -m user -a 'name=westos uid=1000 state=present' servera.dsd.com
## 受管主机上
ansible webservers -m command -a /usr/bin/hostname
ansible webservers -m command -a /usr/bin/hostname -o #加上-o参数,单行显示
##
command模块允许执行远程命令,但这些命令不是shell处理,所以无法访问shell环境变量,所以不能执行重定向、传送等操作
ansible localhost -m command -a set
## 运行结果:
servera.dsd.com | CHANGED | rc=0 >>
servera.dsd.com
ansible localhost -m shell -a set
## 运行结果:
localhost | CHANGED | rc=0 >>
BASH=/bin/sh
ansible localhost -m command -a 'id'
ansible localhost -m command -a 'id' -u westos ## 通过-u选项使用student进行连接并执行id命令
## 注意:执行上面两条命令时,需要在新建的目录中执行,否则结果不会变
## 首先使用westos用户,因为westos用户没有写权限,会导致失败
ansible localhost -m copy -a 'content="westos ansible\n" dest=/etc/motd' -u westos
## 使用特权升级,注意:此处使用特权升级需要先编辑/etc/sudoers.d/westos文件
cat /etc/sudoers.d/student
## westos ALL=(ALL) NOPASSWD:ALL
参数 | 功能 |
-m | 指定模块 |
-a | 指定块命令,content=““指定添加信息\n换行,dest=/etc/motd添加信息路径 |
-u |
指定受管主机登陆时的用户身份 |
-k | 表示输入密码(做过免密登陆的可以不使用该参数) |
-become |
超级用户身份登录 |