千家信息网

自动化运维工具Ansible详细部署

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,一、基础介绍==========================================================================================1、简介
千家信息网最后更新 2025年02月05日自动化运维工具Ansible详细部署

一、基础介绍

==========================================================================================

1、简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppetcfenginecheffuncfabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

(1)、连接插件connection plugins:负责和被监控端实现通信;

(2)host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

(4)、借助于插件完成记录日志邮件等功能;

(5)playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。


2、总体架构


3、特性

(1)no agents:不需要在被管控主机上安装任何客户端;

(2)no server:无服务器端,使用时直接运行命令即可;

(3)modules in any languages:基于模块工作,可使用任意语言开发模块;

(4)yamlnot code:使用yaml语言定制剧本playbook

(5)ssh by default:基于SSH工作;

(6)strong multi-tier solution:可实现多级指挥。


4、优点
(1)
、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)
、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)
、使用python编写,维护更简单,ruby语法过于复杂;
(4)
、支持sudo


5、任务执行流程





==========================================================================================

二、Ansible基础安装与配置

==========================================================================================

1-1yum源安装

以centos为例,默认在源里没有ansible,不过在fedora epel源里有ansible,配置完epel 源后,可以直接通过yum 进行安装。这里以centos6.8为例:

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # rpm -ivh epel-release-6-8.noarch.rpm# yum install ansible


1-2源码安装

(1)、安装devtoolset

# yum groupinstall "Development tools"

(2)、安装编译Python需要的包包

# yum install gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel libffi-devel

(3)python2.7安装

wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgztar xvzf Python-2.7.14.tgzcd Python-2.7.14./configuremake && make altinstall(altinstall在安装时会区分已存在的版本)(解决libpython2.7.so.1.0办法:vi /etc/ld.so.conf 添加/usr/local/lib,然后ldconfig)mv /usr/bin/python /usr/bin/python2.6.6ln -s /usr/local/bin/python2.7 /usr/bin/python## 将python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件cd /usr/local/include/python2.7/cp -a ./* /usr/include/## 修改yum脚本,使其指向旧版本的python,已避免其无法运行vim /usr/bin/yum#!/usr/bin/python  -->  #!/usr/bin/python2.6.6

(4)setuptools模块安装

wget https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg  --no-check-certificate chmod +x setuptools-0.6c11-py2.7.egg sh setuptools-0.6c11-py2.7.egg

(5)pycrypto模块安装

wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gztar zxvf pycrypto-2.6.1.tar.gzcd pycrypto-2.6.1python setup.py installcd ..

(6)PyYAML模块安装

##安装libyamlwget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gztar zxvf yaml-0.1.5.tar.gzcd yaml-0.1.5./configure --prefix=/usr/localmake --jobs=`grep processor /proc/cpuinfo | wc -l`make installcd ..##安装PyYAMLwget http://pyyaml.org/download/pyyaml/PyYAML-3.11.tar.gztar zxvf PyYAML-3.11.tar.gzcd PyYAML-3.11python setup.py installcd ..

(7)Jinja2模块安装

##安装MarkupSafewget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gztar zxvf MarkupSafe-0.9.3.tar.gzcd MarkupSafe-0.9.3python setup.py installcd ..##安装Jinjawget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gztar zxvf Jinja2-2.7.3.tar.gzcd Jinja2-2.7.3python setup.py installcd ..

(8)paramiko模块安装

##安装ecdsawget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gztar xvzf ecdsa-0.11.tar.gzcd ecdsa-0.11python setup.py installcd ..##安装paramikowget https://pypi.python.org/packages/2b/27/b64860e7b208ff1dd36fe208d07bca1f9637a11fe733e2f2ceea587c3f75/paramiko-1.7.5.zipunzip paramiko-1.7.5.zipcd paramiko-1.7.5python setup.py installcd ..

(9)simplejson模块安装

wget https://pypi.python.org/packages/08/48/c97b668d6da7d7bebe7ea1817a6f76394b0ec959cb04214ca833c34359df/simplejson-3.11.1.tar.gztar zxvf simplejson-3.11.1.tar.gzcd simplejson-3.11.1python setup.py installcd ..

(10)ansible安装

wget https://github.com/ansible/ansible/archive/stable-2.3.zipunzip stable-2.3.zipcd ansible-stable-2.3/python setup.py install


