千家信息网

自动化运维工具ansible详解

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,ll 本文导航 · ansible的基础介绍· ansible的安装与配置· ansible的简单应用· YAML介绍及语法· ansible-playbooks(剧本)ll 要求掌握ansible基
千家信息网最后更新 2024年09月22日自动化运维工具ansible详解


ll 本文导航

· ansible的基础介绍

· ansible的安装与配置

· ansible的简单应用

· YAML介绍及语法

· ansible-playbooks(剧本)



ll 要求

掌握ansible基本应用与playbooks。



ansible的基础介绍

1、ansible介绍

ansible是一款基于python开发的自动化运维工具,它结合了puppet、cfengine、func、chef、fabric等工具的优点,实现了批量系统配置、批量部署应用程序及批量执行命令。ansible本身没有批量部署、执行的能力,真正提供批量部署能力的是ansible所调用的特定模块,ansible本身也可以看成是一个组件,或者说它是一个框架。


2、ansible的逻辑架构

Ansible:ansible自身组件。

Host Invertory:主机库,定义被操作主机的列表。是一个配置文件,默认位置:/etc/ansible/hosts

Core Modules:ansible的核心模块、命令模块。

Custom Modules:自定义模块。

Connection Plugins:连接插接,默认基于ssh密钥连接。

Playbooks:剧本,按照顺序执行编排的任务。


3、ansible的特性

1)学习曲线不陡峭。

2)no agents:无需在被管控主机上安装客户端程序。

3)no server:无服务器端,直接使用ansible相关命令即可。

4)modules any languages:基于模块工作,可使用任意语言开发模块。

5)YAML not code:可基于YAML语言自定义剧本(playbooks)按设置顺序执行任务。

6)ssh by default:默认基于ssh连接。

7)strong multi-tier solution:可实现多层级指挥。


4、ansible的优点

1)轻量级,无需在客户端安装程序,更新时,只需要在安装有ansible的操作主机上更新即可。

2)批量主机执行任务可写成脚本,且不需要分发到远程主机上执行,直接在操作主机上执行即可。

3)python语言开发,易于维护,ruby语法过于复杂。

3)支持sudo。


5、ansible任务执行流程


ansible的安装与配置


1、编译安装


解决依赖关系并编译安装ansible-1.5.4

# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto# tar xf ansible-1.5.4.tar.gz# cd ansible-1.5.4# python setup.py build# python setup.py install# mkdir /etc/ansible# cp -r examples/* /etc/ansible


2、rpm包安装

yum源安装,要配置epel。

# yum -y install ansible



3、配置文件

ansible的主配置文件:/etc/ansible/ansible.cfg


ansible的主机配置清单文件:/etc/ansible/hosts


组定义:直接在[ ]的下面添加主机名或IP地址

单独定义主机直接将主机名或IP地址在[ ]上方



4、配置ssh免密钥认证

#生成公钥文件# ssh-keygen -t rsa -P ''#将公钥文件copy至各被控主机上# scp ~/.ssh/id_rsa.pub root@node1# scp ~/.ssh/id_rsa.pub root@node2

注意:配置完后,第一次运行需要输入密码,后续就不要了。


ansible的简单应用


1、ansible的命令参数:

ansible的语法格式:

# ansible  [-m module_name] [-a args] [options]-v,-verbose    #详细模式,如果命令执行成功,输出详细的结果 (-vv -vvv -vvvv) -i PATH,-inventory=PATH                          #指定 host 文件的路径,默认是在 /etc/ansible/hosts -f NUM,-forks=NUM                                #NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。 -m NAME,-module-name=NAME                        #指定使用的 module 名称,默认是 command -m DIRECTORY,-module-path=DIRECTORY              #指定 module 的目录来加载 module ,默认是/usr/share/ansible, -a,MODULE_ARGS                                    #指定 module 模块的参数 -k,-ask-pass                                      #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证 -sudo                                            #指定使用 sudo 获得 root 权限 -K,-ask-sudo-pass                                #提示输入 sudo 密码,与 -sudo 一起使用 -u USERNAME,-user=USERNAME                       #指定移动端的执行用户 -C,-check                                        #测试此命令执行会改变什么内容,不会真正的去执行

