自动化运维工具Ansible(ADhoc,playbook,roles)

常用自动化运维工具

Ansible:python,Agentless,中小型应用环境
Saltstack:python,一般需要agent,执行效率高
Puppet:ruby,功能强大配置复杂,重型,适合大环境
#代理,简单理解为客户端也需要安装实现相应服务的软件

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

在这里插入图片描述
Ansible:Ansible的核心程序,ansible的底层是python写的

Host Inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载

Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

Core Modules(核心模块):Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

Connection Plugins:连接插件,Ansible和Host通信使用

Ansible的优点:

  1. Stupied Simple ,上手简单,学习曲线平滑
  2. SSH by default ,安全,无需安装客户端
  3. 配置简单、功能强大、扩展性强
  4. 支持API及自定义模块,可通过Python轻松扩展
  5. 通过Playbooks来定制强大的配置、状态管理
  6. 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
  7. 幂等性:一种操作重复多次结果相同,可见下面playbook的触发器notify,有具体例子

Ansible的安装

#yum install epel-release
#yum install ansible

ansible的配置文件(配置ansible的工作特性)
/etc/ansible/ansible.cfg

#inventory      = /etc/ansible/hosts---主机列表配置文件
#library        = /usr/share/my_modules/---库文件存放目录
#remote_tmp     = ~/.ansible/tmp---临时py命令存放远程主机目录
#local_tmp      = ~/.ansible/tmp---本机临时命令执行目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks          = 5---默认并发数
#sudo_user      = root---默认sudo用户
#ask_sudo_pass = True---每次执行hoc命令时是否询问密码
#host_key_checking = False---检查对应服务器的host_key,建议取消注释
#log_path = /var/log/ansible.log---日志文件

#修改配置文件不需要重启
#建议重启日志

扫描二维码关注公众号,回复: 5741077 查看本文章

主机清单(也支持域名)
/etc/ansible/hosts

[pikachu]
192.168.146.202
192.168.146.203

Ansible配置客服端(免密登录:第一次连接需要密码)

[root@~]ssh-keygen
[root@~]#cd .ssh/
[root@  ]scp id_rsa.pub [email protected]:/root/.ssh/authorized_keys
#将公钥传给客户端,拷贝后的文件名固定
#id_rsa.pub公钥 
#id_rsa私钥

ansible3种管理模式:hoc命令行,playbooks,roles(功能性依次增强)

Ansible hoc命令行

ansible [host-pattern] [-m module_name] [-a args]

--version 显示版本
-f forks 启动并发线程数
-m 指定模块,默认command
--list-hosts 显示主机列表,可简写--list

ansible的Host-pattern

all 表示inventory中所有的主机
#ansible all -m ping--ping一下能不能通
逻辑或
逻辑与
逻辑非
支持通配符和正则

ansible命令执行过程

  1. 加载自己配置文件 默认/etc/ansible/ansible.cfg
  2. 加载对应的模块文件
  3. 将模块或命令生成临时的py文件,并传输至服务端的对应用户$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件
  4. 给文件执行权限,执行并返回结果
  5. 删除临时文件,sleep 0 退出

ansible系列命令

#ansible-doc -l 查看支持模块
#ansible-doc -s MODEL 查看模块用法

ansible-galaxy

连接 https://galaxy.ansible.com下载相应的roles
#ansible-galaxy list 列出已安装的galaxy
#ansible-galaxy install geerlingguy.redis   安装
#ansible-galaxy remove geerlingguy.redis删除

ansible-vault 管理加密解密yml文件

ansible-vault encrypt a.yml 加密
ansible-vault decrypt a.yml 解密
ansible-vault view a.yml 查看
ansible-vault edit a.yml 编辑
ansibel-vault rekey a.yml 修改口令
ansible-vault create new.yml 创建新文件

ansible常用模块

command模块 不支持特殊符号‘$ < > |’

shell 模块支持特殊符号

-chdir 执行命令前,切换所在目录
#ansible all -a 'chdir=/tmp ls'
-creates 逻辑关系,如果后面的文件存在,则不执行后面的操作,反之执行
#ansible all -a 'creates=/etc/fstab cat /etc/fstab'
-removes 不存在,不执行

script模块-运行脚本

ansible all -m script -a f.sh

copy模块 从服务器复制文件到客户端

#ansible all -m copy -a 'src=/root/a.sh dest=/root/a mode=000 owner=pikachu backup=yes'
#backup是否备份
#ansible all -m copy 'content=test dest=/root/a.sh'直接生成文件

压缩模块

archive压缩 unarchive解压

file模块 主要用于远程主机上的文件操作

force:需要在两种情况下强制创建软链接
1.源文件不存在但之后会建立的情况下
2.目标软连接已经存在,需要取消之前的软链接,然后创建洗的软连接,有两个选项:yes|no
group:定义文件/目标的属组
mode:定义文件/目录的权限
owenr:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果文件不存在,创建目录
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件