2Ansible配置

配置用户名密码

(1)使用examles包做为默认配置,具体如下:

mkdir -p /etc/ansiblecp -r examples/* /etc/ansible/ls /etc/ansible/ansible.cfg  DOCUMENTATION.yml  hosts  hosts.yaml  hosts.yml  playbooks  scripts

(2)使用默认示例配置文件后,先备份文件,编辑/etc/ansible/hosts文件:

cp /etc/ansible/hosts /etc/ansible/hosts.bak vim /etc/ansible/hosts   …… [all:children]testdev[test]#设置主机的默认连接用户,及密码172.16.52.236 ansible_ssh_user=root ansible_ssh_pass=test #设置ssh的连接方式,默认是openssh。官网推荐用openssh,因为paramiko查询key的时候,很耗时,效率不高。172.16.52.226 ansible_connection=paramiko[dev]#给主机取个别名"qsh_test",如果ssh默认端口不是22,这里可以指定特定的端口qsh_test ansible_ssh_host=172.16.52.100 ansible_ssh_port=21100#指定ssh端口也可以像下面这么指定。172.16.52.23[1:9]:22---------------------------------------注:1、all这个组包含俩子组分别是下面的test,和dev2、以上两种指定ssh端口方法,只针对我们有少部分的主机是特殊端口,配置文件里有个选项,改成我们需要的端口就OK了,修改后对全局有效grep "remote_port" /etc/ansible/ansible.cfg remote_port = 22    3、172.16.52.236可以在不同的组中。在现实当中就像我一台服务器即可以装mysql也可以装apache是一个道理。4、后面的用户和密码项是非必须的,在配置key认证的情况下,不使用密码也可以直接操作 。未使用key的,也可以在ansible通过 -k参数在操作前询问手动输入密码。

(3)、修改默认远程端口号

配置文件里有个选项,改成我们需要的端口就OK了,修改后对全局有效

lixc@ansible:~$ grep "remote_port" /etc/ansible/ansible.cfg remote_port    = 2222


(4)通过以下方式验证ansible是否可用,有结果输出,证明安装成功。

ansible test -a 'uptime'172.16.52.236 | SUCCESS | rc=0 >> 18:33:05 up 7 days,  8:07,  1 user,  load average: 0.06, 0.05, 0.00172.16.52.226 | SUCCESS | rc=0 >> 18:33:05 up 7 days,  8:08,  1 user,  load average: 0.00, 0.00, 0.00

报错:"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n"

解决:

提示需要安装sshpass,安装sshpass,sshpass也是epel源提供的

[root@ansible~]# yum install -y sshpass


SSH免密钥登录设置

(1)、生成公钥/私钥

# ssh-keygen -t rsa -P ''


## 写入信任文件(把本地的ssh公钥文件安装到远程主机对应的账户下):

# ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host


(2)ansible配置

# mkdir -p /etc/ansible

# vim /etc/ansible/ansible.cfg

remote_port = 36000

private_key_file = /root/.ssh/id_rsa_ansible

……


(3)、简单测试

# ansible test -m command -a 'uptime'

说明:第一次运行时,需要输入一下"yes"【进行公钥验证】,后续无需再次输入。


说说ansible的工作流程吧,工作流程差不多是这样的

  1. ansible通过OPENSSH或者python的pramamiko连接客户端

  2. 把ansible module推送到客户端。推送到客户端哪里的呢,请看

[root@qsh_server ansible]# grep "remote_tmp" /etc/ansible/ansible.cfg remote_tmp     = $HOME/.ansible/tmp[root@qsh_server ansible]# ansible test  -a "ls  ~/.ansible"172.16.52.236 | SUCCESS | rc=0 >>tmp

3.通过ssh执行客户端上的ansible module

4.执行完毕

5.删除刚刚推送过去的ansible module


3、常用模块使用

(1)setup

## 用来查看远程主机的一些基本信息

# ansible test -m setup |more


(2)ping

## 用来测试远程主机的运行状态

# ansible test -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 test -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"


## 远程文件信息查看

# ansible test -m command -a "ls -al /tmp/resolv.conf"


## 远程文件符号链接删除

# ansible test -m file -a "path=/tmp/resolv.conf state=absent"


## 远程文件信息查看

# ansible test -m command -a "ls -al /tmp/resolv.conf"

说明:如上显示,代表文件或链接已经删除。


## 递归创建个文件夹

# ansible test -m file -a "dest=/tmp/a/b/c owner=root group=root mode=755 state=directory"

(4)copy

## 复制文件到远程主机

相关选项如下:

backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

content:用于替代"src",可以直接设定指定文件的值

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

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

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

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

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


示例:

## 将本地文件"/etc/ansible/ansible.cfg"复制到远程服务器

# ansible test -m copy -a "src=/tmp/test.txt dest=/tmp/test.txt owner=root group=root mode=0644"

## copy 前先备份

# ansible test -m copy -a "src=/tmp/test.txt dest=/tmp/test.txt owner=root group=root mode=0644 backup=yes"


报错信息:

"Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

解决办法:关闭远程服务器selinux


(5)command

## 在远程主机上执行命令

相关选项如下:

creates:一个文件名,当该文件存在,则该命令不执行

free_form:要执行的linux指令

chdir:在执行指令之前,先切换到该目录

removes:一个文件名,当该文件不存在,则该选项不执行

executable:切换shell来执行指令,该执行路径必须是一个绝对路径


示例:

# ansible test -m command -a "uptime"


(6)shell

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

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


示例:

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

# vim /tmp/ansible_test.sh

#!/bin/sh

date +%F_%H:%M:%S


#chmod +x /tmp/ansible_test.sh


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

# ansible test -m copy -a "src=/tmp/ansible_test.sh dest=/tmp/ansible_test.sh owner=root group=root mode=0755"


## 远程执行

# ansible test -m shell -a "/tmp/ansible_test.sh"


(7)、更多模块

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

service:系统服务管理

cron:计划任务管理

yumyum软件包安装管理

synchronize:使用rsync同步文件

user:系统用户管理

group:系统用户组管理


更多模块可以参考:

#ansible-doc -l


http://docs.ansible.com/modules_by_category.html

http://www.ansible.cn/docs/

(国内的一个镜像站点,避免被墙 ^_^ )


(8)、一些概念补充

playbook的组成:playbook是由一个或多个"play"组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;


执行模型task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;


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


notify指定handler的执行机制:"notify"这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。


==========================================================================================

三、后续工作

==========================================================================================

1、深入学习ansibleplaybook以及扩展模块;

2、 结合业务环境,初步实现基础监控,以取代目前调用自动化部署平台API的方式;

3、 尝试自动化运维工具saltstack,并将其与ansible进行对比。


一些学习资料:

http://lansgg.blog.51cto.com/5675165/1745040

http://blog.xiaorui.cc/category/ansible/

http://lixcto.blog.51cto.com/4834175/d-4

https://github.com/ansible/ansible-examples

http://rfyiamcool.blog.51cto.com/1030776/d-51

http://dl528888.blog.51cto.com/2382721/d-4/p-1

http://edu.51cto.com/course/course_id-2220.html

http://edu.51cto.com/course/course_id-2032.html

http://www.shencan.net/index.php/category/%e8%87%aa%e5%8a%a8%e5%8c%96%e8%bf%90%e7%bb%b4/ansible/




文件 模块 目录 主机 配置 路径 链接 任务 运行 端口 客户 客户端 情况 系统 工作 信息 命令 密码 源文件 用户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 pdl是软件开发 网络安全红线心得体会200 网站服务器怎么优化 lede ssr服务器 重庆企业软件开发哪里有 c语言服务器 魔兽8.3哪个服务器平衡 网络技术方面的专业 河南专业软件开发定制公司 雄安erp平台网络技术 六安市网络安全应急指挥中心在哪 联通网络技术大会论文下载 王牌战争怎么开服务器里面的商店 国产bim软件开发 人力资源技能数据库 内网写入数据库通讯安全 江苏在线网络技术开发套餐 福州直播课堂软件开发 苏州服务器管理机房it维保安装 服务器数据最安全的备份方法 网络安全工程师能不能报考 中孚信息与网络安全风云企业 网络安全机制落实情况 软件开发好接单吗 南宁智慧法治文化展馆软件开发 软件开发用树形目录节点 黄浦区创新软件开发服务报价表 徐州智慧校园软件开发 淄川物流竞价报价软件开发服务 软件开发销售些什么
0