一文搞懂ansible及ansible图形化管理

1. ansible 简介

1.1 ansible 是什么?

ansible 基于python开发,集合了众多的运维工具(puppet, chef, func, fabric)的优点,实现批量系统配置、批量程序部署、批量运行命令等功能。

ansible 是基于paramiko开发的,基于模块化工作,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,ansible只提供了一种框架。ansbile不需要在远程主机上安装client/agents。

1.2 ansible 特点

  1. 默认使用ssh协议对设置进行管理;
  2. 有大量常规运维操作的模块,可实现日常绝大部分的操作;
  3. 支持API及自定义模块,可通过python轻松扩展;
  4. 通过playbooks来定制强大的配置和状态管理;
  5. 轻量级,无需在被控机上操作,更新时,只需在操作机上进行一次更新即可;
  6. 提供了一个功能强大,操作性强的web管理界面和RESE API接口平台 —— AWX平台。

1.3 ansible 架构图

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

2.ansible 任务执行

2.1 ansible 任务执行模式

  • ad-hoc 模式
    使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell
  • playbook模式(剧本模式)
    playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

2.2 ansible 任务执行流程

图片[2]-一文搞懂ansible及ansible图形化管理-不念博客
ansible任务执行流程图

简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。

2.3 ansible 命令执行过程

  • 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
  • 查找对应的主机配置文件,找到要执行的主机或者组;
  • 加载自己对应的模块文件,如 command;
  • 通过ansible将模块或命令生成对应的临时py文件(python脚本),并将该文件传输至远程服务器;
  • 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
  • 给文件 +x 执行权限;
  • 执行并返回结果;
  • 删除临时py文件,sleep 0退出;

3.ansible 配置

3.1 ansible 安装方式

  • pip 安装
pip install ansible
  • yum 安装
yum install epel-release -y
yum install ansible -y

3.2 ansible 程序结构

安装目录如下(yum安装):
  配置文件目录:/etc/ansible/
  执行文件目录:/usr/bin/
  Lib库依赖目录:
/usr/lib/pythonX.X/site-packages/ansible/
  Help文档目录:
/usr/share/doc/ansible-X.X.X/
  Man文档目录:/usr/share/man/man1/

3.3 ansible 配置文件查找顺序

  1. 检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
  2. ~/.ansible.cfg 检查当前目录下的ansible.cfg配置文件;
  3. /etc/ansible.cfg 检查etc目录的配置文件。

3.4 ansible 配置文件常用参数

inventory = /etc/ansible/hosts  #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5		#并发连接数,默认为5
sudo_user = root		#设置默认执行命令的用户
remote_port = 22		#指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False		#设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60		#设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log		#指定一个存储ansible日志的文件(默认不记录日志)

3.5 ansible 命令集

/usr/bin/ansible          Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc      Ansible 模块功能查看工具
/usr/bin/ansible-galaxy   下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook  Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull  Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault  Ansible 文件加密工具
/usr/bin/ansible-console  Ansible基于Linux Consoble界面可与用户交互的命令执行工具

3.6 ansible 常用模块

  1. ansible web -m ping 主机连通性测试
  2. command 模块
    直接在远程主机上执行命令,并将结果返回本主机eg: ansible web -m command -a ‘ss -ntl’该模块常用命令
chdir       # 在执行命令之前,先切换到该目录
executable   # 切换shell来执行命令,需要使用命令的绝对路径
free_form   # 要执行的Linux指令,一般使用Ansible的-a参数代替。
creates  # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
removes   # 一个文件名,这个文件不存在,则该命令不执行
  1. shell 模块
    shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等
  2. copy 模块
    这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
  3. file 模块
    该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等
  4. fetch 模块
    该模块用于从远程某主机获取(复制)文件到本地。
  5. cron 模块
    该模块适用于管理cron计划任务的。其使用的语法跟我们的crontab文件中的语法一致
  6. yum 模块
    主要用于软件的安装
  7. service 模块
    该模块用于服务程序的管理
  8. user 模块
    该模块主要是用来管理用户账号
  9. group 模块
    该模块主要用于添加或删除组
  10. script 模块
    该模块用于将本机的脚本在被管理端的机器上运行
  11. setup 模块
    该模块主要用于收集信息,是通过调用facts组件来实现的。facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。facts就是变量,内建变量。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

4.ansible playbook

4.1 playbook简介

用户通过ansible命令直接调用yml语言写好的playbook,playbook由多条play组成,每条play都有一个任务(task)相对应的操作,然后调用模块modules,应用在主机清单上,通过ssh远程连接,从而控制远程主机或者网络设备

4.2 playbook核心元素

