Ansible
检查剧本格式(缩进,空格):
ansible-playbook 剧本.yml --syntax-check
ansible-playbook 剧本.yml -c
• 为什么要使用ansible?
大批量部署的时候,需要使用到ansible自动化部署和维护工具。Ansible是一款自动化运维配置管理工具,用于管理多台操作系统,分为控制端和被控端,基于SSH协议去管理客户端,Ansible会读取控制端hosts文件,根据其中配置对被控端机器实现批量、并发的配置管理和维护。如果任务比较复杂可以写成PlayBook剧本进行分发管理。
• 在ansible主机上配置hosts文件:
vim /etc/hosts
• 修改ansible主机清单文件:
▪ 查看ansible的配置文件:
rpm -qc ansible
▪ 配置主机清单文件:
vim /etc/ansible/hosts
文件最后添加:被控主机名列表
▪ 测试主机清单是否正常:
ansible 主机名 -m ping
-m:指定使用模块 ping:模块名
tips:需要配置免密
**▶ Ansible模块学习**
**• 查看ansible的帮助手册:**
ansible -doc ping
tips:/搜索查看EXAMPLE示例(优先看)
•查看主机清单:
ansible-inventory --list
ansible-inventory --graph
**• 查看系统有哪些模块:**
ansible-doc --list
**• command模块:**
1.不会通过shell处理命令,因此不支持$HOME这样的变量
2.功能:在远程主机执行系统命令,默认模块,可忽略-m选项
3.注意:此命令不支持变量,<> | ; &等,建议使用shell模块实现
4.此模块不具有幂等性
5.参数chdir:执行命令前先切换到此目录
tips:幂等性:
比如要多次执行一个剧本,有动作第一次执行成功,之后执行剧本的时候不会再执行
**• shell模块**
和command相似,不具有幂等性,支持各种符号,正则匹配,管道符,环境变量等
shell: /usr/local/nginx/sbin/nginx #手动启动nginx
因为shell脚本不具有幂等性,所以每次都会允许,如何避免?
creates: /usr/local/nginx/logs/nginx.pid
tips:启动nginx之后才会有nginx.pid文件,停止后该文件消失
**• 剧本:**
vim ping.yml
- hosts: all #-和hosts中间空格,冒号之后空格必须有
tasks:
- name: ping all server #name,任意写
ping:
tips:剧本,使用yaml语言,改语言有严格的格式要求:
1.左边是键
2.右边是值
3.有严格的缩进 2个空格
4.层级关系是通过缩进来表示
**• script模块**
功能:在远程主机上运行ansible服务器上的脚本,不具有幂等性
- hosts: all
tasks:
- name: run scripts
script:
cmd: ansible服务器上脚本路径
**• yum模块**
- hosts: all
tasks:
- name: install epel-relaese packages
yum:
name: epel-release
state: latest
state:
present:默认,没有就装,有就不装,不会升级
latest:确保最新版。没有就装,有但是版本旧,升级到最新
absent:确保卸载
#### **• yum_repository模块** stats:persent(默认) absent:删除配置
功能:帮助我们批量管理远程主机上的yum仓库
- hosts: all
tasks:
-name: xxxx
yum_repository:
name: cd room #指定仓库名称,对应[]内容
baseurl: file:///mnt #指定源地址,对应baseurl
description: xxx #注释信息,对应name
enabled: yes
gpgcheck: no
#### **• service模块
name:定义要启动的服务的名称
state:指定服务状态
started:启动服务
stopped:停止服务
restarted:重启服务
reloaded:重载服务
enabled:开机自启
#### **• cpoy模块
功能:从主控端复制文件到远程主机

