目录

  • 一、认识Ansible
    1、Ansible 是什么
    2、为什么选择ansible
    3、Ansible 是如何工作的
    4、Ansible通信机制
    5、Ansible应用场景
    6、ansible执行流程
    7、ansible生成的主要文件
  • 二、Ansible安装、配置及使用
    1、 在server1上安装ansible
    2、熟悉ansible配置文件使用
    3、参数及ansible命令的使用
    4、 创建普通用户,执行分发任务
    5、Inventory文件配置
    6、Ansible与正则

一、认识Ansible

1、Ansible 是什么?

  • Ansible 是一个能实现批量部署的自动化运维工具,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。帮助运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提升运维工作效率。
  • 常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续继承、零宕机平滑升级。
  • 常见的部署工具有Chef、Puppet、Ansible、SaltStack、Fabric
  • ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

2、为什么选择ansible?

  • Ansible完全基于Python开发,而DevOps在国内已然是一种 趋势,Python已逐步普及,运维人员自己开发工具的门槛逐步降低,得益于此,方便对Ansible二次开发。
  • Ansible丰富的内置模块,甚至还有专门为商业平台开发的功能模块,完全可以满足日常功能所需。
  • 在Ansible去中心化概念下,一个简单的复制操作即可完成管理配置中心的迁移。
  • Agentless(无客户端),客户端无需任何配置,由管理端配置好后即可使用,更新时,只需在操作机上进行一次更新即可,这点非常诱人。
  • 配置简单、功能强大、扩展性强,通过Playbooks来定制强大的配置、状态管理。

3、Ansible 是如何工作的?

ansible主机配置清单 ansible -i inventory_ansible主机配置清单


上图对应的模块功能如下:

Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用

补充:
(1)Ansible使用者来源于多种维度,分为以下几种方式:

  • CMDB存储和管理着企业IT架构中的各项配置信息,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达成的目标。
  • 基于PUBLIC(公有云)/PRIVATE(私有云),Ansible以API调用的方式运行,Ansible提供了丰富的API语言接口:PHP、Python等。
  • 直接使用Ad-Hoc临时集调用Ansible工具集来完成任务执行。
  • 通过执行Playbooks中预先编排好的任务集按序完成任务执行。

(2)Ansible工具集(ansible命令是Ansible的核心工具,总指挥)

  • INVENTORY:命令执行的目标对象配置文件
  • API:供第三方程序调用的应用程序编程接口
  • MODULES:丰富的内置模块
  • PLUGINS:内置和自定义的插件

(3)作用对象
Ansible的作用对象,不仅仅是Linux和非Linux操作系统的主机,同样也可以作用于各类公有云/私有云,商业和非商业设备的网络

4、Ansible通信机制

  • Ansible主推的卖点是其无需任何Daemon维护进程即可实现相互间的通信,且通信方式是基于业内统一标准的安全可靠的SSH安全连接。
  • 无客户端,只需安装SSH、Python即可。
  • 基于OpenSSH通信,底层基于SSH协议(Windows基于PowerShell)。
  • 支持密码和SSH认证,建议使用公私钥方式认证,因为密码认证方式的密码需明文写配置文件,虽然配置文件可加密,但会增加Ansible使用的复杂度。

5、Ansible应用场景
应用部署

  • Ansible内置网络、应用、系统、第三方平台扩展等完善的功能模块,协助运维快速完成应用的安装、卸载、升级、启停、配置等部署类工作,即使对跨平台或知名的商业硬件也同样支持。

配置管理

  • Ansible内置File、Template,结合Jinja、Lineinfile等内置模块,同时无缝结合GitHub、GitLab、Git、SVN、Jenkin等主流版本控制和CI持续集成工具,助力配置管理自动化。

任务流编排

  • 有效保证Tasks任务流按即定规则和顺序完成事先制定的目标和计划,同时Roles编排方式又能在一定程度上从书写习惯和代码层编排上保证整体项目可架构性和规范性,协助控制项目维护成本不致过高。

