ansible(一)了解及使用
介绍
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible是一个IT自动化工具。它可以配置系统、部署软件和编排更高级的It任务,如连续部署或零停机滚动更新。
Ansible的主要目标是简单易用。它还非常注重安全性和可靠性,具有最少的移动部件、使用OpenSSH进行传输(使用其他传输和拉模式作为替代),以及一种围绕可审计性而设计的语言,甚至是那些不熟悉该程序的人。
特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
上图对应的模块功能如下:
- Ansible:Ansible核心程序。
- HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
- Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
- CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
- CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
- ConnectionPlugins:连接插件,Ansible和Host通信使用
ansible生成的主要文件
/etc/ansible
/etc/ansible/ansible.cfg #配置文件
/etc/ansible/hosts #主机库(host inventory)管理被监控的主机
/usr/bin/ansible #主程序
/usr/bin/ansible-doc #帮助文档
/usr/bin/ansible-playbook #“剧本”YAML格式文件
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界面可与用户交互的命令执行工具
安装
yum命令安装
我们需要先安装一个epel-release包,然后再安装我们的 ansible 即可。
yum install epel-release -y
yum install ansible –y
注意:ansible配置文件查找顺序
ansible与我们其他的服务在这一点上有很大不同,这里的配置文件查找是从多个地方找的,顺序如下:
检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
/etc/ansible.cfg检查etc目录的配置文件。
做ansible主机与其他各个节点的免密,以便使用
使用
新建用户devops
做免密并且给这个用户root权限(visudo)
结果:绿不变,黄变,红色报错
命令使用(shell)
在/etc/ansible/hosts文件中添加ansible要管理的node ip
eg:
node1
172.25.70.11
node2
172.25.70.12
ansible node1 -m ping -k ##做ping测试
这部分还有很多参数去了解使用
剧本使用(playbook)
这的前提是免密已经做好了 方便操作
cd /home/devops
mkdir ansible
vim ansible.cfg
vim hosts
eg:httpd.yml
--- ##固定格式
- hosts: web ##操作node主机
tasks: ##任务
- name: yum nginx
yum:
name: httpd
state: present
- name: config httpd
copy:
src: httpd.conf
dest: /etc/httpd/conf.d/httpd.conf
notify: restart httpd ##触发器
handlers: ##编写触发器
- name: restart httpd
service:
name: httpd
state: restarted
--- ##这是一个雷打不动的开头
- ##每个-下面表示是这个-的范围,每一个顶级的-表示一个play,每个play中必须包含host task通过key-value来表示值,通过: 来分割键值
playbook的语法
循环
vi /etc/ansible/while.yml
---
- hosts: testhost
user: root
tasks:
- name: change mode for files
file: path=/tmp/{{ item }} mode=600
loop:
- 1.txt
- 2.txt
- 3.txt
##说明: with_items为循环的对象
##执行 ansible-playbook while.yml
判断
vi /etc/ansible/when.yml
---
- hosts: testhost
user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: ansible_ens33.ipv4.address == "172.7.15.114" ##当ip等于172.7.15.114时执行操作
##说明:ansible aming-02 -m setup 可以查看到所有的facter信息
##这里还有block等语法
触发
执行task之后,服务器发生变化之后要执行的一些操作,比如我们修改了配置文件后,需要重启一下服务
vi /etc/ansible/handlers.yml
---
- name: handlers test
hosts: shuai-02
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/aaa.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "111111" >> /tmp/aaa.txt
说明,只有copy模块真正执行后,才会去调用下面的handlers相关的操作。
也就是说如果1.txt和2.txt内容是一样的,并不会去执行handlers里面的shell相关命令。
这种比较适合配置文件发生更改后,重启服务的操作。
比如我们在用playbook部署nginx时
变量
角色使用(role)
在/home/devops/ansible下
mkdir roles
cd roles
ansible-galaxy init nginx ##自动创建一个nginx的角色目录
tree .
roles/
├── nginx
│ ├── defaults ##默认变量存放目录(优先级最低)
│ │ └── main.yml
│ ├── files ##copy模块使用的静态变量文件存放地
│ ├── handlers
│ │ └── main.yml ##触发器放置地
│ ├── meta
│ │ └── main.yml ##文件包含Role元数据,包含的依赖关系
│ ├── tasks
│ │ └── main.yml ##该角色的任务
│ ├── templates ##template模块用的动态文件存放地
│ └── vars
│ └── main.yml ##变量
##再通过使用调用模板再yaml文件中 使用角色
加密(Vault)
ansible-vault create vars/main.yml
Vault Password:
ansible-vault encrypt roles/users/vars/main.yml ##加密文件
create ##创建一个新文件并进行加密
decrypt ##从加密文件创建明文文件
edit ##编辑已经存在的加密文件
encrypt ##加密现有的纯文本文件
rekey ##在加密文件中设置新密码