file:即使文件不存在,也不会被创建
link:创建软连接
hard:创建硬链接

#ansible all -m file -a ‘src=/etc/fstab dest=/root/fstab.link state=link’ (name path dest是等价的)

hostname模块 修改主机名

#ansible 192.168.146.201 -m hostname -a 'name=pika'

cron模块 计划任务

#ansible all -m cron -a 'minute=* weekday=1,3 job=''usr/bin/wall FBI waring" name=warningcron'
#ansible all -m cron -a 'disabled=true job...'禁用计划任务,必须有job和name disabled=false启用或者yes、no
state=absent 删除计划任务

yum模块

#absible all -m yum -a 'name=httpd,vsftpd state=installled'
#state=present、latest(安装)、absent(卸载),不写state默认安装

service模块

#ansible all -m service -a 'name=httpd state=started enabled=yes'

user模块

#ansible all -m user -a service -a 'name=nginx shell=sbin/nologin system=yes home=/var/nginx group=root.bin uid=80 comment="nginx server"  
#system=yes设置系统用户  
#ansible all -m user a 'name=nginx state=absent remove=yes' remove移除家目录

group模块

#ansible all -m group -a 'name=nginx system=yes gid=80'

playbook

yaml介绍
  yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。
  yaml又称为剧本,和shell脚本有有些类似,一次性执行你需要执行的命令。

语法介绍

  1. yaml文件的扩展名通常为.yml或.yaml
  2. 在yaml文件开头默认写‘—’,也可以不写;次行写文件的内容
  3. 使用‘#’注释
  4. 缩进要统一,缩进的级别也必须一致
  5. 区分大小写

playbook核心元素
1 hosts 执行远程主机列表
2.tasks 任务集
3.templates 模板文件,主要用在复制配置文件
4.tags 标签 指定某条任务执行,用于选择playbook中部分代码
5.handlers 和 notify 触发器,当任务执行时,notify会触发handlers中的相应任务
6.remote_user 执行playbook的用户
在这里插入图片描述注意缩进对齐,‘-’和‘:’后面有空格

playbook中变量的使用
1.playbook中的变量名只能由字母,数字,下划线组成,且只能以字母开头

2.变量来源:

  1. 在/etc/ansible/hosts中定义
    普通变量:对每台主机单独定义,优先级高于公共变量
    公共变量:针对主机组的统一变量
  2. 通过hoc命令定义变量,优先级最高
  3. 在playbook中定义
  4. 在roles中定义
    这t
    这里http_port就是普通变量,hostname就是公共变量

基础

#vim test.yml
#创建yml文件

在这里插入图片描述

设置变量

在这里插入图片描述
或者赋予特定的值

#ansible-playbook -e 'package=nfs-utils' test.yml
#这时会优先执行‘package=nfs-utils’的变量

如果想安装多个用‘,’隔开
或者使用迭代的方法
在这里插入图片描述

触发器notify

在这里插入图片描述
192.168.146.203已经安装http,所以不会触发notify,所以changed=0;
192.168.146.202没安装http,所以触发notify,所以changed=2;
这也是幂等性的结果
在这里插入图片描述

template模板

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在模板文件里设置变量 {{ http_port }}
在主机清单里分别设置变量 http_port=
复制过去的文件的变量会自动改变
还可以添加判断条件 when:

tags标签

在这里插入图片描述

#ansible-playbook -t file test.yml
#执行标签(tags)为file的任务
#多个任务可以用同一个标签



#ansible-playbook -C test.yml 提前检测一遍是否存在错误
#ansible-playbook test.yml --list-hosts 查看主机
#ansible-playbook test.yml --list-tasks 查看tasks name
#ansible-playbook teat.yml --list-tags 查看标签

roles

roles就是通过分别将变量、任务、模板等放于单独的目录中,并可以便捷的include它们的一种机制。简单来说,roles就是将任务模块化
建议把roles文件夹放置在/etc/ansible/roles

roles的目录结构如下在这里插入图片描述
将每一个独立的项目分别建一个文件夹,再在httpd下建files、handlers、tasks、templates、vars等目录,而且除了模板和复制文件,
其余文件名称为main.yml。或者每一项任务单独一个yml文件,最后用main.yml去调用其他yml文件。
在这里插入图片描述
注意yml文件书写格式还是不变,但是vars里的yml文件要顶格写
在这里插入图片描述

如果想执行yml文件,在roles平级目录,创建site.yml文件,roles: 写要调用的任务

在这里插入图片描述

#最后
#ansible-playbook site.yml

猜你喜欢

转载自blog.csdn.net/PpikachuP/article/details/88763634