适用于网络管理员、系统运维、应用运维、桌面运维、DevOps、基础架构运维等多领域运维行业,上手快,效率高。

6、ansible执行流程

ansible主机配置清单 ansible -i inventory_运维_02

7、ansible生成的主要文件

/etc/ansible
/etc/ansible/ansible.cfg   #配置文件
/etc/ansible/hosts   #主机库(host inventory)管理被监控的主机
/usr/bin/ansible   #主程序
/usr/bin/ansible-doc   #文档
/usr/bin/ansible-playbook   #剧本

二、Ansible安装、配置及使用

实验环境:

虚拟机名称

ip

版本

角色

server1

172.25.1.1

7.5

ansible

server2

172.25.1.2

7.5

远程主机hosts

server3

172.25.1.3

7.5

远程主机hosts

注:保证三台虚拟机能上网

1、 在server1上安装ansible
步骤一:配置EPEL源

vim /etc/yum.repos.d/epel.repo
	[epel]
	name=epel
	baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
	gpgcheck=0
yum clean all
yum repolist

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_03


ansible主机配置清单 ansible -i inventory_ansible主机配置清单_04


步骤二:安装ansible

yum install ansible -y

ansible主机配置清单 ansible -i inventory_运维_05


2、熟悉ansible配置文件使用

  • ansible配置文件查找顺序
    检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
    ~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
    /etc/ansible.cfg检查etc目录的配置文件。
  • 定义Inventory(主机列表)
    ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的inventory file为/etc/ansible/hosts
    inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。
  • Inventory文件格式:
    inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
[webservers]
www1.com:2222
www2.com

[dbservers]
db1.com
db2.com
db3.com
  • 如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,例如:
[webservers]
www[01:50].example.com

[databases]
db-[a:f].example.com
  • 主机变量: 可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:
[webservers]
www1.com http_port=80 maxRequestsPerChild=808
www2.com http_port=8080 maxRequestsPerChild=909
  • 组变量
[webservers]  #组
www1.com
www2.com

[webservers:vars]  #组变量
ntp_server=ntp.com
nfs_server=nfs.com

步骤一:将server2和server3添加到Ansible管理的主机中:

vim /etc/ansible/hosts  #定义inventory
[test]  #定义组test,将server2和server3添加到组中
172.25.1.2
172.25.1.3

ansible主机配置清单 ansible -i inventory_配置文件_06


步骤二:定义好inventory后可以调用ping模块来检测网络是否可达

ansible test -m ping  #-m指定调用模块

ansible主机配置清单 ansible -i inventory_运维_07


上述报错是因为ssh服务需要密码登陆,改正:

ansible test -m ping -k  #-k指使用密码登陆,命令行会提示输入SSH密码

ansible主机配置清单 ansible -i inventory_运维_08


上述报错是因为用户ssh访问时,会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。root用户第一次登陆server2, ~ /.ssh/known_host中无server2的公钥,所以登陆失败。解决方法:

ssh 172.25.1.2  #默认以root身份登陆
ansible test -m ping -k

ansible主机配置清单 ansible -i inventory_Ansible_09


3、 参数及ansible命令的使用

命令参数

-m

要执行的模块,默认为command

-a

模块的参数

-u

ssh连接的用户名,默认用root,ansible.cfg中可以配置

-k

提示输入ssh登录密码,当使用密码验证的时候用

-s

sudo运行

-U

sudo到哪个用户,默认为root

-b,–become

变成hosts主机中的哪个用户身份,拥有其权限

-K

提示输入sudo密码,当不是NOPASSWD模式时使用

-C

只是测试一下会改变什么内容,不会真正去执行

-c

连接类型(default=smart)

-f

fork多少进程并发处理,默认为5个

-i

指定hosts文件路径,默认default=/etc/ansible/hosts

-I

指定pattern,对已匹配的主机中再过滤一次

