ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible优点:
Agentless(去中心化)
Stupied Simple (上手简单,学习曲线平滑)
SSH by default (安全,无需安装客户端)
YAML no code,定制剧本 (语法简单,维护方便)
Ansible使用场景:
(1)文件传输:
mv cp scp rsync
(2)命令执行:
剩下的其它命令
安装http服务:
安装
配置
启动服务(本机的服务启动) tasks
让服务对用户提供服务(路由器配置,iptables)
Ansible企业实际应用场景分析:
(1)Dev开发环境
使用者:程序员
功能:程序员开发软件测试BUG的环境
管理者:千万不能是运维,一定是要程序员自已
(2)测试环境
使用者:qa测试工程师
功能:测试经过Dev环境测试通过的软件的功能
管理者:运维
备注:测试环境往往有多套(测试环境满足测试功能即可,不宜过多)
(2.1)测试同学希望测试环境有多套
公司的产品多产品线并发,即多个版本,意味着多个版本同步测试
(2.2)通常情况下,测试环境有多少套和产品线数量保持一样
(3)发布环境(代码发布机,有些公司堡垒机(安全屏障))
使用者:运维
功能:发布代码至生产环境
管理者:运维(有经验的)
发布机:往往需要有2台(主备)
(4)生产环境
使用者:运维,只能是运维(极少数情况下会开放权限给核心开发人员,极少数公司将该 环境权限完全开放给开发人员并让开发人员维护)
功能:对用户提供公司产品的服务
管理者:只能是运维
生产环境服务器数量:一般比较多,且应用非常重要。往往需要自动工具协助部署配置应用。机器数量具体和公司业务规模相关。
(5)灰度环境(生产环境的一部分)
使用者:运维
功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境
案例:
大家手头100台服务器,先发布其中的10台服务器,这10台服务器就是灰度服务器。
管理者:只能是运维
灰度环境:往往该版本功能变更较大,为保险起见特意先让一部分用户优化体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器。
Ansible核心组件:
ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件;
INVENTORY:Ansible管理主机的清单;/etc/ansible/hosts
MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义; (ansible-doc -l获取Ansible的所有模块列表)
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。
API:供第三方程序调用的应用程序编程接口;
ANSIBLE:该部分图中表示的不明显,组合INVENTORY、API、MODULES、PLUGINS的绿框大家可以理解为是ansible命令工具,其为核心执行工具;
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界面可与用户交互的命令执行工具
ansible命令详解:Usage: ansible [options]
Options:
-a MODULE_ARGS, --args=MODULE_ARGS
module arguments # 指定Ansible调用的模块的参数
--ask-become-pass
ask for privilege escalation password # Ansible su切换用户的时候使用该参数输入密码
-k, --ask-pass
ask for SSH password # 以密码认证
--ask-su-pass
ask for su password (deprecated, use become) # su的时候使用该 参数
-K, --ask-sudo-pass
ask for sudo password (deprecated, use become) # sudo的时候
--ask-vault-pass
ask for vault password # ansible-valut 加密文件
-B SECONDS, --background=SECONDS
run asynchronously, failing after X seconds (default=N/A) # 后台等待X秒
-b, --become
run operations with become (nopasswd implied)
--become-method=BECOME_METHOD
privilege escalation method to use (default=sudo),
valid choices: [ sudo | su | pbrun | pfexec | runas ]
--become-user=BECOME_USER
run operations as this user (default=None) # su到哪个用户
-C, --check
# 不执行命令只做命令执行检查
-c CONNECTION, --connection=CONNECTION
connection type to use (default=smart)
-e EXTRA_VARS, --extra-vars=EXTRA_VARS # 调用外部变量
set additional variables as key=value or YAML/JSON
-f FORKS, --forks=FORKS # Ansible一次命令执行并发的线程数
-h, --help
show this help message and exit
-i INVENTORY, --inventory-file=INVENTORY
# Ansible调用的Hosts文件,默认/etc/ansible/hosts
-l SUBSET, --limit=SUBSET # 限定主机列表中的某台机器执行
further limit selected hosts to an additional pattern
--list-hosts
outputs a list of matching hosts; does not execute anything else ## 列出主机列表中的主机
-m MODULE_NAME, --module-name=MODULE_NAME
# Ansible 调用的执行模块
-M MODULE_PATH, --module-path=MODULE_PATH
specify path(s) to module library (default=None)
-o, --one-line condense output
-P POLL_INTERVAL, --poll=POLL_INTERVAL
set the poll interval if using -B (default=15)
--private-key=PRIVATE_KEY_FILE
use this file to authenticate the connection
-S, --su
run operations with su (deprecated, use become) #使用su和become结合使用
-R SU_USER, --su-user=SU_USER # su的话切换至哪个用户
run operations with su as this user (default=root)
-s, --sudo
run operations with sudo (nopasswd) (deprecated, use become) # 执行sudo命令
-U SUDO_USER, --sudo-user=SUDO_USER # sudo
desired sudo user (default=root) (deprecated, use become)
-T TIMEOUT, --timeout=TIMEOUT # 执行命令的超时时间
override the SSH timeout in seconds (default=10)
-t TREE, --tree=TREE log output to this directory
-u REMOTE_USER, --user=REMOTE_USER
connect as this user (default=root)
--vault-password-file=VAULT_PASSWORD_FILE
## ansible-vault加密的密码文件
-v, --verbose
verbose mode (-vvv for more, -vvvv to enable connection debugging) # 显示详细信息 -vvvv
--version
show program's version number and exit ## 显示版本号
安装与认证:
可以通过Github获取ansible源码安装,这里使用yum安装
]# Yum install –y ansible
Ansible是通过ssh进行认证后管理的,需要为管理主机添加认证,
在ansible管理主机上执行一下指令:
]# ssh-keygen #生成公钥与私钥
在/etc/ansible/hosts内添加需要管理的主机IP或FQDN,一般情况ansible管理的都是内网主机,建议使用IP,如下:
[web] #IP组的组名
172.16.252.140
172.16.253.190
172.16.253.145
]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]或
]# ssh-copy-id [email protected]
为每个被管理主机添加认证,
Ansible-->/etc/ansible/hosts内的webIP,/etc/ansible/ansible.cfg的配置-->加载模块文件,将对应的模块命令生成对应的py临时文件,并将该文件传输至远程服务器的对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件,执行并返回结果,删除py临时文件,退出。
ansible-galaxy
用法:
ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
去 https://galaxy.ansible.com/ 上传或下载优秀的Playbook(roles)
列出所有已安装的galaxy
ansible-galaxy list
安装galaxy
ansible-galaxy install geerlingguy.redis
删除galaxy
ansible-galaxy remove geerlingguy.redis
Ansible基础操作:
常用模块详解:模块可用参数,使用ansible-doc+模块名 查看,这里不赘述
Command:命令模块,也是默认使用的模块,不支持变量与“<、>、|、;、&、”等符号,如需使用可使用shell模块。
Shell:
Copy:
ansible web -m copy -a 'src=/root/mbr dest=/tmp' #拷贝/root/mbr到webIP组成员的/tmp目录下
ansible web -a 'ls -l /tmp/mbr' #显示各被管理的mbr文件长格式信息
ansible web -a 'rm /tmp/mbr -rf' #删除各被管理的mbr文件
Cron:
ansible web -a 'crontab -l' #查看cron计划任务
ansible web -m cron -a 'name=update minute=30 hour=5 job="ntpdate 172.16.0.1"' #添加计划任务update:每天5:30请求172.16.0.1更新时间
ansible web -m cron -a 'name=update state=absent' #删除name为update的计划任务
Fetch:拷贝被管理主机文件到管理主机
ansible web -m fetch -a 'src=/etc/fstab dest=/tmp' #拷贝被管理主机的/etc/fstab文件到管理主机的/tmp下,
**注意:文件在管理主机的绝对路径为:/tmp/被管理主机IP/etc/fstab,**
File:
ansible web -m file -a 'path=/tmp/tmpdir state=directory' #建立/tmp/tmpdir目录
ansible web -m file -a 'path=/tmp/a.sh state=file owner=root mode=700' #设置/tmp/a.sh文件,root属主,700权限
ansible web -m file -a 'src=/tmp/a.sh path=/tmp/a.sh.link state=link' #新建/tmp/a.sh软链接文件/tmp/a.sh.link
Hostname:
ansible web -m hostname -a 'name=webhost' # 设置主机名
Yum:
ansible web -m yum -a 'name=lrzsz state=latest' # 重新安装lrzsz包,
ansible web -m yum -a 'name=nginx state=present' #安装nginx包
Service:
ansible web -m service -a 'name=nginx state=started' #启动nginx服务
ansible web -m service -a 'name=nginx state=stoped' #停止nginx服务
ansible web -m service -a 'name=nginx state=reloaded' #重载nginx配置
User:
ansible web -m user -a 'name=test comment="test ansible" uid=1666'
#新建用户test,注释信息test ansible,uid为1666
Group:
ansible web -m group -a 'name=ansible gid=1888' #新建ansible组id为1888
Script:
ansible web -m script -a 'hello.sh' #在各被管理主机执行hello.sh脚本
ansible web -m script -a 'hello.sh creates=/tmp/testscript'
#如果/tmp/testscript存在,则不执行hello.sh脚本
ansible web -m script -a 'hello.sh removes=/tmp/testscript'
#如果/tmp/testscript存在,则执行hello.sh脚本
Ping:
ansible web -m ping #测试web组内主机连通性
**Ansible-playbook操作:**
YAML语法简介:
1、 首先以“---”(3个减号)开始,且需顶行首写。
2、 次行开始正常写Playbook的内容,但笔者一般建议写明该
Playbook的功能。
3、 使用#号注释代码。
4、 缩进必须是统一的,不能空格和tab混用。
5、 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的。
6、 YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写,K/V的值均需大小写敏感
7、 k/v的值可同行写也可换行写。同行使用:分隔,换行写需要以-分隔。
8、 一个name只能包括一个task。
Ansible-playbook用法
Usage: ansible-playbook playbook.yml
Playbook 核心组件
Hosts #执行的远程主机列表
Tasks #任务集
Varniables #内置变量或自定义变量在playbook中调用
Templates #模板,可替换模板文件中的变量及可实现一些简单逻辑的文件。
Handlers #和nogity结合使用,为条件触发操作,满足条件方才执行,否则不执行
执行状态:
绿色: 执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
示例:1
在/etc/ansible/目录下编写test1.yml,如下:
---
- hosts: web
remote_user: root
tasks:
- name: add group nginx
group: name=nginx state=present
- name: add user nginx
user: name=nginx state=present group=nginx
- name: install nginx
yum: name=nginx state=present
- name: start nginx
service: name=nginx state=started
在/etc/ansible/目录下编写test2.yml,如下:
---
- name: web
remote_user: root
tasks:
- name: remove nginx
yum: name=nginx state=absent
示例2:
在/etc/ansible/目录下编写test5.yml,如下:
---
- hosts: web
remote_user: root
tasks:
- name: add group nginx
group: name=nginx state=present
- name: add user nginx
user: name=nginx state=present group=nginx
- name: install nginx
yum: name=nginx state=present
notify:
- start nginx
- check nginx
handlers:
- name: start nginx
service: name=nginx state=started
- name: check nginx
shell: ss -tnl | grep 80
ansible-playbook test5.yml执行后片段如下:
变量使用:
使用ansible web(IP组名) –m setup 获取远程主机的所有变量
自定义变量
a. 在/etc/ansible/hosts 定义变量,在主机组中的主机单独定义,优先级高于组中公共变量
b. 在/etc/ansible/hosts 定义变量,针对主机组中的所有主机集中定义变量
c. 通过命令行指定变量,优先级最高
变量调用方式:
{{ variable_name }} 通过{{ }} 调用变量,且变量和{}两头之间必须有空格
注意:
在playbook中调用变量时,有时”{{ variable_name }}”需要要双引号引起来方可生效,有时候必须不能用”“引起来
templates功能:
根据模块文件动态生成对应的配置文件
(1) templates文件必须存放于目录名为templates下,且命名为 .j2 结尾
(2)yaml/yml playbook文件需和templates目录平级,目录结构如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
示例3:
编辑templates/nginx.conf.j2,如下(测试内容,如需使用在真实环境中需添加其他必要项)
{% for vhost in nginx_vhosts %}
server {
listen {{ vhost }}
}
{% endfor %}
编辑temnginx.yml,如下
---
- hosts: web
remote_user: root
vars:
nginx_vhosts:
- 88
tasks:
- name: add group nginx
group: name=nginx state=present
- name: add user nginx
user: name=nginx state=present group=nginx
- name: install nginx
yum: name=nginx state=present
- name: config file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify:
- start nginx
- check nginx
handlers:
- name: start nginx
service: name=nginx state=started
- name: check nginx
shell: ss -tnl | grep 88
示例4: when,根据系统版本操作
编辑test2.yml,如下:
---
- hosts: web
remote_user: root
tasks:
- name: test when
file: name=/tmp/whentest state=touch
when: ansible_distribution_major_version == "6"
系统主版本为6,则指定file下的操作
示例5:with_items列表
---
- hosts: web
remote_user: root
tasks:
- name: service start
service: name={{ item }} state=started
with_items:
- nginx
- mysqld
- php-fpm
将被管理主机的以上三个服务启动
嵌套变量:
---
- hosts: web
remote_user: root
tasks:
- name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'testu1' , groups: 'tgroup1'}
- { name: 'testu2' , groups: ' tgroup2'}
Roles操作
Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。
将各类文件放到相应目录下,使用时直接调用,或使用tags标识调用,可以理解为将一个多行多功能的yml文件分解成多个小文件,根据需求调用,方便,便捷,易用,同时良好地复用了代码。
ansible]# cat nginx-role.yml
---
- hosts: web
remote_user: root
roles:
- { role: nginx , tags: [ 'nginx' ] }
ansible]# cat roles/nginx/tasks/groupadd.yml
---
- name: groupadd
group: name=nginx gid=1555
ansible]# cat roles/nginx/tasks/useradd.yml
---
- name: useradd
user: name=nginx group=nginx uid=1444
ansible]# cat roles/nginx/tasks/install.yml
---
- name: install nginx
yum: name=nginx state=latest
ansible]# cat roles/nginx/tasks/main.yml
---
- include: groupadd.yml
- include: useradd.yml
- include: install.yml
- include: restart.yml
- include: filecp.yml
ansible]# cat roles/nginx/tasks/restart.yml
---
- name: restart nginx
service: name=nginx state=restarted
ansible]# cat roles/nginx/tasks/filecp.yml
---
- name: file cp
copy: src=mbr dest=/tmp
ansible-playbook nginx-role.yml --tags=nginx
http://ansible.com.cn/