自动运维化工具 ansible
LINUX发展趋势:越来越强大的工具,通过子命令来实现,而不是通过选项。
ANSIBLE拥有上千个模块(子命令),ANSIBLE适用于200台机器以上
运维自动化发展历程及技术应用(以吃饭举例)
最开始:本地部署-----在家自己做(on-premises)
接下来:操作系统-----买成品回去加工 (laas)
然后是:软件-----------叫外卖(paas)
最后是:服务-----------去饭店吃(saas)
ANSIBLE学习功能简介:
Ansible命令使用
Ansible常用模块详解
YAML语法简介
Ansible playbook(剧本)基础,可以理解为ansible自身的脚本
Playbook变量、tags、handlers使用
Playbook模板templates
Playbook条件判断 when
Playbook字典 with_items
Ansible Roles(角色)可以理解为多个playbook的组合
运维工程师职能:
1 平台架构组建:
负责参与并审核架构设计的合理性和可运维性,搭建运维平台技术架构,通过开源解决方案,以确保在产品发布之后能高效稳定的运行,保障并不断提升服务的可用性,确保用户数据安全,提升用户体验。
2 日常运营保障
负责用运维技术或者运维平台确保产品可以高效的发布上线,负 责保障产品7*24H稳定运行,在 此期间对出现的各种问题可以快 速定位并解决;在日常工作中不断优化系统架构和部署的合理性, 以提升系统服务的稳定性。
3 性能,效率优化
用自动化的工具/平台提升软件在研发生命周期中的工程效率。不 断优化系统架构、提升部署效率、优化资源利用率支持产品的不断 迭代,需要不断的进行架构优化调整。以确保整个产品能够在功 能不断丰富和复杂的条件下,同 时保持高可用性。
Linux运维工程师职能划分,以发布软件为例,如下图:
企业实际应用场景分析
Dev开发环境--对应上图中的1.
使用者:程序员
功能:程序员开发软件,测试BUG的环境
管理者:程序员
测试环境--对应上图中的2
使用者:QA测试工程师
功能:测试经过Dev环境测试通过的软件的功能
管理者:运维
说明:测试环境往往有多套,测试环境满足测试功能即可,不宜过多
1、测试人员希望测试环境有多套,公司的产品多产品线并发,即多个版本,意味着多个版本同步测试
2、通常测试环境有多少套和产品线数量保持一样
发布环境:代码发布机,有些公司为堡垒机(安全屏障)--对应上图中的3
使用者:运维
功能:发布代码至生产环境,一般是堡垒机(不是所有机器都可以连到生产环境)
管理者:运维(有经验)
发布机:往往需要有2台(主备)
生产环境—对应上图中的4
使用者:运维,少数情况开放权限给核心开发人员,极少数公司将权限完全开放给开发人员并其维护
功能:对用户提供公司产品的服务
管理者:只能是运维
生产环境服务器数量:一般比较多,且应用非常重要。往往需要自动工具协助部署配置应用。
灰度环境(生产环境的一部分)--对应上图中的5
使用者:运维
功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境,可基于主机或用户执行灰度发布(假设共100台生产服务器,先发布其中的10台服务器,等这10台机器使用没有重大问题的时候,再全部发布。这种发布方式就叫灰度发布)
管理者:运维
灰度环境:往往该版本功能变更较大,为保险起见特意先让一部分用户优化体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器
程序发布要求:
1 不能导致系统故障或造成系统完全不可用
2 不能影响用户体验
预发布验证:
新版本的代码先发布到服务器(跟线上环境配置完全相同,只是未接入到调度器)
灰度发布:
发布路径:
/webapp/tuangou--------正在使用的版本(这是个软链接,平时指向位置是老版本,如有新版本程序上线到服务器上,将软链接指向为新版本即可。)
/webapp/tuangou-1.1----老版本
/webapp/tuangou-1.2-----新版本
发布过程:在调度器上下线一批主机(标记为maintanance状态) --> 关闭服务 --> 部署新版本的应用程序 --> 启动服务 --> 在调度器上启用这一批服务器
自动化灰度发布:脚本、发布平台
调度器工作原理
自动化动维应用场景
文件传输--------比如把配置好的sulinux文件传送到每个服务器上
命令执行--------比如安装程序包,会包含:
应用部署
配置管理--------修改某个应用的配置文件,或者安装路径
任务流编排------命令执行的先后顺序
这些任务都需要使用自动化运维工具来实现
常用自动化运维工具
Ansible:使用python来开发的,无需设置Agentless(代理),一般管理几百台。与ssh的方式也不一样,ssh是基于c/s模式(客户端+服务器)来使用服务端提供的服务,属于多台客户端访问一台服务器。而ansible是控制端,使用装了ansible的主机管理多台主机。也叫做主控端。Ansible是通过ssh端口来实现无代理配置。
Saltstack:使用python语言开发,一般需部署agent(代理),执行效率更高,一般管理几千台。
Puppet:使用ruby语言开发,功能强大,配置复杂,适合大型环境(了解即可)
下面这些使用者较少,不做介绍
Fabric:使用python语言开发,agentless(不需要设置代理)
Chef: 使用ruby语言开发
Cfengine
Func
Ansible特性
模块化:调用特定的模块,完成特定任务
有Paramiko(基于ssh的开发语言),PyYAML(YAML语言),Jinja2(模板语言)这三个关键模块,并支持自定义模块
基于Python语言实现
部署简单,基于python和SSH(默认已安装),agentless(不需要设置代理)
安全,基于OpenSSH
支持playbook编排任务
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
ansible架构图:
用户通过ANSIBLE来下达指令,通常是逐条命令执行。可以通过公有/私有云来实现远程管理.
主机库存中包含着所有主机的列表,通过主机分组及连接插件来实现管理不同的主机,给一些主机升级,一些主机创建用户等目的。
剧本是用在批量,定期做例行性工作的时候,比如定期做备份等等。在复杂一些的情况会使用角色(Roles),相当于多个剧本的组合。
Ansible主要组成部分
ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主机的清单,位于/etc/anaible/hosts文本文件中,内容为要管理的主机的名称或IP地址.
MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插
件等,该功能不常用
API:供第三方程序调用的应用程序编程接口
ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具
Ansible命令执行来源:
1 USER,普通用户,SYSTEM ADMINISTRATOR(系统管理员)
2 CMDB(配置管理数据库) API 调用(需要开发接口)
3 PUBLIC/PRIVATE CLOUD API调用(需要开发接口)
4 USER-> Ansible Playbook -> Ansibile(运维工程师通常用这种方式)
利用ansible实现管理的方式:
1 Ad-Hoc 即单条ansible命令,主要用于临时命令使用场景
2 Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划
Ansible-playbook(剧本)执行过程:
将已有编排好的任务集写入Ansible-Playbook,通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
Ansible主要操作对象:
HOSTS主机
NETWORKING网络设备
注意事项
执行ansible的主机一般称为主控端,中控,master或堡垒机
主控端Python版本需要2.6或以上
被控端Python版本小于2.4需要安装python-simplejson
被控端如开启SELinux需要安装libselinux-python
windows不能做为主控端
ansible安装:配置好仓库的epel源,直接yum install ansible即可。
确认版本号: ansible –version
ansible的配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,大部分配置不用修改,默认值即可.
/etc/ansible/hosts 主机清单,要控制的主机必须存放在这个文件中。
/etc/ansible/roles/ 存放角色的目录,角色可理解为多个剧本的集合
ansible的程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具(很多模块的帮助信息都在这里,相当于man)
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具(pull,拉取的意思。有时候把别人的文件拉取到我这来,有时候把我的东西推送到别人那)
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
如何使用ansible
第一步,先配置好主机清单。
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以
在inventory file(清单文件)中将其分组命名
默认的inventory file(清单文件)为/etc/ansible/hosts。主机清单可以有多个,且也可以通过Dynamic Inventory(动态库存)来动态生成。
配置主机清单的格式
Ansible: /etc/ansible/hosts文件格式
Inventory(清单)文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口, 还可以在主机名称之后使用冒号加端口号来标明吗,比如:
ntp.magedu.com---------------主机名
[webservers]---------------组名
www1.magedu.com:2222--------主机名,但端口号为2222。属于webservers组
www2.magedu.com--------------主机名,属于webservers组
[dbservers]----------------组名
db1.magedu.com-------------主机名,属于dbservers组.
db2.magedu.com-------------主机名,属于dbservers组.
db3.magedu.com-------------主机名,属于dbservers组.
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,比如:
[websrvs]-------------------组名
www[01:100].example.com-----主机名,拆分开后为从www01.example.com开始,到www100.example.com结束的主机名集合。
[dbsrvs]--------------------组名
db-[a:f].example.com--------主机名,拆分开后为从db-a.example.com开始,到db-f.example.com结束的主机名集合。
最简单的:只写IP名,完事
ansible 的配置文件
/etc/ansible/ansible.cfg (一般保持默认)
[defaults] 默认值
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py命令文件存放在远程主机目录#local_tmp = -------------~/.ansible/tmp # 本机的临时命令执行目录
#forks = 5-----------------# 默认并发数
# poll_interval = 15------# 拉取时候的时间间隔(默认为秒)
#sudo_user = root---------# 默认sudo 用户
#ask_sudo_pass = True-----# 每次执行ansible命令是否询问ssh密码#ask_pass = True
#remote_port = 22
#host_key_checking = False # 检查对应服务器的host_key,建议取消注释
这样在大批量第一次连接时,就不用一个一个去敲yes了.
#log_path=/var/log/ansible.log #日志文件,建议取消注释使其生效.
Ansible系列命令(红色部分为重点掌握)
1 ansible---------------程序主题,逐条执行命令
2 ansible-doc-----------相当于man ansible
3 ansible-playbook------剧本,类似于shell的脚本
4 ansible-vault---------加密的
5 ansible-console-------控制台
6 ansible-galaxy--------配置角色的
7 ansible-pull----------将自己或别人的文件拉取或推广到别人或自己那
ansible-doc: 显示模块帮助,格式为:
ansible-doc [options] [module...]
-a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet 显示指定模块的playbook片段(即简要说明)
示例:
ansible-doc –l 列出所有可用模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc –s ping 查看指定模块的剧本片段示例
ansible使用示例
# ansible 192.168.10.7 –m ping 使用ansible去ping一个ip地址
# ansible使用ssh进行连接,默认为验证key的方式,如果目标地址做了key验证,则能ping通,否则报错。
如果想使用用户名密码的形式来ping,需要加上-k选项,如只写-k则使用当前用户去连接目标IP.
Ansible格式
ansible
host-pettern是指在主机管理列表中的主机,可以是分组的组名,也可是要管理的主机的IP地址,或者是ALL(对所有主机进行管理.)
-version 显示版本
-m module 指定模块,默认为command,有些模块后面还有参数,比如yum模块,这时候会用到-a args(参数)来确定是执行yum的安装or卸载。
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表,可简写为—list
-k, --ask-pass 提示输入ssh连接密码(即用户名密码),默认是Key验证(需要更改配置文件,将其中的#host_key_checking = False注释去掉)
-K, --ask-become-pass 提示输入sudo时的口令(key没注释掉的情况下,如果key加密了,则还会要求输入key的密码(见图片1)。如果注释掉了key,则需要与-k来一起使用,否则会报错,拒绝权限见图片2和图片3)
以zhang sudo至root用户执行ls
# ansible 192.168.10.227 –m command –a ‘ls /root ’ –u zhang –k –b -K
输入两次密码很烦人,还能改为key验证的方式.
# ssh-keygen 在/root/ssh下生成秘钥对
# ssh-copy-id 192.168.10.227 将公钥拷贝至目标IP
# ansible 192.168.10.227 -m command -a 'ls /root'
# 完成
如果主机数目很多的话,那么将IP改为ALL,就相当于把ansible主机列表中的所有主机执行这条命令.
# # ansible all -m command -a 'ls /root'
-C, --check 检查,并不执行,通常用来查看配置的环境是否正确.
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo 切换
ansible命令执行过程
1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME(家目录)/.ansible/tmp/ansible-tmp-数字(数字为随机生成)/XXX.PY文件
4. 给文件+x执行
5. 在对方主机上执行并返回结果
6. 删除临时py文件,sleep 0退出并返回到主控端.
执行状态:
绿色:执行成功并且不需要做改变的操作
×××:执行成功并且对目标主机做变更
红色:执行失败
ansible的Host-pattern 匹配主机的列表
All :表示所有Inventory中的所有主机
# ansible all –m ping
*:通配符
# ansible “*” -m ping
# ansible 192.168.1.* -m ping
# ansible “*srvs” -m ping
或关系
# ansible “websrvs:appsrvs” -m ping
# ansible “192.168.1.10:192.168.1.20” -m ping
# 去ping在websrvs组的主机或者在appsrvs组的主机。也就是这两个组的所有主机都会参与ping。
逻辑与
# ansible “websrvs:&dbsrvs” –m ping
# 去ping在websrvs组,并且在dbsrvs组中的主机。只有同时在这两个组的主机才会执行ping命令。
逻辑非
# ansible ‘websrvs:!dbsrvs’ –m ping
# 在websrvs组,但不在dbsrvs组中的主机注意:此处为单引号
综合逻辑
# ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
# ping在websrvs组或者在dbsrvs组,与 在appsrvs组并且不在ftpsrvs组的主机.即ping websrvs组的所有主机,同时在dbsrvs与appsrvs组的主机。
正则表达式
# ansible “websrvs:&dbsrvs” –m ping
# ansible “~(web|db).*\.magedu\.com” –m ping
# 去ping 在web组或着在db组,所有以.magedu.com结尾的主机。注意:正则表达式开始用~波浪线开始
ansible常用模块
Command:在远程主机执行命令,默认模块,可忽略-m选项。
允许在执行命令时候,实现指定好目录.
# ‘ls /root’ = ‘chdir=/root ls’ 这俩命令是等价的
判断条件,如果文件存在,则不执行命令。
# ansible all –m command –a ‘creates=/etc/fstab ls /root’
# 如果存在/etc/fstab文件,则不执行 ls /root 命令.
# ansible srvs -m command -a ‘service vsftpd start’与
# ansible srvs -a ‘service vsftpd start’等价
# 开启srvs组主机的vsftpd服务。
# ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功,因为此模块不支持$VARNAME < > | ; & 等,只能用shell模块来实现。
Shell:和command相似,用shell执行命令,一般在重定向,变量之类的时候用,也可以理解为增强型的command. 可以在/etc/ansible/ansible.cfg中修改默认shell.
# ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
# 将srv组中的主机的wang用户面变更为magedu.
PS:调用bash执行命令 类似cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>/tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器.但是这样也麻烦,可以使用script模块来解决这个问题.
Script:运行脚本(很实用)
# snsible -m –script -a "/PATH/TO/SCRIPT_FILE“
# 运行指定路径下的脚本文件,比如:
# snsible websrvs -m script -a f1.sh
# 在控制端编写脚本,然后将其放在被控端主机的指定路径中来运行,并将运行的结果返回到控制端。
Copy:从服务器复制文件到客户端。主要参数选项:backup 复制过去的文件,如果存在的话默认是覆盖,使用backup后不会覆盖源文件,而是作为备份存在。
content 复制过去的目录或文件,用content来代替src选项的话,可以用指定内容来替代本来用src指定的文件的内容。通常是中控机上要已存这个目标文件。但是这些文件放在中控机上也不便管理,并且目标文件如果丢失的话,在运行这个与ansible的playbook相关任务时就会报错。通过copy模块的content选项是可以将这个文件的内容就写在playbook中。
dest (必须填写的参数)复制过去的文件放在何处,需要指定一个绝对路径。
如果复制过去文件类型是一个文件夹,那么指定路径也必须是一个文件夹。
如果指定路径的目录不存在,且复制过去的文件路径以/结尾的,那么该目录会被创建。PS:如果复制过去的文件,和指定的路径都是文件,但是指定路径的父目录不存在的话,则会失败(比如要复制文件到/app/date中去,如果/app不存在的话,就报错失败)复制目录时,以/结尾的,是复制这个目录里面的内容但不包括本身,不以/结尾的,是复制这个目录本身及其里面的内容
mode 修改权限,复制的时候可以修改下文件权限
group 重新指定所属组
owner 更改所属人
# ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh
owner=wang mode=600 backup=yes”
# 将控制端中的 /root/f1.sh复制到srv组中所有主机的/tmp/目录下,名字改为f2.sh (只写/tmp/意味着不改名)所属人改为wang用户,权限改为600,如果f2.sh事先存在,默认覆盖,此处指定先备份指定了(backup)
# ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt”# 使用content产生内容,直接生成目标文件,保存路径及名字为/tmp/f1.txt
内容为 test content+换行符号.
Fetch:从客户端取文件至服务器端,与copy相反,目录可先tar
# ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
# 将srv组中的/root/a.sh文件,拉取到控制端的/date/scripts目录里.这里的src指的是被控端的源文件,与copy相反.每一个主机都会单独建一个以IP为名字的目录.
File:设置文件属性
src:创建软硬链接
path:必须要的选项,指明路径.
state: 具体执行结果取决于等号后面的值.,具体如下:
directory:如果文件不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软连接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件.路径不存在的话无操作.
# ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
# 将svw组中的主机,家目录下的a.sh文件的所属人改为wang,权限改为755.
# ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
# 将web组中的主机,创建一个软链接.将控制端的/app/testfile做成链接,指向为被控端的/app/testfile-link,链接方式为link.???
Hostname:管理主机名
# ansible node1 -m hostname -a “name=websrv”
# 将nodel组的主机,名字改为websrv,永久更改.
Cron:计划任务
name可以给计划任务起名字,通过这个名字来删除指定的计划任务.
disabled 暂时停止指定的计划任务。
state 值为absent(缺席)时候为删除,值为present(出席)为创建
time minute,hour,day,month,weekday分,时,天,月,周的格式.
job 后面跟命令,只能跟命令的绝对路径.比如想执行ls命令.写为:
job= /usr/bin/ls
# ansible all -a ‘crontab -l’(需要将默认模块改为shell)
# 查看所有主机上有无计划任务
# ansible all -m cron -a "minute=*/5 weekday=1-5 job='/usr/sbin/nptdate 192.168.10.228&> /dev/null' name=synetime"
# 创建一个名字为synetime的计划任务,每周一到周五,每隔5分钟,与192.168.10.228的时间同步一次。
计划任务可以暂时停止掉,取消暂停删除 disabled=yes即可。
# ansible all -m cron -a "minute=*/5 weekday=1-5 job='/usr/sbin/nptdate 192.168.10.228&> /dev/null' name=synetime disabled=yes"
删除计划任务
# ansible all -m cron -a 'name=synetime state=absent'
# 删除名字为synetmie的计划任务
Yum:管理包
name 数据包名,可以接版本号。比如 name=ansible1.0等等。
state值为 present是安装,值为absent为删除。
# ansible srv -m yum -a ‘name=httpd state=present’
# 将srv组的主机,安装名字为 httpd的程序包。PS:已经安装的机器不会再次安装
# ansible srv -m yum -.a ‘name=httpd state=absent’
# 将srv组的主机,安装名字为 httpd的程序包。
Service:管理服务
# ansible srv -m service -a 'name=httpd state=stopped'
# 将srv组的主机,停止名字为httpd的服务,如下图
# ansible srv -m service -a 'name=httpd state=started'
# 将srv组的主机,启动名字为httpd的服务
# ansible srv –m service –a ‘name=httpd state=reloaded’
# 将srv组的主机,重新加载名字为httpd的服务(热加载)。
# ansible srv -m service -a 'name=httpd state=restarted'
# 将srv组的主机,重新启动名字为httpd的服务。
User:管理用户
name 必选项,指定用户名
passwd 加密
remove 配合 state=absent使用,删除指定用户的家目录及邮箱等等,类似于(userdel -r)命令。
group 指定主组
groups 指定附加组,可以指定多个。
# ansible srv -m user -a ‘name=user1 comment=“test user” uid=2048 home=/app/user1 group=root’
# 将srv组所在的主机,创建一个用户,名字为user1,注释信息为test user,其UID号为2048.家目录为/app/user1 主组为root组.
# ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
# 将srv组所在的主机,创建一个系统用户,名字为sysuser1,家目录为/app/sysuser1
# ansible srv -m user -a ‘name=user1 state=absent remove=yes’
# 加上remove=yes删除用户时,其家目录等数据也会被删除.
Group:管理组
# ansible srv -m group -a "name=testgroup system=yes”
# 创建系统用户组 testgroup
# ansible srv -m group -a "name=testgroup state=absent"
# 删除名为testgroup用户组.
总结:服务,用户,组属于基本操作.
配置服务基本一个流程:
1 安装服务的数据包
2 更改配置文件.机器数量多的时候,可以用主控端下载一个完全一致的数据包,将其中的配置文件修改完毕后,使用copy模块将其推送到被控制端.
3 准备服务所需的数据,比如数据库之类的. 准备数据也可以在主控端配置,然后使用copy模块一并推送过去.
4 准备完毕后,启动服务即可.
ansible系列命令之ansible-galaxy
ansible-galaxy是一个网站共享和下载 Ansible 角色,是帮助 roles (角色)更好的工作的命令行工具。多个ansible命令=playbook(剧本),多个剧本=角色(roles)使用方式: 连接 https://galaxy.ansible.com 下载相应的roles,这里的roles大多是别人分享的ansible工具,包括了系统,安全,网络,云,数据包等等这些分类.
安装galaxy
# ansible-galaxy install ajsalminen.hosts
列出所有已安装的galaxy
# ansible-galaxy list
删除galaxy
# ansible-galaxy remove ajsalminen.hosts(将文件删除也算卸载)
ansible系列命令之ansible-pull
pull是推送命令至远程再执行,效率无限提升,对运维要求较高
Ansible-playbook 相当于shell当中的脚本 ,参考下面的剧本文件:
ansible-playbook hello.yml 使用yml结尾的是剧本文件,正文最上面加上三个- 来表示这个是一个剧本文件,类似于shell脚本中的 #! /bin/bash
# cat hello.yml -----打开剧本文件
--- ======================约定俗成的做法,不加也不会出错.
#hello world yml file---------注释信息
- hosts: websrvs--------------要连接的主机的组名
Remote_user: root ------------以那个用户的身份登录(固定写法)
tasks:------------------------任务,表明下面的内容是描述任务的
- name: hello world------------任务的名称,注释信息
command: /usr/bin/wall hello world ---真正要做的事情,command相当于模块名, /usr/bin/wall hello world相当于模块后面,-a 之后的指令.
最终执行后的结果,使用广播wall发一条消息 hell world…
ansible系列命令之Ansible-vault
功能:管理加密解密yml文件,格式及选项:
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
# ansible-vault encrypt hello.yml 加密
# ansible-vault decrypt hello.yml 解密
# ansible-vault view hello.yml 查看(需要输入之前设定的密码才可以)
# ansible-vault edit hello.yml 编辑加密文件
# ansible-vault rekey hello.yml 修改口令
# ansible-vault create new.yml 创建新文件(创建的时候就设置了密码)
ansible系列命令之 Ansible-console:2.0+新增,可交互执行命令,支持tab
# root@test (2)[f:10] $
# 执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
设置并发数: forks n 例如: forks 10 (默认值为5)
切换组: cd 主机组 例如: cd web 切换为web组。
列出当前组主机列表: list
列出所有的内置命令: ?或help
示例:
# root@all (2)[f:5]$ list
# 列出所有被控端的IP地址。
# root@all (2)[f:5]$ cd appsrvs
# 切换至appsrvs组。
# root@appsrvs (2)[f:5]$ list
# 列出appsrvs组的所有主机IP地址。
# root@appsrvs (2)[f:5]$ yum name=httpd state=present
# 在appsrvs组的主机上安装httpd服务。
# root@appsrvs (2)[f:5]$ service name=httpd state=started
# 在appsrvs组的主机上,将httpd服务启动。
ansible之playbook
playbook是由一个或多个“play”组成的列表
play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task 定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。
Playbook采用YAML语言编写,格式简介
1 在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号( ... )用来表示档案结尾
2 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
3 使用#号注释代码
4 缩进必须是统一的,不能空格和tab混用
5 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
6 YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
7 k/v的值可同行写也可换行写。同行使用:分隔
8 v可是个字符串,也可是另一个列表
9 一个完整的代码块功能需最少元素需包括 name: task
10 一个name只能包括一个task
11 YAML文件扩展名通常为yml或yaml