ansible介绍
Ansible 是一个简单的自动化引擎,可完成配置管理、应用部署、服务编排以及其他各种IT需求。Ansible也是一款使用Python 语言开发实现的开源软件,其依赖Jinja2、paramiko 和PyYAML这几个Python 库。Ansible的作者是Michael DeHaan,Michael DeHaan于2012 年创建了AnsibleWorks 公司,之后改名为Ansible 公司。Ansible 公司于2015年10月被红帽公司(Red Hat)收购。
ansible安装
Ansible不需要安装客户端,依赖Python与SSH ,服务器需要安装SSH和Python2.5或2.5 以上版本的Python 。
在控制端( ansible 命令运行的那台机器)需要安装Python2.6或更高版本的Python程序, Ansible的控制端只能运行在Linux下。
可以直接使用pip进行安装,也可以使用Linux下的包管理工具(如yum 、apt-get )进行安装ansible :
pip install ansible
架构和使用场景
在Ansible 中,用户通过Ansible引擎操作主机。其中主机可以通过配置文件配置,调用云计算的接口,或者访问CMDB来获取。Ansible 的引擎由Inventory 、API 、Modules (模块)和Plugins 组成。
Ansible的典型用法是,工程师将需要在远程服务器执行的操作写在Ansible Playbook中,然后使用Ansible执行Playbook。
Inventory(服务器集合)管理
在Ansible 中,将可管理的服务器集合称为Inventory 。
服务器集合默认配置文件是/etc/ansible/hosts。
hosts文件写法:https://yq.aliyun.com/articles/661106
在Ansible 中,有三种方式指定hosts 文件,分别是:
1 )默认读取/etc/ansible/hosts 文件;
ansible test --list-hosts#获取配置文件/etc/ansible/hosts中test分组的主机
2 )通过命令行参数的-i 指定hosts 文件;
ansible test -i ~/hosts --list-hosts#获取配置文件~/hosts中test分组的主机
3 )通过ansible.cfg 文件中的inventory 选项指定hosts 文件。
$ vi /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts
YAML语法
通过前面使用场景的介绍,我们知道ansible有俩种执行模式:
1、前面通过ansible 命令执行操作的方式(ansible test -i ~/hosts --list-hosts
),官方称为ad-hoc 。
2、在实际生产环境,将远程服务器需要做的事情写在YAML配置文件中,这个YAML文件称为Ansible Playbook。
Playbook示例:
$ cat test_playbook .yml
---
- hosts: test
become: yes
become method: sudo
tasks:
- name: copy file
copy: src=/temp/test.py dest=/temp/test.py
- name: change mode
file: dest=/temp/test.py mode=500 owner=root group=root
- name: ensure packages installed
apt: pkg={{ item }} state=present
with items:
- tmux
- git
我们来了解下Playbook。Playbook中包含一些声明信息,如hosts关键字声明该Playbook应用的服务器列表, become和become_ method表示在远程服务器通过sudo执行操作。Playbook 最后包含了若干个task , 每一个task 对应于前面的一条ad-hoc 命令。具体执行时,多个task 按序执行。
YAML 的语法规则如下:
YAML文件的第一行为"—",表示这是一个YAML文件
YAML中的字段大小写敏感
YAML与Python一样,使用缩进表示层级关系
YAML的缩进不允许使用Tab键,只允许使用空格,且空格的数目不重要,只要相同层级的元素左侧对齐即可
“#” 表示注释,从这个字符一直到行尾都会被解析器忽略。
YAML 支持三种格式的数据,分别是:
对象:键值对的集合,又称为映射,类似于Python 中的字典
数组: 一组按次序排列的值,又称为序列(sequence),类似于Python 中的列表
纯量(scalars):单个的、不可再分的值,如字符串、布尔值与数字。
通过PyYAML来解析yaml文件来帮助理解,这里看到YAML对象相当于python的列表:
$ more ./test/data.yaml
---
#动物列表
- Monky
- bird
- cat
- dog
$ ipython
In [1]: import yaml
In [2]: with open('./test/data.yaml') as f:
...: print(yaml.load(f))
...:
# -*- coding: utf-8 -*-
['Monky', 'bird', 'cat', 'dog']
Ansible命令(ad-hoc)和模块
Ansible对远程服务器操作首先确定对哪些服务器进行操作, 其次要确定对服务器执行哪些操作。在Inventory管理,介绍了如何指定远程服务器。
这里介绍如何对远程服务器进行操作。模块(也被称为 “task plugins” 或 “library plugins”)是在 Ansible中实际在执行的,它们可以放playbook tasks中执行,也可以通过 ‘ansible’ 命令(ad-noc模式)来执行。
Ansible命令(ad-hoc)
示例:
$ ansible test -m ping
n127.0.0.1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
n192.168.0.105 | SUCCESS => {
"changed": false,
"ping": "pong"
}
ping模块是Ansible中最简单的模块,测试远程服务器是否在线。在Ansible中,通过-m参数指定模块名称,通过-a参数指定模块的参数。
ansible命令的详细参数如下:
参数 | 作用 |
---|---|
-m | 要执行的模块,默认为command |
-a | 模块的参数 |
-u | ssh连接的用户名,默认用root,ansible.cfg中可以配置 |
-k | 提示输入ssh登录密码,当使用密码验证的时候用 |
-s | sudo运行 |
-U | sudo到哪个用户,默认为root |
-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模块
Ansible 通过模块来执行具体的操作,比如上面用到的ping模块。我们执行操作后,会返回一个信息,他是什么意思呢?这里列出了Ansible中常见的模块返回值。
$ ansible test -m ping
n127.0.0.1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
n192.168.0.105 | SUCCESS => {
"changed": false,
"ping": "pong"
}
常见的模块返回值:
返回值名称 | 返回值含义 |
---|---|
changed | 几乎所有的Ansible 模块都会返回该变量,表示模块是否对远程主机执行了修改操作 |
failed | 如果模块未能执行完成,将返回failed为true |
msg | 模块执行失败的原因,常见的错误如ssh 连接失败,没有权限执行模块等 |
re | 与命令行工具相关的模块会返回rc,表示执行Linux命令的返回码 |
stdout | 与rc类似,返回的是标准输出的结果 |
stderr | 与rc类似,返回的是错误输出的结果 |
backup_file | 所有存在backup选项的模块,用来返回备份文件的路径 |
results | 应用在Playbook中存在循环的情况,返回多个结果 |
我们已经了解了模块的返回值的含义,Ansible的模块非常多,可以通过ansible-doc查看模块的完整帮助信息或基本使用方法。例如,下面的命令用以获取file模块的帮助信息:ansible-doc file
ansible-doc -l file
常用模块介绍篇幅较长,请移步本人另一文章:ansible常用模块详解