–list-host

只打印有哪些主机会执行这个命令,不会实际执行

-M

要执行的模块路径,默认为/usr/share/ansible

-o

压缩输出,摘要输出

–private-key

私钥路径

-T

ssh连接超时时间,默认是10秒

-t

日志输出到该目录,日志文件名以主机命名

-v

显示详细日志

ansible命令使用场景:

  • 非固化需求;
  • 临时一次性操作;
  • 二次开发接口调用。

(1)-a 命令参数,使用command模块远程执行命令

ansible test -a hostname -k  #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”,“df”,“uptimer”(查看系统平均负载)等等

ansible主机配置清单 ansible -i inventory_运维_10


(2)-m 要执行的参数,使用copy模块远程执行命令

ansible test -m copy -a "src=test.sh dest=/tmp/test.sh mode=755" -k
ansible test -m shell -a "/tmp/test.sh" -k

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_11


ansible主机配置清单 ansible -i inventory_Ansible_12


ansible主机配置清单 ansible -i inventory_ansible主机配置清单_13


ansible主机配置清单 ansible -i inventory_ansible主机配置清单_14


copy模块:复制本地文件至远程主机上

  • dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录。
  • src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
  • mode 文件或目录复制到远程主机后,所拥有的权限
    shell模块:让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等

4、 创建普通用户,执行分发任务

linux机器都禁止使用root远程登陆,更安全的做法是用普通用户登陆,分发任务

(1)在ansible主机上和两台hosts主机上创建普通用户devops,用于ansible任务分发与执行。

保证ansible与hosts主机上devops用户id相同

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_15

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_16

ansible主机配置清单 ansible -i inventory_配置文件_17

(2)在两台hosts主机上对普通用户devops下方权力

visudo
devops   ALL=(ALL)     NOPASSWD: ALL

server2:

ansible主机配置清单 ansible -i inventory_配置文件_18


ansible主机配置清单 ansible -i inventory_Ansible_19


server3:

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_20


(3)在ansible管理机生成ssh公私钥文件,并分发到其他机器

ssh-keygen  #生成密钥
ls 用户家目录/.ssh/#查看密钥   
ssh-copy-id 172.25.1.2  #发放密钥
ssh-copy-id 172.25.1.3

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_21


ansible主机配置清单 ansible -i inventory_运维_22


ansible主机配置清单 ansible -i inventory_运维_23


测试:

ansible主机配置清单 ansible -i inventory_运维_24


(4)在ansible管理机上普通用户家目录下编辑ansible.cfg 配置文件和hosts 主机库(host inventory)文件

mkdir ansible
cd ansible/
vim ansible.cfg
	[defaults]
	inventory = ./hosts  #inventory文件路径
vim hosts
	[test]
	172.25.1.2
	[db]
	172.25.1.3

ansible主机配置清单 ansible -i inventory_Ansible_25

检测文件配置以及免密设置是否成功:

ansible test -m ping #对test组内主机调用ping模块
ansible db -m ping #对db组内主机调用ping模块
ansible all -m ping #对所有组内主机调用ping模块

ansible主机配置清单 ansible -i inventory_配置文件_26


ansible主机配置清单 ansible -i inventory_ansible主机配置清单_27


(5)使用-b连接hosts主机,拥有hosts主机上root(默认)用户的权限

ansible test -m copy -a "src=test.sh dest=/mnt/test.sh" -b

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_28


不使用-b进行模块copy时,会因权限问题报错,文件复制不过去,使用-b,文件传输到hosts主机上时切换身份,调用sudo,执行其权力。

(6)-u 指定ssh连接的用户名,连接到hosts主机后,身份为指定用户,指定用户必须存在

ansible主机配置清单 ansible -i inventory_配置文件_29


每次输入命令-b、-u指定用户权限太麻烦,解决方法:

(7)在ansible.cfg文件中添加配置

remote_user: devops      #在远程主机上以devops用户身份执行任务

