玖叶教程网

前端编程开发入门

Ansible自动化运维

Ansible架构及特点

? Ansible是什么

  • Ansible是于2012年2月发布的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能;
  • Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架
  • Ansible官网: https://www.ansible.com/
  • Ansible帮助文档:http://docs.ansible.com/

? Ansible的优势及特性

  • 轻量级:基于python开发、分布式,无需在客户端安装 agent,并且也不需要启动服务
  • 基于(Push)方式:基于推送方式有很大的优势,可以控制什么时候让远程被管理节点发生变更,不需要等到被管理节点周期性时间。当然ansible官方也已经支持拉取方式、使用ansible-pull工具
  • 语法简洁:配置语言采用 yaml ,用来定义多条任务,语法更为简洁
  • 支持非root用户管理操作,支持sudo
  • 大量内置模块:可以通过ansible-doc查看已安装模块

? Ansible的基本架构

? Ansible组成部分

  • 核心引擎:Ansible
  • 核心模块:即Ansible自带的模块
  • 自定义模块:如果核心模块不足以满足某种功能,可以添加自定义模块
  • 插件:完成模块功能的补充,借助于插件完成记录日志、邮件等功能
  • 剧本:定义Ansible任务的配置文件,将多个任务定义在一个剧本中,由Ansible自动执行
  • 连接插件:支持ssh、zeromq方式
  • 主机清单:定义Ansible管理的主机策略,默认是在Ansible的hosts配置文件中定义

? Ansible工作原理

? Ansible任务执行模式

  • ad-hoc模式使用单个模块,支持批量执行单条命令

[root@monitor ]# ansible test -m ping

[root@monitor ~]# ansible test -m shell -a 'echo hello'

