本文借鉴了网络上许许多多的资源,这里对所有网友表示感谢,感谢你们的付出。
##一、Ansible简介
Ansible是一个非常强大的开源自动化工作。是什么特性让它有别于其他的管理工具呢?那就是它是一个有非常棒的部署和编排工具。在许多方面,它旨在为各种自动化挑战提供巨大的生产力收益。
上述是ansible的工作原理示意图,下面对各个部分进行简要介绍:
- ANSIBLE PLAYBOOKS:任务剧本(任务集), 编排定义;ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件;
- INVENTORY:Ansible管理主机的清单;
- MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可以自定义;
- PLUGINS:模块功能的补充,如链接类型插件、环插件、过滤插件等,该功能不常用;
- API:供第三方程序调用的应用编程接口;
- ANSIBLE:将INVENTORY、API、MODULES 、PLUGINS组合到一起的命令工具,其为核心执行工具。
ansible的优势如下:
- 去中心化
- 上手相对puppet这样的工具要简单些
- 安全,无需安装客户端
- 使用YAML格式的定制剧本,语法简单,维护方便
Ansible 的应用场景如下:
- Dev开发环境
- 使用者:程序员
- 功能:程序员开发软件测试BUG的环境
- 测试环境
- 使用者:qa测试工程师
- 功能:测试经过Dev环境测试通过的软件功能
- 发布环境
- 使用者:运维
- 功能: 发布代码至生产环境
- 生产环境
- 使用者:运维
- 对用户提供服务
- 灰度环境
- 使用者:运维
- 在全量发布代码前将代码的功能面向少量精准用户发布的环境
##二、ansible的目录结构介绍
ansible 大致的目录结构如上所示,重点提一下两个目录:
- 置文件目录:/etc/ansible/,主要功能有:Inventory主机信息配置、Ansible工具功能配置等,所有Ansible的配置均存放在该目录下,运维日常的所有配置类操作也均基于此目录进行。
- 执行文件目录:/usr/bin/,主要功能为:Ansible系列命令默认存放目录,Ansible所有的可执行文件均存放在该目录下。
ansible 主配置文件(/etc/ansible/ansible.cfg
)如下所述:
Ansible 配置文件(绝大多数配置保持默认就好)
(1)[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp # 生成的临时py命令文件存放在远程主机的目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数
#poll_interval = 15 # 默认的线程池
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
host_key_checking = False ### 检查对应服务器的host_key
(2)[privilege_escalation]
(3)[paramiko_connection]
(4)[ssh_connection]
(5)[accelerate]
(6)[selinux]
(7)[colors]
##三、Ansible相关主命令概述
本文的命令介绍基于ansible 2.2.1.0版本介绍,各版本间会存在些许差异。
通过查询命令 rpm -ql ansible | grep "/usr/bin"可得知ansible相关的命令如下:
- /usr/bin/ansible : Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行。
- /usr/bin/ansible-console : Ansible基于Linux Consoble界面可与用户交互的命令执行工具
- /usr/bin/ansible-doc: Ansible 模块功能查看工具
- /usr/bin/ansible-galaxy :加载其他优秀的工具模块,可在官网查找Galaxy相关模块
- /usr/bin/ansible-playbook :可用于加载定制自动化的任务集编排的工具
- /usr/bin/ansible-pull /usr/bin/ansible-vault :Ansible 文件加密工具
ANSIBLE 命令的执行过程
- 加载自己的配置文件 默认/etc/ansible/ansible.cfg
- 加载自己对应的模块文件,如command
- 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
- 给文件+x执行
- 执行并返回结果
- 删除临时py文件,sleep 0退出
##四、Ansible基础命令详解
该部分只罗列一部分模块的一部分功能,如有需要请使用ansible-doc modulesname
查询详细功能。
1、安装ansible
需要配置epel源
#yum install ansible -y
2、简单的ping模块使用
提前对参与主机进行key验证:
[root@localhost ansible]# ssh-keygen
[root@localhost ansible]# ssh-copy-id root@172.18.14.31
[root@localhost ansible]# ssh-copy-id root@172.18.14.32
进入到ansible路径,编辑hosts文件
ansible的hosts文件,用来设定自定义"组",如[web]组,以[“name”]开头,后面跟着的ip/主机名(提前编辑系统hosts文件)都属于这个"组",新建其他组以空行再以[“name”]开始。
执行命令:
ansible 简单命令格式:
ansible <host-pattern> [options]
ansible 表达式 选项
3、ansible 支持补全,ansible+tab 即可罗列ansible相关的主命令:
4、ansible-doc -l 显示可使用的ansible相关的功能模块指令集。
例如: ansible-doc command 查看command模块的功能
5、 command模块的使用:
在远程机器上执行相关命令
注意 command不支持使用管道
6、Shell模块,也可以让远端主机执行命令,支持管道
7、copy模块:文件分发,即将ansible主机的文件发送到所有的指定组的主机中去。
小实例:
如下所示:绿色表示执行成功,但目标主机中存在相同文件,且没有改动
黄色表示执行成功,且目标主机不存在该文件或目标主机文件和发送端主机文件存在差异
8、cron: 利用ansible设定一个计划任务的模块:
9、ping模块
以root用户执行ping存活检测 (用户可以随意指定,但前提是指定的用户已经过密匙认证)
ansible all -m ping -u root
在用未经过密匙认证的switch用户指定命令:权限拒绝了!
注意:但在新版本中Ansible sudo
命令废弃,改为–become 或-b,
如上命令需改为如下:
//以root sudo至root执行ping存活检测
ansible web -m ping -u root -b
10、File模块
修改ansible自定义组内用户文件的属性: ansible srv120 -m file -a “path=/root/a.sh
owner=switch” owner:即修改文件的属主为指定用户
ansible srv120 –m file –a ‘path=/tmp/tmpdir state=directory’ # 该命令为在远端用户创建目录
ansible srv120 –m file –a ‘src=/tmp/fstab path=/tmp/fstab.link
state=link’ #创建一个链接文件
11、Hostname 模块
设置目标组的主机名
ansible web -m hostname -a “name=web120”
12、YUM模块
ansible web -m yum -a ‘name=httpd state=latest’
latest安装命令选项的一种,详见ansible-doc yum
13、Service模块
对远端主机的某个服务执行指令
Ansible web –m service –a ‘name=nginx state=reloaded’
14、User 模块
在指定组内主机上创建用户
15、scripts模块
将本地的脚本复制到远程主机并在远程主机执行
ansible 192.168.99.73 -m script -a ‘run.sh creates=/tmp/run.123’
当目标主机存在/tmp/run.123文件时,该命令不执行
ansible 192.168.99.73 -m script -a ‘run.sh creates=/tmp/run.123’
当目标主机存在/tmp/run.123文件时,该命令不执行
额外的补充:
ansible-console #ansible的一个交互式界面,可以针对某个组的所有成员,执行同一命令,
cd 切换组 #基于/etc/ansible/hosts 文件内定义的组
forks 3 改变线程数
##五、YAML介绍
YAML 的意思其实是:"Yet Another Markup Language”, 但为
了强调这种语言以数据做为中心,而不是以标记语言为重点,而
用反向缩略语重命名,其特点如下:
1)首先以“—”(3个减号)开始,且需顶行首写。 2)次行开始正常写Playbook的内容,但笔者一般建议写明该
Playbook的功能。 3)使用#号注释代码。 4)缩进必须是统一的,不能空格和tab混用。
5)缩进的级别也必须是一致的,同样的缩进代表同样的级别, 程序判别配置的级别是通过缩进结合换行来实现的。
6)YAML文件内容和Linux系统大小写判断方式保持一致,是区 别大小写的,k/v的值均需大小写敏感。
7)k/v的值可同行写也可换行写。同行使用:分隔,换行写需要 以-分隔。 8)一个完整的代码块功能需最少元素需包括name: task。
9)一个name只能包括一个task。
##六、Ansible-playbook
playbook运用了YAML语法
使用示例:ansible-playbook playbook.yml
一次针对某对某个业务写一套ansible的“脚本”
1、Ansible playbook: 配置添加用户的服务
2、案例-配置httpd服务简单案例:
3、Playbook中变量使用
变量来源:
- Ansible setup中facts到的信息变量可直接使用
- 自定义变量
变量定义(/etc/ansible/hosts)
- 普通变量
[srv1]
192.168.99.120 http_port=8080 hname=www120
192.168.99.178 http_port=80 hname=www178
- 命令行指定变量
Ansible-playbook –e 调用
- 组变量
[svr1:vars]
http_port=808
[srv1]
192.168.99.120 http_port=8080 hname=www120
192.168.99.178 http_port=80 hname=www178
4、Playbook中handlers使用
5、Playbook中tags使用
[root@ansibletest ansible]# ansible-playbook --tags="rshttpd" tags.yml
或者:
[root@ansibletest ansible]# ansible-playbook -e rshttpd tags.yml
6、Playbook模templates
Template语法
算术运算 + - * / % **
比较操作符 == >= != <= < >
流表达式 For If When
6、1 Playbook中template变更替换
worker_processes {{ ansible_processor_vcpus }};
先准备xx.j2文件:以nginx为例子,nginx.conf.j2 为nginx.conf改名而来
下面的文件添加nginx.conf.j2文件最后
再准备 template.yml
/etc/ansible/ template.yml
查看效果:
6、2 Playbook中template算术运算
算法运算:
worker_processes {{ ansible_processor_vcpus+1 }}; #支
持算术运算
其他步骤和前一个一样,只要注意以下步骤就行:
6.3 Playbook中template for if
和前面两个template实验差不多,需要注意以下步骤:
对/etc/ansible/hosts文件进行修改,以便后续使用
对nginx.conf.j2文件最下面做如下修改:
6、4 Playbook中when条件判断
[root@ansibletest ansible]# ansible web -m setup | grep distribution
上述命令可搜寻该主机对应的属性,用来做判断条件
template配置
测试:
6、5 Playbook迭代with_items
6、6 Playbook字典with_items
注意:这里面定义的组(switch)要事先存在哦。
7、roles
roles的结构示意如下:
Roles应用场景 复杂场景
② 如命名不规范维护和传承成本大;
③ 某些功能集需Includes多个Playbook方可实现
这些场景下建议使用roles 代码复用度高
roles的目录编排示意图如下:
Ansible Roles各目录作用
1. roles/x/tasks/main.yml:主函数,包括在其中的所有任务将被执行。
2. roles/x/handlers/main.yml:所有包括其中的handlers 将被执行
3. roles/x/vars/main.yml:所有包括在其中的变量将在roles中生效
4. roles/x/meta/main.yml:roles所有依赖将被正常登入。
5. roles/x/{files,templates,tasks}/ (dir depends on task) 所有文件,模板都将可存放在这里放在这
Roles 使用实例(构建一个nginx安装项目):
注意:默认yum安装的ansible /etc/ansible/ 目录下,默认存在roles文件夹,我们要建设的项目就可以存放此目录下,还有,该目录下,各个项目的各个“任务组件”可以相互“套用”
开始:
进入roles目录
创建相关文件:项目
创建 task 下的main.yml文件
[root@ansibletest templates]# cat nginx.conf.j2
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes {{ ansible_processor_vcpus }};
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
测试成功,因为之前做实验的原因,导致环境没有改变,所以显示绿色,我们把nginx卸载,再试一次。