自动运维化工具 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 [-m module_name] [-a args]

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