[root@monitor ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/hosts"

  • playbook模式是Ansible主要管理方式,也是Ansible功能强大的关键所在。Playbook通过多个task集合完成一类功能,如web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件

? Ansible执行过程

Ansible安装与配置

? Ansible环境准备

  • 从GitHub获取ansible,地址为https://github.com/ansible/ansible
  • 控制主机需要python2.6或以上、paramiko模块、PyYAML、Jinja2、httplib2
  • Unix类被管节点需要python2.4或以上版本,但版本低于python2.5需要安装python-simplejson模块;
  • Windows类被管理节点需要有PowerShell3.0并授权远程管理
  • 如果被管节点开启了Selinux,需要安装libselinux-python才能使用ansible中与copy/file/template相关函数

? 安装Ansible

? Ansible安装方式有以下几种:

GitHub源码库安装、Tar包安装、制作rpm包安装、yum安装、Apt(Ubantu)安装、Homebrew(Mac OSX)安装、pip方式安装

? 后续的安装过程以GitHub源码安装举例说明

? 其它安装方法可以参考 http://www.ansible.com.cn/docs/intro_installation.html#what-will-be-installed

? GitHub源码安装Ansible

? 提取ansible源代码

[root@mastera local]# git clone git://github.com/ansible/ansible.git –recursive

[root@mastera local]# cd ansible

[root@mastera ansible]# source ./hacking/env-setup

? 安装pip工具

[root@mastera ansible]# easy_install pip

? 安装Ansible控制主机需要的python模块

[root@mastera ansible]# pip install paramiko PyYAML Jinja2 httplib2 six

? 更新Ansible版本

[root@mastera ansible]# git pull –rebase

[root@mastera ansible]# git submodule update --init --recursive

? 配置Ansible

  • 使用环境变量方式,大多数参数可以通过设置带有ANSIBLE_开头的环境变量进行配置

[root@mastera ansible]# export ANSIBLE_SUDO_USER=root

  • 配置linux主机ssh无密码访问

[root@mastera ansible]# ssh-keygen

[root@mastera ansible]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

? 使用公钥认证,如需禁用可以在配置文件中写入"host_key_checking = False"

? 设置ansible.cfg配置参数,默认情况下ansible.cfg文件在/etc/ansible目录下,但如果是GitHub仓库源码安装,需要复制examples目录下的ansible.cfg到程序根目录或者/etc/ansible目录下

? Ansible配置文件常用参数

  • inventory = /etc/ansible/hosts #资源清单文件位置、需要连接管理的主机列表
  • library = /usr/share/my_modules/ #存放模块的目录,支持多个目录,只要用冒号隔开即可
  • forks = 5 #设置默认情况下ansible最多能有多少个进程同时工作,默认为5
  • sudo_user = root #设置默认执行命令的用户
  • remote_port = 22 #连接被管节点的端口,默认是22。除非设置了特殊ssh端口,一般不修改
  • host_key_checking #设置是否检查ssh主机的秘钥
  • timeout = 60 #设置ssh连接超时时间,单位是秒
  • log_path = /var/log/ansible.log

? 配置被管节点并测试

? 修改主机与组配置,文件为/etc/ansible/hosts

[webservers]

192.168.108.102

192.168.108.103

? 测试连通性

? 批量执行命令

? 查看ansible支持模块

[root@mastera ansible]# ansible-doc –l

? 显示模块描述和使用示例

[root@mastera ansible]# ansible-doc -s module


Ansible组件介绍

? Ansible Inventory

  • 定义主机和主机组
  • 多个Inventory列表(定义多个Inventory文件)

配置文件修改inventory保存路径:inventory = /etc/ansible/inventory/

创建目录,并生成多个inventory文件,如下:

  • 动态inventory

ansible的主机列表和变量信息支持从外部拉取,比如从zabbix监控系统或者cmdb获取所有主机信息

ansible.cfg中inventory的定义值改成一个执行脚本

该脚本需支持两个参数:

--list或者-L,显示所有主机以及主机组的信息(json格式)

--host或者-H,参数后面跟着一台host,返回这台主机的所有信息(包括认证信息、主机变量、json格式)

  • 示例脚本:

? Inventory内置参数

参数

解释

例子

ansible_ssh_host

定义host ssh地址

ansible_ssh_host=192.168.108.101

ansible_ssh_port

定义host ssh端口

ansible_ssh_port=5000

ansible_ssh_user

定义host ssh认证用户

ansible_ssh_user=yadmin

ansible_ssh_pass

定义host ssh认证密码

Ansible_ssh_pass=‘123456’

ansible_sudo

定义host sudo用户

Ansible_sudo=yadmin

ansible_sudo_pass

定义host sudo密码

Ansible_sudo_pass=‘123456’

ansible_connection

定义hosts连接方式

Ansible_connection=local

ansible_ssh_private_key_file

定义hosts私钥

Ansible_ssh_private_key_file=/root/key

ansible_python_interpreter

定义hosts任务执行python路径

Ansible_python_interpreter=/usr/bin/python2.6

ansible_*_interpreter

定义hosts其他语言解释器路径

Ansible_ruby_interpreter=/usr/bin/ruby

? Ansible Ad-Hoc命令

  • 执行命令

ansible命令都是并发执行,默认的并发数目由ansible.cfg中的forks值来控制;也可以在运行ansible命令的时候通过-f指定并发数

  • ansible异步执行功能,-B为每间隔多少秒异步运行 -P轮询访问结果

[root@mastera .ansible_async]# ansible docker -B 12 -P 0 -m shell -a 'uname -r'

  • 执行用户的目录下有一个ansible_async的隐藏文件夹,可以查看job_id;再根据job_id查看执行信息
  • 复制文件

[root@mastera ~]# ansible webservers -m copy -a 'src=/tmp/test1 dest=/tmp/test1 owner=rootgroup=root mode=644 '

  • 包和服务管理

[root@mastera tmp]# ansible docker -m yum -a 'name=httpd state=latest'

  • 用户管理

? Ansible facts

  • 采集被管机器所有信息

[root@mastera tmp]# ansible 192.168.108.101 -m setup

  • 采集被管机器的指定信息

[root@mastera tmp]# ansible 192.168.108.101 -m setup -a 'filter=ansible_all_ipv4_address'

  • 如果被管节点安装了facter和ohai包,也可以查看被管节点的facter和ohai信息

[root@mastera tmp]# ansible 192.168.108.101 -m facter

[root@mastera tmp]# ansible 192.168.108.101 -m ohai

? Ansible role

  • 在实际工作中有很多业务,因此需要编写很多playbook。为了方便管理这些playbook,需要用到ansible role功能

目录规范如下:

? Ansible Galaxy

  • Ansible Galaxy是ansible官方一个分享role的功能平台,网址是https://galaxy.ansible.com/list#/roles
  • 安装角色

[root@mastera tmp]# ansible-galaxy install bennojoy.nginx

  • 构建角色架构

[root@mastera roles]# ansible-galaxy init test

  • 从一个文件安装多个角色

[root@mastera roles]# ansible-galaxy install -r requirements.txt

  • 更多使用方法请参考 http://www.ansible.com.cn/docs/galaxy.html

Playbook详解

? Playbook基本语法

  • 执行playbook

ansible-playbook playbook.yml(playbook文件,可自定义名称) [参数]

  • 常用参数

-u REMOTE_USER #手工指定playbook的系统用户

--syntax-check #检查playbook的语法

--list-hosts playbook #匹配到的主机列表

-T TIMEOUT #定义playbook执行超时时间

--step #以单任务分步骤运行,方便做每一步确认工作

--help #帮助信息

? Playbook示例

? Playbook变量与引用

  • 通过inventory文件定义变量,简单示例如下:
  • 执行结果如下
  • 通过/etc/ansible下文件定义主机以及主机组变量
  • Ansible-playbook命令行传入

[root@mastera ansible]# ansible-playbook variable.yml -e "key=key"

  • Playbook文件内使用vars
  • 在playbook文件内使用vars_files
  • 使用register内变量,register方式可以用于tasks之间传递数据
  • 使用vars_prompt传入

? Playbook循环

  • 标准循环

- name: add several users

user: name={{ item }} state=present groups=wheel

with_items:

- testuser1

- testuser2

- name: add several users

user: name={{ item.name }} state=present groups={{ item.groups }}

with_items:

- { name: 'testuser1', groups: 'wheel' }

- { name: 'testuser2', groups: 'root' }

  • 嵌套循环

- name: give users access to multiple databases

mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo

with_nested:

- [ 'alice', 'bob' ]

- [ 'clientdb', 'employeedb', 'providerdb' ]

- name: here, 'users' contains the above list of employees

mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo

with_nested:

- "{{users}}"

- [ 'clientdb', 'employeedb', 'providerdb' ]

  • 散列循环

比起标准循环,散列循环支持更丰富的数据结构,其中with_dict接收的是python字典数据类型

users:

alice:

name: Alice Appleworth

bob:

name: Bob Bananarama

tasks:

- name: Print phone records

debug: msg="User {{ item.key }} is {{ item.value.name }} "

with_dict: "{{users}}"


  • 文件循环

with_fileglob 可以以非递归的方式来模式匹配单个目录中的文件.如下面所示:

- hosts: all

tasks:

# 判断文件是否存在

- file: dest=/etc/fooapp state=directory

# 复制指定目录下所有文件到被管节点

- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600

with_fileglob:

- /playbooks/files/fooapp/*

  • 随机选择循环

'random_choice'功能可以用来随机获取一些值.它并不是负载均衡器.它有时可以用作一个简化版的负载均衡器,比如作为条件判断:

- debug: msg={{ item }}

with_random_choice:

- "go through the door"

- "drink from the goblet"

- "press the red button"

- "do nothing"


  • 条件判断循环

- action: shell /usr/bin/foo

register: result

until: result.stdout.find("all systems go") != -1

retries: 5

delay: 10

  • 文件优先匹配循环

- name: INTERFACES | Create Ansible header for /etc/network/interfaces

template: src={{ item }} dest=/etc/foo.conf

with_first_found:

- "{{ansible_virtualization_type}}_foo.conf"

- "default_foo.conf"

? Playbook lookups

  • Lookups file,其原理是使用python的codes.open打开文件然后结果返回给变量
  • Lookups pipe,其原理是调用python的subprocess.Popen执行命令,将返回结果传递给变量
  • Lookups password,对传入的内容进行加密处理

? Playbook lookups

  • Lookups redis_kv
  • Lookups template,template与file方式类似,但是template在读取文件之前渲染成jinja模板

? Playbook conditionals

  • 在实际应用中经常会碰到不同的主机执行不同的命令;或者执行某个task的时候需要进行简单的逻辑判断,此时就要用到ansible的conditionals功能

? Playbook 内置变量

  • groups:以JSON格式返回Inventory文件里面所有主机以及主机组信息
  • group_names:返回当前主机所在groups名称
  • hostvars: 输入主机信息,返回指定主机变量
  • inventory_hostname:返回Inventory文件里定义的主机名
  • inventory_hostname_short:返回Inventory文件中主机名的第一部分
  • play_hosts:返回当前playbook运行的主机信息
  • inventory_dir:返回当前playbook使用的Inventory目录

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言