Ansible简述
Absible 使用 模块(Modules)来定义配置任务。模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好的做法,使每个模块幂等。Ansible 剧本(YAML语言编写)角色映射到 节点/虚拟机上,以对这些节点/虚拟机 进行编排有序的执行。
Ansible 支持 ad-hoc 任务:管理任务(不必幂等)以在多个节点/虚拟机上执行。Ansible具有无代理架构:你不需要在配置的节点/虚拟机上安装Ansible(然而,这些节点必须安装 python 环境),Ansible 通过SSH或者通过 PowerShell(Windows 机器)从单个控制机器上配置管理节点/虚拟机,并且能够支持并行配置多个节点。
Ansible 可以用来配置类 unix 系统或 Windows 节点/虚拟机。
Ansible 使用 Python 语言编写。许可:GNU General Public License.
Ansible playbook 示例:
- name: Install nginx
yum: name=nginx state=present- name: restart nginx
service: name=nginx state=restarted enabled=yes
什么是Ansible
Ansible 是 DevOps 项目基础支撑工具之一,是第一款实现读/ 写跨平台 的“ Infrastructure- as- code” 工具,从系统管理者到开发者,都可使用Ansible自动化部署并维护整个应用的生命周期,实现持续交付。
Ansible 软件及公司
在维基百科里列出了二十多个, 其中Puppet、Chef和Salt,以及CFEngine、Vagrant和NixOS,大家都可能耳熟能详 了。不过后起之秀Ansible( http:// www. ansible. com/)的人气更高,已经是当今最常用的管理基础架构的开源管理工具之一。
运维自动化的发展
- 纯手工阶段
- 脚本阶段
- 工具阶段
Ansible:"Ansible is Simple IT Automation"
- 一款简单的自动化工具
- 无代理(无需再所要管理的系统上安装任何软件)
- Github上最热门的开源自动化工具之一,可免费使用
Ansible提供
- 应用部署
- 配置管理
- 任务自动化
目标用户:
- 运维&开发
为什么选择Ansible
特点
- 无客户端
- 简单,易懂
- 扩展性强,可管理从几十台到数千台节点
- ssh连接,安全
- 强大社区,大量module,role拿来即用
- 幂等性
Ansible工作原理
Ansible核心构成
- Inventory:定义Ansible被管理主机的清单
- Modules:包括Ansible自带的核心模块及自定义模块
- Playbooks:剧本,定义Ansible多任务配置文件,由Ansible自动执行
- API:python接口,提供二次开发及系统整合能力
- Plugins:完成模块功能的补充,包括连接插件、邮件插件等
Ansible安装
yum方式
yum install epel-release
yum install ansible -y
apt-get方式
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible
pip方式
pip install ansible
文件安装
- 可执行文件:/usr/bin/ansible*
- 配置文件目录:/etc/ansible/
- ansible-config
- hosts
- roles/
- Python lib文件:usr/lib/python2.7/site-packages/ansible
- Help文档
重要
- 在/etc/ansible/ansible-config里关闭host_key_checking
Inventory
- Ansible 通过读取默认的主机清单配置/etc/ansible/hosts,可以同时连接到多个远程主机上执行任务,也可以同时使用多个清单文件,甚至可以动态地或者从云资源中拉取清单。
Ansible ad-hoc
- ad-hoc是什么
完成实时的。一次性的,简单的工作- ad-hoc 语法规则
常用参数
- -i 指定inventory文件
- -m 指定模块
- -a 参数命令
- -u 指定访问用户
- -k 输入密码
- -K 输入sudo密码
- -f 指定并行数量(默认5)
Ansible常用模块
- ping:用于检测远程主机是否存活
- shell:在远程主机上执行shell命令
- script:在远端机器执行本地脚本
- yum/apt:用于安装软件包
- service:用于管理服务
- file:用于配置文件属性
- copy:复制文件到远程主机
- setup :查看远程主机的基本信息
ping
检查目标主机手否存活
示例:
- ansible -i yard all -m ping
shell
在目标主机执行shell命令
- chdir:运行shell之前cd到某个目录
示例:
- ansible all -m shell -a "cat /etc/centos-release"
- ansible all -m shell -a "cat centos-release chdir=/etc"
script
在目标机器上执行本地脚本
- chdir:先进入目标文件夹再执行脚本
示例:
ansible db -m script -a "/tmp/add_env.sh"
ansible db -m script -a "/root/test.py chdir=/var/www/"
apt/yum
apt、yum 模块分别用于管理Ubuntu系列和RedHat系列系统软件包
- name:软件包名
- state:软件包的状态(present/installed/absent/removed)
示例
- 确保httpd包已经安装
ansible webservers -m apt -a "name=httpd state=present"- 确保安装包到一个特定的版本
ansible webservers -m apt -a "name=httpd-1.5 state=present"- 确保一个软件包没有被安装
ansible webservers -m apt -a "name=httpd state=absent"
service
管理目标机器服务的状态
- name:必选项,服务名称
- state:对当前服务执行启动,停止、重启、重新加载等操作
(started,stopped,restarted,reloaded)- enabled:是否开机启动 yes|no
- runlevel:运行级别
- arguments:给命令行提供一些选项
示例:
- ansible test -m service -a "name=httpd state=started enabled=yes"
- ansible test -m service -a "name=network state=restarted args=eth0"
- ansible test -m service -a "name=httpd state=stopped"
copy
将文件从ansible管理机拷贝到目标机器
- src:源文件
- dest:目标路径
- backup:覆盖之前,是否备份原文件
- owner:设定文件/目标的属主
- group:设定文件/目标的属组
- mode:设定文件/目标的权限
示例:
- ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=644"
- ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes"
file
操作目标机器文件属性,新建/删除文件,文件夹及链接文件
- group:定义文件/目录的属组
- owner:定义文件/目录的属主
- mode:定义文件/目录的权限
- path:必选项,定义文件/目录的路径
- state:定义文件状态(directory/link/absent/touch/hard)
示例:
- ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
- ansible test -m file -a "path=/tmp/ansible mode=755 group=test owner=test"
- ansible test -m file -a "path=/tmp/test state=directory"
setup
搜集系统信息
- 搜集主机的所有系统信息
ansible all -m setup- 搜集系统信息并以主机名为文件名分别保存在/tmp/facts 目录
ansible all -m setup --tree /tmp/facts- 搜集和内存相关的信息
ansible all -m setup -a "filter=ansible_*_mb"- 搜集网卡信息
ansible all -m setup -a "filter=ansible_eth[0-2]"
模块帮助
- ansible-doc -l #获取所有模块列表
- ansible-doc module_name #获取模块的详细信息
- 在线帮助:
http://docs.ansible.com/ansible/latest/modules_by_category.html
Playbook
- 以YAML文件作为载体
- 描述多个任务的集合
- 使目标主机按照既定顺序执行任务以达到期望状态
- 通过ansible-playbook命令执行
什么是YAML语言
一种人性化的数据格式定义语言
YAML:YAML Ain't a Markup Language
- 结构感强,可读性好
- 通用的数据串行化格式
这是一个yaml
---
#一位职工记录
name: David
job: Developer
skill: Elite
employed:True
foods:
-Apple
-Orange
Languages:
ruby:Elite
python:Elite
语法要求:
- 以‘---’作为起始句
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格
- 缩进的空格数目不重要,相同层级的元素左侧对齐即可
数据类型:
- 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence)/列表(list)
- 纯量(scalars):单个的、不可再分的值
对象
name: David
job: Developer
{''name":"David","job":"Developer"}
数组
- apple
- orange
["apple",'orange']
符合结构
students:
- name: Lucy
age:15
- name: Lily
age: 13
{students:[{"name":"Lucy","age":15,{"name":"Lily","age":13}}]}
布尔值
create_key: yes/no
gather_facts: true/False
sudoer: T/F
再看yaml
YAML语法检查
Pyhton
Python -c 'import yaml,sys;print yaml.load(sys.stdin)'< test.yamlYAML Lint
http://www.yamllint.com
Ansible命令工具
Ansible-playbook test.yaml --syntax-check
Play
未完待续,持续更新