目录
一、 ansible 简介
1.什么是ansible?
Ansible是近年越来越火的一款运维自动化工具,其主要功能是帮助运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提升运维工作效率。
Ansible完全基于Python开发,而DevOps在国内已然是一种趋势,Python被逐步普及,运维人员自己并发工具的门槛逐步降低,得益于此,方便对Ansible二次开发。Ansible丰富的内置模块,甚至还有专门为商业平台开发的功能模块,完全可以满足日常功能所需。
官方网站:Ansible is Simple IT Automation
有一个不同和优点是我们不需要在节点中安装任何客户端。
2.Ansible应用场景
应用部署:
Ansible内置网络、应用、系统、第三方云平台扩展等完善的功能模块,协助运维快速完成应用的安装、卸载、升级、启停、配置等部署类工作,即使对跨平台或知名的商业硬件也同样支持。
配置管理:
Ansible内置File、Template,结合jinja、Lineinfile等内置模块,同时无缝结合GitHub,GitLab、Git、SVN、 Jenkins等主流版本控制和CI持续集成工具,助力配置管理自动化。
任务流编排:
有效保证Tasks任务流按既定规则和顺序完成事先制订的目标和计划,同时Roles编排方式又能在一定程度上从书写习惯和代码层编排上保证整体项目的可架构性和规范性,协助控制项目维护成本不致过高。
适用于网络管理员、系统运维、应用运维、桌面运维、Devops、基础架构运维等多领域运维行业,上手快,效率高。
3.Ansible通信机制
Ansible主推的卖点是其无需任何Daemon维护进程即可实现相互间的通信,且通信方式是基于业内统一标准的安全可靠的SSH安全连接。
(1)无客户端,只需安装SSH、Python即可。
(2)基于OpenSSH通信,底层基于SSH协议(Windows基于PowerShell) 。
(3)支持密码和SSH认证,建议使用公私钥方式认证,因为密码认证方式的密码需明文写配置文件,虽然配置文件可加密,但会增加Ansible使用的复杂度。
(4)支持Windows,但仅支持客户端,服务端必须是Linux系统。
4.Ansible基本架构
Ansible: ansible的核心模块
Host Inventory:主机清单,也就是被管理的主机列表
Playbooks:ansible的剧本,可想象为将多个任务放置在一起,一块执行
Core Modules:ansible的核心模块
Custom Modules:自定义模块
Connection Plugins:连接插件,用于与被管控主机之间基于SSH建立连接关系
Plugins:其他插件,包括记录日志等
二、Ansible安装
1.设置epel仓库
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库
yum install epel-release -y
2. 使用yum安装Ansible
yum install ansible
3. 查看ansible的版本
[root@an1 ~]# ansible --version
ansible 2.9.27
4.ansible的命令参数
格式:
ansible 清单 -m 模块 -a 模块参数常用参数
#--version ##显示版本
#-m module ##指定模块,默认为command模块
#-v ##详细过程 -vv -vvv更详细过程
#--list ##显示主机列表,也可以用--list-hosts
#-k ##提示输入ssh连接密码,默认key认证
#-C ##预执行检测
#-T ##执行命令的超时时间,默认10s
#-u ##指定远程执行的用户
#-b ##执行sudo切换身份操作
#-become-user=USERNAME ##指定sudo的用户
#-K ##提示输入sudo密码
ansible-doc 参数
指定查看某个模块的参数 ansible-doc -s 模块名字
[root@an1 yum.repos.d]# ansible-doc -s service
三. ansible基本使用
1. 基于端口,用户,密码定义主机清单
ansible默认的主机清单 配置文件:/etc/ansible/hosts
ansible_ssh_port: 指定ssh端口
ansible_ssh_user:指定 ssh 用户
ansible_ssh_pass: 指定 ssh 用户登录认证密码
如果控制端和被控制端第一次通讯,需要先添加指纹信息
连接特别多的话,在配文件中加入选项即可
[root@m01 ~]# vim /etc/ansible/ansible.cfg
host_key_checking = False
测试主机的连通性
[root@an1 ~]# ansible -i /etc/ansible/hosts web-servers -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.52.150 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
查看组下所有的IP:
[root@an1 ~]# ansible all --list
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
hosts (1):
192.168.52.150
2. 基于ssh密钥来访问定义主机清单
1)设置密钥:
ssh-keygen # 一直回车
2)拷贝密钥:
[root@an1 ~]# ssh-copy-id 192.168.52.149
3) 添加192.168.52.149主机到 /etc/ansible/hosts 的web-servers组下
[root@an1 ansible]# grep -v ^# hosts |grep -v ^$
[web-servers]
192.168.52.150 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.52.149
4) 查看组下所有主机
[root@an1 ansible]# ansible web-servers --list
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
hosts (2):
192.168.52.150
192.168.52.149
5)测试主机的连通
[root@an1 ansible]# ansible -i /etc/ansible/hosts web-servers -m
直接指定组也可以
[root@an1 ansible]# ansible 'web-servers' -m ping
3.基本使用案例
检查节点的内存情况
[root@an1 ansible]# ansible -m command -a "free -m " 'webservers'
四. ansible的常用模块
1、command
功能: 在远程主机执行命令,此模块为默认模块
常用参数:
chdir ##执行命令前先进入到指定目录
cmd ##运行命令指定
creates ##如果文件存在将不运行
removes ##如果文件存在在将运行
free_form ##在远程主机中执行的命令,此参数不需要加
实验:
ansible all -m command -a 'chdir=/mnt touch file1 file2' ##先切换目录,载建立文件
ansible all -m command -a 'chdir=/mnt rm -rf file1 file2' ##切换目录,删除文件
2、shell
功能:和command功能类似
实验:
因为很多通配符command
是不能使用的,因此可以用shell
但是用shell
就可以执行成功。
ansible all -m shell -a 'ps ax | grep $$' ##过滤当前进程名称,默认环境使用/bin/sh
ansible all -m shell -a 'executable=/bin/bash ps ax | grep $$' ##指定执行环境为/bin/bash
3、script
功能:使用scripts模块可以在本地写一个脚本,在远程服务器上执行
实验:
写一个脚本
[root@an1 ~]# cat test.sh
#!/bin/bash
date
hostname
echo "脚本执行成功"
在主机an1运行:
[root@an1 ~]# ansible -i /etc/ansible/hosts webservers -m script -a "/etc/ansible/test.sh"
4、copy
功能:从ansible主机复制文件到受控主机
常用参数
src ##源文件
dest ##目的地文件
owner ##指定目的地文件所有人
group mode ##指定目的地文件权限
backup=yes ##当受控主机中存在文件时备份原文件
content ##指定文本内容直接在受控主机中生成文件
实验:复制上一个实验的test.sh文件,以所有人westos,权限775,到被控主机的/mnt中,同时备份。
[root@an1 ~]# ansible 192.168.52.149 -m copy -a "src=/etc/ansible/test.sh owner=westos mode=755 dest=/mnt/test.sh backup=yes"
5、file
功能:设置文件的属性
常用参数:
path ##指定文件名称
state ##指定操作状态
##touch 建立
##absent 删除
##directory 递归
##link 建立软链接
#hard 硬链接
mode ##设定权限
owner ##设定文件用户
group ##设定文件组
src ##源文件
dest ##目标文件
recurse=yes ##递归更改
实验:
在主控机an1中远程控制在受控主机中新建文件
[root@an1 ~]# ansible all -m file -a 'path=/mnt/westosfile state=touch'
在主控机an1中远程控制在受控主机中新建目录
[root@an1 ~]# ansible all -m file -a 'path=/mnt/westosdir state=directory'
在主控机an1中远程控制在受控主机中修改文件的所有人。
[root@an1 ~]# ansible 192.168.52.149 -m file -a 'path=/mnt/westosfile owner=westos'
在主控机westosa中远程控制在受控主机westosb中删除文件和目录
[root@an1 ~]# ansible 192.168.52.149 -m file -a 'path=/mnt/westosfile state=absent'
[root@an1 ~]# ansible 192.168.52.149 -m file -a 'path=/mnt/westosdir state=absent'
6、archive
功能:在主控机中控制受控主机打包压缩文件。
常用参数:
path ##打包目录名称
dest ##声称打包文件名称
format ##打包格式
owner ##指定文件所属人
mode ##指定文件权限
unarchive
功能:解压缩,将包复制到受控主机再解压缩
7、cron
功能:计划任务
常用参数:
minute ##分钟
hour ##小时
day ##天
month ##月
weekday ##周
name ##任务名称
job ##任务脚本或命令
disabled ##yes 禁用计划任务
##no 启动计划任务
state ##absent 删除计划任务
实验:
在主控机中控制被控主机生成一个定时任务
ansible webservers -m cron -a 'job="echo hello fx" name=test minute=*/2'
#受控机查看
crontab -l
在主控机中控制被控主机禁止该定时任务
ansible webservers -m cron -a 'job="echo hello fx" name=test minute=*/2 disabled=yes'
在主控机中控制被控主机重新开启该定时任务。
ansible webservers -m cron -a 'job="echo hello fx" name=test minute=*/2 disabled=no'
在主控机中控制被控主机删除该定时任务
ansible webservers -m cron -a 'job="echo hello fx" name=test minute=*/2 state=absent'
8、 yum模块
yum模块linux平台软件包管理。
yum模块可以提供的status状态: latest ,present,installed #这三个代表安装;removed, absent #这两个是卸载
9、dnf
功能:管理系统中的dnf仓库及管理软件
常用参数
name ##指定包
state ##指定动作
#present 安装
#latest 更新
#absent 删除
list ##列出指定信息
# httpd
# installed
# available
disable_gpg_check #禁用gpgkey检测
enablerepo ##指定安装包来源
disablerepo ##禁用安装包来源
实验:
在主控机中控制受控主机安装软件。如果同时安装多个,则使用“,”隔开。安装成功后可以在受控主机上使用rpm
命令查看,卸载软件只需将state
的值改变即可。
ansible webservers -m dnf -a 'name="httpd,php" state=present'
###webservers
rpm -qa | grep httpd
rpm -qa | grep php
10、service
常用参数:
name ##指定服务名称
state ##指定对服务的动作
#started
#stoped
#restarted
#reloaded
enabled ##设定服务开机是否启动
#yes开启启动
#no开机不启动
先安装好httpd
实验: 使用service模块重启httpd
ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"
11、user
功能:模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作
常用参数
name ##必须参数,用于指定要操作的用户名称。
group ##指定用户所在的基本组。
gourps ##指定用户所在的附加组。
append ##指定添加附加组默认值为no
shell ##指定用户的默认 shell。
uid ##指定用户的 uid 号。
comment ##指定用户的注释信息。
state ##用于指定用户是否存在于远程主机
#present 建立
#absent 删除
remove ##当删除用户是删除用户家目录,默认值为no
password ##此参数用于指定用户的密码。但密码为明文,
##可以用openssl password -6 '密码'生成加密字符