2、ansible简单应用示例

all:表示hosts列表中所有主机都执行,包括组

-m command:指定使用modules的名称为command,实际上默认就是command模块,所以这里不加command也可以。

-a 'uptime':指定模块的参数为uptime。

以上即指:在hosts中的所有主机清单中运行uptime命令。

注意:每个节点上任务执行完后都会在控制主机上返回信息;任务成功执行显示为绿色或者×××,任务执行失败显示为浅×××。


ansible-doc命令的使用:

#列出所有模块清单# ansible-doc -l#列出指定模块的参数# ansible-doc -s 'modules'


3、常用模块使用实例

1) setup

#查看远程主机上的基本信息# ansible all -m setup


2) ping

#测试远程主机是否在线,如果在线,则会返回"pong"字符串,乒乓球呢# ansible all -m ping


3) file

## 设置文件的属性

相关选项如下:

force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

group:定义文件/目录的属组

mode:定义文件/目录的权限

owner:定义文件/目录的属主

path:必选项,定义文件/目录的路径

recurse:递归设置文件的属性,只对目录有效

src:被链接的源文件路径,只应用于state=link的情况

dest:被链接到的路径,只应用于state=link的情况

state

directory:如果目录不存在,就创建目录

file:即使文件不存在,也不会被创建

link:创建软链接

hard:创建硬链接

touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

absent:删除目录、文件或者取消链接文件

#给远程主机上的指定文件创建符号链接# ansible corosync -m file -a 'src=/etc/hosts dest=/tmp/hosts state=link'

#查看corosync组的符号链接信息# ansible corosync -m command -a 'ls -l /tmp/hosts'

#接下来删除corosync组上所有主机上的/tmp/hosts符号链接# ansible corosync -m file -a 'path=/tmp/hosts state=absent'

#再次查看# ansible corosync -m command -a 'ls -al /tmp/hosts'


4) copy

#复制文件到远程主机

相关选项如下:

backup:复制一个文件时,先将源文件备份,其中备份文件包含源文件的时间,包含两个值:yes|no

content:当使用'src'时,将文件的内容直接设置为指定的值;适用于简单的值;

dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

directory_mode:递归设定目录的权限,默认为系统默认权限

force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

others:所有的file模块里的选项都可以在这里使用

src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。



5) shell

#切换到某个shell执行指定的指令,参数与command相同。

与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw


示例:

# 先在本地创建一个SHELL脚本

# vim /tmp/rocketzhang_test.sh
#!/bin/shdate +%F_%H:%M:%S
#chmod +x /tmp/rocketzhang_test.sh



# 将创建的脚本文件分发到远程主机

# ansible corosync -m copy -a 'src=/tmp/rocketzhang_test.sh dest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755'

# 在远程主机上执行该脚本

# ansible corosync -m shell -a '/tmp/rocketzhang_test.sh'



6) 更多模块

其他常用模块,比如:servicecronyumsynchronize就不一一例举,可以结合自身的系统环境进行测试。

service:系统服务管理

cron:计划任务管理

yumyum软件包安装管理

synchronize:使用rsync同步文件

user:系统用户管理

group:系统用户组管理


YAML介绍及语法

1、YAML介绍

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy dt Net与Oren Ben-Kiki也是这语言的共同设计者。

YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。

更多的内容及规范参见http://www.yaml.org。


2、YAML特性

YAML的可读性好

YAML和脚本语言的交互性好

YAML使用实现语言的数据类型

YAML有一个一致的信息模型

YAML易于实现

YAML可以基于流来处理

YAML表达能力强,扩展性好


3、YAML语法

playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。下面是一个简单示例。

- hosts: webnodes

