第10章:深入浅出Ansible
1.Ansible介绍
1).Ansible的优点
Ansible是一个简单的自动化引擎,可完成配置管理、引用部署、服务编排以及其他各种IT需求
Ansible是Python开发并实现的开源软件,其依赖Jinja2,paramiko和PyYAML这几个Python库
安装部署简单
基于SSH进行配置管理
Ansible不需要守护进程
日志集中存储
Ansible简单易用
Ansible功能强大
Ansible设计优秀
Ansible对云计算和大数据平台都有很好的支持
2).Ansible与Fabric之间比较
Fabric像是一个工具箱,提供了很多好用的工具用于在远程服务器执行命令
Ansible提供了一套简单的流程,只需要按照它的流程来做就能轻松完成任务
Fabric是库,Ansible是框架
Fabric简单,Ansible复杂
Fabric通过SSH执行简单的命令,Ansible将模块拷贝到远程服务器后执行,执行完以后删除模块
Fabric需要Python编程背景,Ansible不需要
Fabric需要写代码,Ansible只需要编写YAML格式的配置文件来描述要做的事情
Fabric提供了基本的接口,业务逻辑需要用户自己实现,Ansible提供了大量模块,用户只需要学习模块的用法即可
3).Ansible与SaltStack之间比较
Ansible安装部署简单,SaltStack需要安装客户端接收服务端发过来的命令
SaltStack相应速度更快,Ansible使用标准SSH连接,而SaltStack使用ZeroMQ进行通信和传输
Ansible更安全,Ansible使用标准SSH连接传输数据,不需要在远程主机上启动守护进程
SaltStack对Windows支持比较友好
Ansible自身运维比较简单,SaltStack需要在Master和Minion主机启动一个守护进程
2.Ansible使用入门
1).安装Ansible
pip install ansible
2).Ansible的架构
Ansible的编排引擎由Inventory、API、Modules(模块)和Plugins组成
工程师将需要在远程服务器执行的操作写在Ansible Playbook中,然后使用Ansible执行Playbook中的操作
3).Ansible的运行环境
Ansible会默认读取/etc/ansible/hosts文件中配置的远程服务器列表
# mkdir /etc/ansible
# cat /etc/ansible/hosts
[test]
192.168.1.101
192.168.1.102
192.168.1.103 # ansible test -m ping
192.168.1.101 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.103 | SUCCESS => {
"changed": false,
"ping": "pong"
}
4).Ansible的ad-hoc模式
Ansible的ad-hoc模式,通过ansible命令执行操作的方式,称为ad-hoc
# ansible test -m command -a "hostname" # ansible test -m command -a "whoami" 将本地文件拷贝到服务器中:
# ansible test -m copy -a "src=/etc/ansible/hosts dest=/tmp/hosts" 修改文件的所有者和权限:
# ansible all -m file -a "dest=/tmp/hosts mode=500 owner=mysql group=mysql" -become
-become参数类似于Linux命令下的sudo 在远程服务器中安装软件:
# ansible test -m yum -a "name=git state=present" -become
5).使用playbook控制服务器
在实际的生产环境中,我们一般将远程服务器需要做的事情写在一个YAML配置文件中
YAML文件称为Ansible Playbook # cat test_playbook.yaml
---
- hosts : test
become : yes
become_method : sudo
tasks :
- name : copy file
copy : src=/etc/ansible/hosts dest=/tmp/data.txt - name : change mode
file : dest=/tmp/data.txt mode=500 owner=mysql group=mysql - name : ensure packages installed
yum : pkg="{{ item }}" state=present
with_items :
- git # ansible-playbook test_playbook.yaml
3.Inventory管理
1).hosts文件位置
在Ansible中,将可管理的服务器集合称为Inventory
Inventory管理便是服务器管理
默认读取/etc/ansible/hosts文件
通过命令行参数的-i指定hosts文件
通过ansible.cfg文件中的inventory选项指定hosts文件
2).动态Inventory获取
# cat hosts.py
import argparse
import json
from collections import defaultdict
from contextlib import contextmanager
import pymysql def to_json(in_dict):
return json.dumps(in_dict, sort_keys=True, indent=2) @contextmanager
def get_conn(**kwargs):
conn = pymysql.connect(**kwargs)
try:
yield conn
finally:
conn.close() def parse_args():
parser = argparse.ArgumentParser(description='OpenStack Inventory Module')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--list', action='store_true', help='List active servers')
group.add_argument('--host', help='List details about the specific host')
return parser.parse_args() def list_all_hosts(conn):
hosts = defaultdict(list)
with conn as cur:
cur.execute('select * from hosts')
rows = cur.fetchall()
for row in rows:
no, host, group, user, port = row
hosts[group].append(host)
return hosts def get_host_detail(conn, host):
details = {}
with conn as cur:
cur.execute("select * from hosts where host='{0}'".format(host))
rows = cur.fetchall()
if rows:
no, host, group, user, port = rows[0]
details.update(ansible_user=user, ansible_port=port)
return details def main():
parser = parse_args()
with get_conn(host='127.0.0.1', user='root', passwd='msds007', db='test') as conn:
if parser.list:
hosts = list_all_hosts(conn)
print(to_json(hosts))
else:
details = get_host_detail(conn, parser.host)
print(to_json(details)) if __name__ == '__main__':
main()
4.YAML语法
1).语法规则
YAML文件的第一行为"---",表示是一个YAML文件
YAML中的字段大小写敏感
YAML与Python一样,使用缩进表示层级关系
YAML的缩进不允许使用Tab键,只允许使用空格,且空格的数目不重要,只要相同层次的元素左对齐即可
:冒号前后要有空格
#表示注释,从这个字符一直到行尾都会被解析器忽略
2).支持的数据格式
对象:键值对的集合,又称为映射,类似于Python中的字典
数组:一组按次序排列的值,又称为序列(sequence),类似于Python中的列表
纯量:单个的、不可再分的值,如字符串、布尔值于数字
3).解析
pip install PyYAML 使用PyYAML库解析YAML文件非常简单
import yaml
with open('data.yaml') as f:
print(yaml.load(f)) # cat data.yaml
---
name : Example Developer
job : Developer
skill : Elite
employed : True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby : Elite
python : Elite
dotnet : Lame
5.Ansible模块
1).Ansible的模块工作原理
1)将模块拷贝到远程服务器
2)执行模块定义的操作,完成对服务器的修改
3)在远程服务器中删除模块
2).常用的Ansible模块
1.ping
2.远程命令模块command
3.file
4.copy
5.user/group
6.yum
7.get_url
8.unarchive
9.git
3).模块的返回值
changed
failed
6.Playbook
1).Playbook的定义
在Ansible中,将各个模块组合起来的文件是一个YAML格式的配置文件,这个配置文件,在Ansible中称为Playbook
Ansible中的Playbook类似于Linux下的Shell脚本文件
2).使用ansible-playbook
# cat test_playbook.yaml
---
- hosts : test
become : yes
become_method : sudo
tasks :
- name : copy file
copy : src=/py/data.txt dest=/tmp/data.txt - name : change mode
file : dest=/tmp/data.txt mode=500 owner=mysql group=mysql - name : ensure packages installed
yum : pkg="{{ item }}" state=present
with_items :
- git # ansible-playbook test_playbook.yaml
3).Playbook的详细语法
1.权限
在Ansible中,默认使用当前用户连接远程服务器执行操作,我们可以在ansible.cfg文件中配置连接远程服务器的默认用户
2.通知
3.变量
4.Facts变量
Facts变量是Ansible执行远程部署之前从远程服务器中获取的系统信息,包括服务器的名称、IP地址、操作系统、分区信息、硬件信息等
Facts变量可以配合Playbook实现更加个性化的功能需求
访问复杂变量的Playbook:
---
- hosts : test
gather_facts : yes
tasks :
- shell : echo {{ ansible_eth0 ["ipv4"] ["address"] }}
register : myecho - debug : var=myecho.stdout_lines - shell : echo {{ ansible_eth0.ipv4.address }}
register : myecho - debug : var=myecho.stdout_lines
5.循环
# cat test_playbook.yaml
---
- hosts : test
become : yes
become_method : sudo
tasks :
- name : Installed MySQL Package
yum : pkg="{{ item }}" state=installed
with_items :
- mysql-server
- MySQL-python
- libselinux-python
- libsemanage-python
# ansible-playbook test_playbook.yaml
6.条件
在Playbook中可以通过when选项执行条件语句,when类似于if语句
7.任务执行策略
4).使用Playbook部署ngix
# cat deploy_nginx.yaml
---
- hosts: test
become: yes
become_method: sudo
vars:
worker_processes: 4
worker_connections: 768
max_open_files: 65506
tasks:
- name: install nginx
yum: name=nginx update_cache=yes state=present - name: copy nginx config file
template: src=/py/nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: copy index.html
template:
src: /py/index.html.j2
dest: /usr/share/nginx/html/index.html
mode: 0644
notify: restart nginx handlers:
- name: restart nginx
service: name=nginx state=restarted # ansible-playbook depoly_nginx.yml
5).使用Playbook部署MongoDB
# cat mongo.yml
---
- hosts: test
become: yes
become_method: sudo
vars:
mongodb_datadir_prefix: /data
mongod_port: 27018 tasks:
- name: Create the mongodb user
user: name=mongodb comment="MongoDB" - name: Create the data directory for the namenode metadata
file: path={{ mongodb_datadir_prefix }} owner=mongodb group=mongodb state=directory - name: Install the mongodb package
yum: name={{ item }} state=installed
with_items:
- mongodb-server
- mongodb - name: create data directory for mongodb
file:
path: "{{ mongodb_datadir_prefix }}/mongo-{{ ansible_hostname }}"
state: directory
owner: mongodb
group: mongodb - name: create log directory for mongodb
file: path=/var/log/mongo state=directory owner=mongodb group=mongodb - name: Create the mongodb startup file
template: src=mongod.j2 dest=/etc/init.d/mongod-{{ ansible_hostname }} mode=0655 - name: Create the mongodb configuration file
template: src=mongod.conf.j2 dest=/etc/mongod-{{ ansible_hostname }}.conf - name: Copy the keyfile for authentication
copy: src=secret dest={{ mongodb_datadir_prefix }}/secret owner=mongodb group=mongodb mode=0400 - name: Start the mongodb service
command: creates=/var/lock/subsys/mongod-{{ ansible_hostname }} /etc/init.d/mongod-{{ ansible_hostname }} start # ansible-playbook mongo.yml
7.role的定义与使用
role并不是某一个具体的东西,而是一个规范与抽象,是一种将复杂的Playbook分割成多个文件的机制
Ansible从复杂的Playbook中抽象出了role的概念,并在Playbook提供了roles选项来使用role,在命令行提供了ansible-galaxy命令来创建、删除和查看role
所谓role,只是一种规范的文件组织方式。每个Ansible的role都会有一个名字,比如mongodb,与mongodb role相关的文件都存放在/etc/ansible/roles/mongodb目录下
8.Ansible的配置文件
1).配置文件的查找路径
配置文件的查找路径
Ansible命令行工具使用的配置文件是/etc/ansible/ansible.cfg文件
一般将所有的role、Playbook、Inventory文件、ansible.cfg文件保存在一个版本控制的库中 在Ansible中,可以有多种方式使用ansible.cfg文件。Ansible查找ansible.cfg文件的顺序如下:
1)ANSIBLE_CONFIG环境变量指定的配置文件
2)当前目录下的ansible.cfg文件
3)当前用户home目录下的.ansible.cfg文件
4)Ansible默认的/etc/ansible/ansible.cfg文件
2).Ansible中的常用配置
1.默认配置
inventory
remote_user
remote_port
private_key_file
roles_path
log_path
host_key_checking
forks
gathering
2.ssh连接配置
ssh_args
pipelining
control_path
3.权限提升配置
become
become_method
become_user
become_ask_pass
第10章:深入浅出Ansible的更多相关文章
- 《构建之法》之第8、9、10章读后感 ,以及sprint总结
第8章: 主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 1.软件需求:人们为了解决现实社会和生活中的各种 ...
- 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则
第10章 LSP:Liskov替换原则 Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...
- 孙鑫视频学习:对第10章设置线宽时为什么不调用UpDateData(TRUE)的理解
在第10章10.2.1小节中,首先分别对视图类和对话框类添加了一个名为m_nLineWidth的int型变量,再将用户在CSetting dlg对话框的edit控件中输入的线宽值记录在dlg.m_nL ...
- 第10章 系统级I/O
第10章 系统级I/O 10.1 Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出 ...
- 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化
高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...
- Linux就这个范儿 第10章 生死与共的兄弟
Linux就这个范儿 第10章 生死与共的兄弟 就说Linux系统的开机.必须经过加载BIOS.读取MBR.Boot Loader.加载内核.启动init进程并确定运行等级.执行初始化脚本.启动内核模 ...
- 【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理
[翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译] ...
- 《构建之法》第8、9、10章读后感和Sprint总结
<构建之法>第8.9.10章读后感 第八章重点讲了需求分析,在一个项目中,需求分析是最基础也是最重要的,只有充分了解了用户需求,我们才不会走弯路,才能做出正确的规划,保证项目的进行是按照 ...
- JavaScript高级程序设计(第三版)学习笔记8、9、10章
第8章,BOM BOM的核心对象是window,具有双重角色,既是js访问浏览器的一个接口,又是ECMAScript规定的Global对象.因此,在全局作用域中声明的函数.变量都会变成window对象 ...
- 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制
第10章 Android的消息机制 10.1 Android消息机制概述 (1)Android的消息机制主要是指Handler的运行机制,其底层需要MessageQueue和Looper的支撑.Mes ...
随机推荐
- c 判断数字是否无限
/* isinf example */ #include <stdio.h> /* printf */ #include <math.h> /* isinf, sqrt */ ...
- postgresql could not connect to server
问题: postgresql部署在linux上,在自己电脑上使用pgadmin连接出现could not connect to server错误 问题分析: 出现上述原因有3种情况 1.linux上的 ...
- 讨论SQLite数据库损坏与修复
版权声明:博客将逐步迁移到 http://cwqqq.com https://blog.csdn.net/cwqcwk1/article/details/45541409 昨晚,朋友和我反馈SQL ...
- qt 创建及调用QT的 DLL
先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数 ...
- 多进程之间的互斥信号量的实现(Linux和windows跨平台)
最近工作中遇到了一些关于文件读取权限的问题.当一个程序中对一个固定名称的文件做了读写的操作的时候,外界通过并发式的调用这个应用的时候,可能存在多个进程同时去操作这个文件,这个时候可能会造成调用失败的问 ...
- Xshell查看日志
查询日志命令(复制后鼠标右键粘贴): tail -1000f /mnt/logs/SMFManagement/SMFManagement_info.log
- ORACLE EXECUTE IMMEDIATE 小结
EXECUTE IMMEDIATE 代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,E ...
- CXF框架构建和开发 Services
Apache CXF 是一个开源的 Services 框架,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP.POST/HTTP.RESTful ...
- Objective-C中的self与LLVM Clang新引入的instancetype
我们知道,大部分面向对象语言对于一个类的成员方法都有一个隐含的参数.在C++.Java.C#和JavaScript中是this,而在Objective-C中则是self.当然,由于Objective- ...
- Qt编写安防视频监控系统7-全屏切换
一.前言 全屏切换这个功能点属于简单的,一般会做到右键菜单中,也提供了快捷键比如alt+enter来触发,恢复全屏则按esc即可,全屏处理基本上都是隐藏通道面板以外的窗体,保持最大化展示,由于采用了模 ...