自动化运维工具之ansible
工作模式:以主控制端身份管理被控制端,被控制端需安装代理程序或者通过ssh协议被管理,适用于中小环境
只需要在主控端安装ansible程序包
(一般情况下都是基于ssh key验证协议使用,将ansible主机ssh公钥传给被控制端)
ansible是基于模块的方式来进行操作的,实现管理的方式有两种:
1.命令行输入指令
2.将需要执行的操作规划在指定playbook中,自动逐条执行
ansible的相关配置
1.配置文件/etc/ansible/hosts 用来存放需要批量进行ansible操作的主机清单
其中可以直接写入被控制端IP,也可以自定义进入不同的组中:
[GROUP_NAME ]
IP-1
IP-2
注意:每个主机IP可以存放在不同的组中
(默认是基于SSH端口,若不是,则可以另外在主机地址后加“:端口号”)
2.配置文件/etc/ansible/ansible.cfg,定义了ansible执行时的一些默认选项,常用的选项如下:
fork=VALUE 表示可同时并发编排的被控制端数量
host_key_checking = False 表示进行ansible操作时,不需要对第一次访问的主机进行“yes/no”的询问
log_path = /var/log/ansible.log 表示开启日志记录
ansible的相关命令
1.ansible-doc
ansible-doc -l 表示查看目前可用的模块
ansible-doc [-s] Module_NAME 表示查看某模块详细[ 简要 ]用法
2.ansible 单条命令执行ansible相关操作,格式如下:
ansible IP -m Module_NAME -a ARGS
IP:指在/etc/ansible/hosts设定的各分类主机
(若是将IP写为all,则表示清单中所有主机,也可写GROUP_NAME,但是需要使用“”号,也支持通配符)
-m Module_NAME:指定运用的模块,默认是command模块
ARGS:表示模块对应的相关参数,参数需要‘’号引起来
另外的一些选项使用:
-u 指定被控制端执行命令的用户,默认是root
-k 若是主控之间不是基于ssh key验证,则需要加入选项,输入被控制端主机登入口令
-C 进行测试,检查语法
-b 表示切换至sudo执行操作,默认sudo切换用户是root,若是需要切换至普通用户,则另外需要加“—become-user USER”,并且需要结合“-K”选项输入自身普通用户的密码
ansible常用模块
command 默认使用的执行命令型模块,但是不支持一些变量、特殊符号,建议使用shell模块(在件/etc/ansible/ansible.cfg进行修改)
script 通过运行ansible主控端上的脚本,在被控制端主机上实现实际内容操作
copy、fetch(与copy相反)文件的复制、获取
file 用来创建、删除文件,设置软、硬链接,以及修改属性等
cron 计划任务
yum、service 程序包的安装、卸载;服务的启动、暂停、重启和加载
hostname、user、group
PlayBook
YMAL语言编写的ansible需要执行的内容,通常文件名为yml或yaml结尾,格式如下:(文件格式缩进有严格要求,并且区分大小写)
vim FILE_NAME.yml
---
- hosts: 指定主机范围
remote_user: 指定用户
tasks: (可存在多个模块任务)
- name: 执行模块的描述a
Module_NAME:模块对应的需要被执行的参数信息
…
在playbook编写完成结束,可使用如下命令进行调用执行:
ansible-playbook FILE_NAME.yml [OPTION]
常见的OPTION如下:
--check(-C) 试运行来检测正确与否
--list-hosts 列出执行任务的主机列表
--limit HOST_LIST 只针对指定HOST_LIST运行任务
为了保证编写的脚本文件的安全性,可使用ansible特定命令进行加密:(注意加密后就不可以执行ansible-playbook操作)
ansible-vault encrypt FILE_NAME.yml
若是需要解密,则将encrypt 换为 decrypt 即可
playbook中的其他一些复杂用法
1.特定触发条件的操作:
notify:描述信息 (位置处于tasks中发生变化的模块任务下方)
handlers: (与tasks处于同级阶段,注意格式缩进)
- name: 描述信息
Module_NAME:模块对应的需要被执行的参数信息
(注意:其中notify用来定义发生变化的模块任务,从而通知触发handlers里设置的指定模块任务运行,因此要求此时notify与handlers里指定模块任务的描述信息必须一样,这是因为如果执行模块多了的话,保证对应性)
并且notify还可以通过列表的方式,在一个发生变化的模块任务下触发handlers里中多个任务模块,格式如下:
notify:
- 描述信息-1
- 描述信息-2
2.通过设置的标签来执行特定的任务
tags:NAME (tags位置处于tasks某个模块任务下)
通过在执行剧本文件时调用标签,来实现只执行标签指定的模块任务,命令如下:
ansible-playbook -t NAME FILE_NAME.yml
标签可以同时指定多个,以“,”分隔
3.变量的使用
第一种:ansible的setup 模块可直接调用远程主机的已有信息,可通过参数指定,来显示对应信息,执行命令如下:
ansible IP -m setup -a ‘filter= VAR_NAME’
其中主要使用的变量如下:
ansible_distribution_major_version 显示系统主版本号
ansible_nodename 显示完整主机名
ansible_memtotal_mb 显示总内存大小
ansible_processor_vcpus 显示cpu的进程数
第二种:在主机清单文件/etc/ansible/hosts中设置
可在每个主机IP后给其单独设定变量:VAR_NAME=VALUE
也可通过组设定变量,只要在组中的成员变量都有效,其中公共组变量设置格式:
[GROUP_NAME:vars ]
VAR_NAME=VALUE
值得注意的是,若变量冲突,则优先使用单独定义的变量
第三种:通过命令行设定并进行调用执行:
ansible-playbook -e VAR_NAME=VALUE FILE_NAME.yml
也可以同时指定多个变量:-e “VAR_NAME1=VALUE1 VAR_NAME2=VALUE2”
( 变量在FILE_NAME.yml中引用时,需要如此格式 {{ VAR_NAME }} )
第四种:在playbook中直接定义,或者写入独立yml文件中,格式如下:
vars: vars_files:
- VAR_NAME1: VALUE1 - vars.yml(此文件中定义变量)
- VAR_NAME2: VALUE2
注意以上变量的优先级顺序: 命令行 > 文件vars.yml > 主机清单文件/etc/ansible/hosts
4.模板templates(需要调用的template模块只能在playbook中使用)
功能:根据模块文件动态同步相关配置文件
要求:必须在需要执行的FILE_NAME.yml文件的同级目录下,创建templates文件夹,并将需要调用的模板文件以“.j2”结尾放入其中,然后在FILE_NAME.yml文件调用template模块任务,格式如下:
template: src=FILE.j2 dest=/PATH (此处的FILE.j2是相对路径下的文件,也可写成绝对路径)
其中也可通过条件判断,来执行指定条件下运行的模块任务,方式如下:
when: CONDITION 位置在指定指定模块任务下,当条件成立时,才执行对应任务
template模块任务也可以调用用If与for语句编写“.j2”结尾的文件,遵循以下格式:
{%for n in “定义变量”%}
server{
{%if “条件判断”%}
{%endif%}
}
{%endfor%}
5.迭戈嵌套变量,会按照定义的元素列表,在需要执行的模块任务中调用,依次执行,格式如下:
模块任务中引用变量{{ item }}
with_items: (位置放在需要执行的模块任务下)
- VALUE
也可引用变量VAR定义的子变量VALUE,调用方式{{ item.VAR}}
with_items:
-{ VAR: ‘VALUE’} (注意‘’号)
roles
用于层次性、结构性地组织playbook,将每个需要执行的角色都分别建立层级目录进行组织,大致常见的模板如下:
playbook.yml (总的剧本文件)
roles/: (存放不同角色的目录)
PROJECT/: (角色名称命名的文件夹)
tasks/: (设置的模块任务文件)
files/: (需要调用的文件存放处)
vars/: (存放变量文件夹)
templates/: (模板文件夹)
handlers/: (触发条件的任务)
其中上面模板中涉及的一些文件内容如下:
1.主剧本playbook.yml的文件内容如下:
---
- hosts: 指定主机范围
remote_user: USER
roles:
- role: PROJECT (可写多个角色)
若是需要使用 tags,则格式如下:
- {role: PROJECT.tags: [‘TAG_NAME’] } (可指定多个标签)
…
2.每个角色下的tasks目录下的主调用文件 main.yml必须内容如下:
---
- include: EXAMPLE.yml (调用设置的模块任务文件,需要注意顺序问题)
…
其他的一些目录下主main.yml文件可使用正常格式编写信息,外加include调用
注意:若是需要调用不同角色下的相关文件,可使用相对路径 roles/PROJECT/PATH/TO/FILE