网站首页 > 技术文章 正文
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 root@192.168.108.102
? 使用公钥认证,如需禁用可以在配置文件中写入"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目录
猜你喜欢
- 2024-12-01 Ansible的原理与配置
- 2024-12-01 Ansible系列教程-playbook详解(三)
- 2024-12-01 prometheus实战之一:用ansible部署
- 2024-12-01 ansible快速入门手册
- 2024-12-01 学习下运维自动化工具ansible
- 2024-12-01 Ansible 批量100台服务器添加 Crontab
- 2024-12-01 利用Ansible自动化工具对多台linuxz主机配置网卡文件
- 2024-12-01 如何在 Rocky Linux 8 上安装 Ansible 自动化工具?
- 2024-12-01 Ansible自动化部署利器的实战运用
- 2024-12-01 Ansible实战系列二 _ Playbook入门
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)