become: True                    #是否允许身份切换
become_method: sudo   #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo,被控主机为centos的话需要设置become_method为su
become_user: root          #切换成什么用户身份,默认为root。设置为root账户,相当于我们以普通账户登入到远程主机时,再使用su - root切换为root账户。
ansible_become_pass=False #使用root账户,则这里要写的就是root账户的密码,此处设置为Flase因为已经做过免密登陆

复制 /etc/ansible/ansible.cfg文件340~344行内容:

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_30


粘贴到/home/devops/ansible/ansible.cfg中

ansible主机配置清单 ansible -i inventory_ansible主机配置清单_31


测试:

ansible主机配置清单 ansible -i inventory_配置文件_32


注:在hosts主机上visudo中设置的devops用户权限,是为了当ansible使用devops身份调用hosts主机后在远程主机上以devops用户身份切换到root用户,通过sudo命令,切换身份。

5、Inventory文件配置
Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts

定义主机和组

  • Inventory可以直接为IP地址
    172.25.1.2
  • 端口号不是默认22端口时,可明确的表示为:
    server2:2222
    server2 ansible_port=2222 ansible_host=172.25.1.2
  • 中括号表示一个组,也可以表示一个范围
    [webserver] #表示webserver组
    www[1:10].example.com #表示主机范围www1~www10
    db-[a:f].example.com #表示主机范围db-a~db-f
  • 在playbook中使用时对主机进行个性化定制
    [webserver]
    web1 http_port=8080 maxRequestsPerChild=1024
  • 定义组变量
    [webserver]
    server2
    server3
    [webserver:vars]
    ntp_server=time1.aliyun.com # 表示webserver组中所有主机ntp_server值为time1.aliyun.com

定义组嵌套及组变量
[apache]
server1
server2

[nginx]
server3
server4

[webservers:children] # 定义主机组之间的继承关系我们使用”:children”来表示
apache
nginx

[webservers:vars]
ntp_server=time1.aliyun.com
组与组之间可以相互调用,并且可以向组中的主机指定变量。不过,这些变量只能在Ansible-playbook中使用,而Ansible不支持

定义独立文件保存某一类变量

在inventory主文件中保存所有的变量并不是最佳的方式,还可以独立保存在文件中:

  • 这些独立文件的格式为YAML
    /etc/ansible/group_vars/raleigh
    /etc/ansible/group_vars/webservers
    /etc/ansible/host_vars/foosball
  • 当变量变得太多时,分文件定义变量更方便进行管理和组织
    /etc/ansible/group_vars/raleigh/db_settings
    /etc/ansible/group_vars/raleigh/cluster_settings

变量的检索位置

  • Inventory配置文件(默认/etc/ansible/hosts)
  • Playbook中vars定义的区域
  • Roles中vars目录下的文件
  • Roles同级目录group_vars和hosts_vars目录下的文件
    尽量设置变量时沿用同一种方式,以便维护人员管理

6、Ansible与正则

匹配所有主机,all或*号功能相同。

  • ansible all -m ping
  • ansibel “*” -m ping
  • ansible 172.25.0.* -m ping

对多台主机或多个组同时执行,相互之间用冒号分隔即可

  1. ansible “web1:web2” -m ping 编辑inventory文件:

ansible主机配置清单 ansible -i inventory_运维_33

ansible主机配置清单 ansible -i inventory_运维_34

  1. 在webserver组但不在database组的主机,用感叹号表示
  • ansible “webserver:!database” -m ping
    注意:使用特殊符号!时,必须使用''强引用符
  • ansible主机配置清单 ansible -i inventory_Ansible_35

  • 在webserver组并且在database组的主机,用&表示
  • ansible ‘webserver:&database’ -m ping

ansible主机配置清单 ansible -i inventory_运维_36


  • 模糊匹配
  • *.exampe.com
  • www*.com:database

ansible主机配置清单 ansible -i inventory_运维_37