vars:

http_port: 80

max_clients: 256

remote_user: root

tasks:

- name: ensure apache is at the latest version

yum: name=httpd state=latest

- name: ensure apache is running

service: name=httpd state=started

handlers:

- name: restart apache

service: name=httpd state=restarted


YAML文件扩展名通常为.yaml,如example.yaml。

注意,代码的排版有严格要求,缩进为2个字符!序列项的 - 后必须跟一个空格!:后也要跟一个空格!


ansible-playbooks(剧本)

playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。下面是一个简单示例。


- hosts: webnodes

vars:

http_port: 80

max_clients: 256

remote_user: root

tasks:

- name: ensure apache is at the latest version

yum: name=httpd state=latest

- name: ensure apache is running

service: name=httpd state=started

handlers:

- name: restart apache

service: name=httpd state=restarted


1、playbook基础组件


1) Hosts和Users

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组;remote_user则用于指定远程主机上的执行任务的用户。如上面示例中的

-hosts: webnodes

remote_user: root


不过,remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。


- hosts: webnodes

remote_user: mageedu

tasks:

- name: test connection

ping:

remote_user: mageedu

sudo: yes


2) 任务列表和action

play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。

定义task的可以使用"action: module options"或"module: options"的格式,推荐使用后者以实现向后兼容。如果action一行的内容过多,也中使用在行首使用几个空白字符进行换行。

tasks:

- name: make sure apache is running

service: name=httpd state=running

在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用"key=value"格式,例如:

tasks:

- name: disable selinux

command: /sbin/setenforce 0

如果命令或脚本的退出码不为零,可以使用如下方式替代:

tasks:

- name: run this command and ignore the result

shell: /usr/bin/somecommand || /bin/true


或者使用ignore_errors来忽略错误信息:

tasks:

- name: run this command and ignore the result

shell: /usr/bin/somecommand

ignore_errors: True


3) handlers

用于当关注的资源发生变化时采取一定的操作。

"notify"这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

- name: template configuration file

template: src=template.j2 dest=/etc/foo.conf

notify:

- restart memcached

- restart apache


handler是task列表,这些task与前述的task并没有本质上的不同。

handlers:

- name: restart memcached

service: name=memcached state=restarted

- name: restart apache

service: name=apache state=restarted


案例:

heartbeat.yaml

- hosts: hbhosts

remote_user: root

tasks:

- name: ensure heartbeat latest version

yum: name=heartbeat state=present

- name: authkeys configure file

copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys

- name: authkeys mode 600

file: path=/etc/ha.d/authkeys mode=600

notify:

- restart heartbeat

- name: ha.cf configure file

copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf

notify:

- restart heartbeat

handlers:

- name: restart heartbeat

service: name=heartbeat state=restarted






主机 文件 模块 任务 目录 语言 命令 链接 配置 路径 内容 参数 应用 源文件 用户 系统 脚本 信息 多个 情况 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全的童谣怎么写 软件开发提高开发效率 计算机网络技术第一章是讲 天津超频服务器销售价格 网络安全的发展方案 数据库行之间关系是什么约束 放心的仓库erp软件开发设计 语音服务器连接失败金铲铲 汇旺服务器异常无法登陆 云计算的网络安全论文题目 汕头市华辰网络技术有限公司 计算机网络技术的交互实时性 数据库时间如何比较 美国云服务器独享ip 计算机网络技术np工程师 安卓软件开发用框架吗 高职扩招计算机网络技术难吗 服务器出现故障需要多久才能修好 数据库服务创建失败怎么回事 制约软件开发项目进展 挪威网络安全法 安徽服务器机柜批发商 河北智慧校园管理平台软件开发 笔记本电脑调用家里的服务器 河南省金地软件开发有限公司 微信抢红包开挂软件开发 宣城通信软件开发定制公司 山东电脑软件开发哪家专业 软件开发企业出口账务处理 软件开发绩效薪酬体系
0