Hosts          执行的远程主机列表(应用在哪些主机上)

Tasks          任务集

Variables      内置变量或自定义变量在playbook中调用

Templates模板  可替换模板文件中的变量并实现一些简单逻辑的文件

Handlers和notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行

tags标签       指定某条任务执行,用于选择运行playbook中的部分代码。
                ansible具有幂等性,因此会自动跳过没有变化的部分,
                即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。
                此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
                ansible-playbook -t tagsname useradd.yml

4.3 playbook

  1. 变量定义
vars:
    key1=value1
    key2=value2
  1. 条件测试
- hosts: mysql
  remote_user: root
  tasks:
    - name: "shut down Centos 7 systems"
      command: /sbin/shutdown -r now
      when:
        - ansible_distribution == "Centos”
        - ansible_distribution_major_version =="7"

  1. 迭代
- hosts: webserver
  remote_user: root
  tasks:
    - name: "Add users"
      user: name={{ item.name }}  state=present groups={{ item.groups }}
      with_items:
        - { name:'test1', groups:'wheel'}
          { name:'test2', groups:'root'}

  1. Templates 模块
    模板,即使用模板语法的文件
  2. tags 模块
    在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个task或多个task时就可以使用tags标签功能了
- hosts: webserver
  remote_user: root
  tasks:
    - name: copy hosts file
      copy: src=/etc/hosts dest=/opt/hosts
      tags:
      - only
    - name: touch file
      file: path=/opt/hosts01 state=touch

执行命令:ansible-plavbook hosts.vml --tags="only"

4.4 roles

roles能够根瓶层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块等置于单独的目录中,并可以快速地include它们,roles一直用于基于主机构建

4.5 roles 目录结构及说明

files:用来存放由copy模块或script模块调用的文件。
templates:用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks:此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
handlers:此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
vars:此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
defaults:此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
meta:此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。

5.ansible UI管理工具awx安装实践

5.1 简介

AWX提供了一个基于web的用户界面、REST API和构建在Ansible之上的任务引擎。图形化的AWX能够更方便的编排和部署 Ansible Playbook,并提供集中的日志记录、审计和系统跟踪。
AWX是商业版Ansible Tower 的开源版本。

5.2 安装awx项目(前提是ansible及docker安装配置完成)

  1. 下载awx包并解压
[root@client ~]# wget https://github.com/ansible/awx/archive/14.1.0.tar.gz
[root@client ~]# cd awx-14.1.0/installer/
[root@client installer]# ls
build.yml  install.yml  inventory  role

  1. 查看python3的工作路径并修改inventory文件
[root@client installer]# which python3
/usr/bin/python3
[root@client installer]# sed -i.bak 's/env python/python/g' inventory
[root@client installer]# ll
总用量 24
-rw-rw-r--. 1 root root  166 8月  25 12:12 build.yml
-rw-rw-r--. 1 root root  437 8月  25 12:12 install.yml
-rw-rw-r--. 1 root root 7340 9月  21 02:03 inventory
-rw-rw-r--. 1 root root 7344 8月  25 12:12 inventory.bak
drwxrwxr-x. 7 root root   99 8月  25 12:12 roles

  1. 下载镜像
[root@client installer]# docker pull redis:latest
[root@client installer]# docker pull postgres:10
[root@client installer]# docker pull ansible/awx:14.1.0
[root@client ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            10                  7849072676e1        3 days ago          200MB
redis               latest              84c5f6e03bf0        10 days ago         104MB
ansible/awx         14.1.0              8a29b4e35f5f        3 weeks ago         1.3GB
[root@client installer]# ansible-playbook -i inventory install.yml

  1. 容器查看
[root@client installer]# docker ps    
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                  NAMES
b3ccad7afb02        ansible/awx:14.1.0   "/usr/bin/tini -- /u…"   52 minutes ago      Up 19 minutes       8052/tcp               awx_task
64989076d24a        ansible/awx:14.1.0   "/usr/bin/tini -- /b…"   52 minutes ago      Up 19 minutes       0.0.0.0:80->8052/tcp   awx_web
c4a3e5c4b507        postgres:10          "docker-entrypoint.s…"   52 minutes ago      Up 19 minutes       5432/tcp               awx_postgres
0dec66f07a43        redis                "docker-entrypoint.s…"   52 minutes ago      Up 19 minutes       6379/tcp               awx_redis

  1. 登录awx
登陆地址: http://192.168.0.200
账号:admin
密码:password
  1. awx 图形界面展示
图片[3]-一文搞懂ansible及ansible图形化管理-不念博客
awx 图形界面
© 版权声明
THE END