- name: 名字
copy:
src: /root/test.sh
dest: /root/new_test.sh
mode: 777
将本地test.sh文件copy到远程主机
**• fetch模块**
功能:把远端文件拷贝到本地
- name:xxx
fetch:
src: /var/log/messages
dest: /root
把远端messages文件拷贝到本地root目录下,会在本地生成/root/主机名/root/log/messages
**• get_url模块**
- name: xxx
get_url:
url: http://xxxxxxxxxxx
dest: 下载保存到被控端的地址目录
checksum: 对目标文件在下载后计算摘要,以确保其完整性
**• file模块**
path:指定远程主机目录或文件信息
state:directory,在远端创建目录
touch:在远端创建文件
link:link或hard表示创建链接文件
absent:表示删除文件或目录
owner:设置所有者
group:设置所属组
mode:设置权限
recurse:递归操作文件夹本身和其子目录子文件,yes 或 no
**• archive模块**
功能:打包压缩,保存在被控端
- name: 打包远端log目录到/root下面
archive:
path: /var/log
dest: /root/log.tar.gz
owner: centos
mode: 644
**• unarchive模块**
功能:将主控端上的压缩包传到远程主机后解压至特定目录
设置copy=no,会将远程主机上某个压缩包解压到指定路径下
remote_src和copy功能一样,只是相反
压缩包在主控本地:copy=yes remotes_src=no
压缩包在远程主机:copy=no remotes_src=yes
**▶ Ansible的角色**
**• 创建Role:**
ansible-galaxy init nginx
会生成一个标准的Role目录结构:
defaults:默认变量,优先级最低,外部playbook可以覆盖它
files:存放静态文件,直接拷贝到远程主机,不能插值变量,copy模块读从此目录取文件
handlers:触发器。只有被notify触发时才执行,常用于重启服务
meta:依赖关系。角色元信息,依赖清单,作者信息
tasks:核心任务。角色真正执行的任务列表,必写
templates:jinja2模板(后缀一般.j2),支持{{变量}}渲染,template模块读取这里
tests:自带的测试Playbook,用来调试本角色
vars:角色内部变量,优先级高。vars>外部变量>defaults
README.md:角色说明文档,用法、参数、示例
**• 角色使用步骤:**
1.创建Role:ansible-galaxy init <role_name>
2.编写tasks、handlers、templates、defaults
3.在外部playbook中引入角色(roles:)
- hosts: web
roles:
-nginx
4.执行外部playbook
vim ~/.vimrc
autocmd FileType yaml setlocal ts=2 sw=2 ai et
▶ Role 所有目录文件 + 编写示例 + tasks/main.yml 使用方式
• defaults/main.yml:
示例:
#defaults/main.yml
nginx_pkg: nginx
nginx_svc: nginx
nginx_port: 80
使用:
#tasks/main.yml
name: "{{ nginx_pkg }}"
#### • vars/main.yml:
示例:
#vars/main.yml
nginx_conf_dir: /etc/nginx/conf.d
使用:
#tasks/main.yml
path: "{{ nainx_conf_dir }}"
#### • templates(jinjia2模板文件)
示例:
templates/nginx.conf.j2
server{
listen {{ nginx_port }}; #vars或者defaults定义的变量
root {{ nginx_html_dir }};
}
使用:
- name:下发nginx配置模板
template:
src: nginx.conf.j2 #解析文件中变量
#### • handlers/main.yml:
触发器,只有changed并且notify才执行
示例:
#handlers/main.yml
内部是正常的yml剧本写法
- name: restart nginx
service:
name: xxx
state: restarted
enabled: yes
使用:
#tasks/main.yml
在任务末尾加notify:触发器名字
- name:xxx
xxxx
xxx
notify: restart nginx
#### • tasks目录下自己拆分出来的yml文件:
tasks/main.yml如何调用它:
import_tasks: install.yml
#### • files目录(静态文件,不会渲染变量):
文件:files/demo.html
<hi>hello ansible role files</h1>
使用:
使用copy模块,src直接写文件名,自动去files目录查找
- name: 拷贝静态网页文件
copy:
src: demo.html
• meta/main.yml
角色元信息,声明作者、ansible最低版本、角色依赖
两个用途:
1.上传到Ansible-Galaxy(Ansible官方角色仓库)是展示信息
2.Ansible执行时读取dependencies,自动先运行依赖的其他角色
示例:
#meta/main.yml
galaxy_info:
author: Wz #作者名字
description: 部署nginx服务 #这个角色干什么
min_ansible_version: "2.14" #运行本角色的最低ansible版本
license: MIT #开源许可证,别人可以自由使用下载
dependencies: [] #唯一一个会改变执行流程的配置
**角色依赖列表,运行当前这个nginx角色之前,必须先执行完列表里面的其他角色**
[]代表空列表,也就是没有任何依赖角色
**示例:**
**装nginx之前,需要先关闭防火墙,有一个角色firewalld_close**
dependencies:
-role: firewalld_close
执行顺序就变成了:
1.先跑完firewalld_close角色
2.跑完,才跑此角色
完全不需要在tasks里面写任何东西
当调用此role时,如果dependencies有角色列表,ansible会自动先执行依赖角色