Ansible基础概述

一、Ansible简介

       Ansible基于Python语言实现,由paramiko和PyYAML两个关键模块构建。Ansible的编排引擎可以出色地完成配置管理,流程控制,资源部署等多方面工作。Ansible公司负责Ansible开源软件的维护,管理。一般软件的更新大概每2个月发布一次(目前版本在2.4)Ansible主要承担的工作有以下几种:

  1. 配置管理
  2. 服务即时开通
  3. 应用部署
  4. 流程编排
  5. 监控告警
  6. 日志记录

   AnsibleSaltstack最大的区别是Ansible无需在被控主机部署任何客户端代理,默认直接通过SSH通道进行远程命令执行或下发配置:相同点是都具备功能强大、灵活的系统管理、状态配置,两者都提供丰富的模板及API,对云计算平台、大数据都有很好的支持。

 特点:

  • 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
  • 默认使用SSH协议对设备进行管理;
  • 主从集中化管理;
  • 配置简单、功能强大、扩展性强;
  • 支持API及自定义模块,可通过Python轻松扩展;
  • 通过Playbooks来定制强大的配置、状态管理;
  • 对云计算平台、大数据都有很好的支持;
  • 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
  • 幂等性:一种操作重复多次结果相同
简评:
(1)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)、使用python编写,维护更简单,ruby语法过于复杂;
(4)、支持sudo。

 

、Ansible架构及组件说明

1、架构图:

2、Ansible核心组件说明:

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

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

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

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

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

3、ansible任务执行流程
Ansible针对Ansible服务器对执行操作服务器的操作方式,分为两种执行模式:

  1. ad-hoc:这个模式支持执行单个模块,支持批量执行单条命令。
  2. playbook:这个可以理解成为面向对象的编程,就像上面举例那样可以把多个你想要执行的任务放到一个playbook当中,当然多个任务在事物逻辑上最好是有上下联系的。通过这多个任务可以完成一个总体的目标,这就是playbook。

 

三、Ansible部署及密钥分发

1、通过epel原安装ansible

[root@Node3 yum.repos.d]# rpm Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm   //安装epel源
[root@Node3 yum.repos.d]# yum -y install ansible                          //安装ansible
Loaded plugins: fastestmirror, langpacks
extras                                                                                                                        | 3.4 kB  00:00:00     
Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* epel: mirrors.tongji.edu.cn* extras: mirrors.163.com* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
.........省略中间部分.........
Installed:ansible.noarch 0:2.4.2.0-1.el7                                                                                                                     Dependency Installed:(安装依赖程序包)PyYAML.x86_64 0:3.10-11.el7                    libtomcrypt.x86_64 0:1.17-26.el7             libtommath.x86_64 0:0.42.0-6.el7                     libyaml.x86_64 0:0.1.4-11.el7_0                python-babel.noarch 0:0.9.6-8.el7            python-cffi.x86_64 0:1.6.0-5.el7                     python-enum34.noarch 0:1.0.4-1.el7             python-httplib2.noarch 0:0.9.2-1.el7         python-idna.noarch 0:2.4-1.el7                       python-ipaddress.noarch 0:1.0.16-2.el7         python-jinja2.noarch 0:2.7.2-2.el7           python-keyczar.noarch 0:0.71c-2.el7                  python-markupsafe.x86_64 0:0.11-10.el7         python-paramiko.noarch 0:2.1.1-2.el7         python-ply.noarch 0:3.4-11.el7                       python-pycparser.noarch 0:2.14-1.el7           python2-crypto.x86_64 0:2.6.1-15.el7         python2-cryptography.x86_64 0:1.7.2-1.el7_4.1        python2-jmespath.noarch 0:0.9.0-3.el7          python2-pyasn1.noarch 0:0.1.9-7.el7          sshpass.x86_64 0:1.06-2.el7                          Complete!

 2、SSH免密钥登录设置

[root@Node3 yum.repos.d]# ssh-keygen -t rsa -P ''   //生成公钥和私钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:nmuEMSEBMJF2uZXpE4EBfowEuKm504OkS+8Urwrq2TA root@Node3.contoso.com
The key's randomart image is:
+---[RSA 2048]----+
|B*oo=o+          |
|=oo+.=.          |
|.=.o+...         |
|o .. oo          |
|.. .  .+S        |
|o.  o ....       |
|+E . . .o        |
|O X .   ..       |
|+*o*   ..        |
+----[SHA256]-----+
[root@Node3 yum.repos.d]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@Node1     //分发公钥至Node1节点
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node1's password: 
Permission denied, please try again.
root@node1's password: 

Number of key(s) added: 1Now try logging into the machine, with:   "ssh 'root@Node1'"  
and check to make sure that only the key(s) you wanted were added.
[root@Node3 yum.repos.d]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@Node2 //分发公钥至Node2节点

 

三、Ansible命令介绍及配置文件

1、常用命令介绍及配置文件
  /usr/bin/ansible: Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
  /usr/bin/ansible-doc: Ansible 模块功能查看工具
  /usr/bin/ansible-galaxy: 下载/上传优秀代码或Roles模块的官网平台,基于网络的
  /usr/bin/ansible-playbook: Ansible 定制自动化的任务集编排工具
  /usr/bin/ansible-pull: Ansible远程执行命令的工具(使用较少,海量机器时使用,对运维的架构能力要求较高)
  /usr/bin/ansible-vault:  Ansible 文件加密工具
  /usr/bin/ansible-console:  Ansible基于Linux Consoble界面可与用户交互的命令执行工具

  /usr/share/ansible_plugins:Ansible高级自定义插件目录(需要python基础)
  /etc/ansible/ansible.cfg:配置文件
  /etc/ansible/hosts:主机清单

2、/etc/ansible/ansible.cfgansible.cfg配置文件

1)[defaults] #inventory      = /etc/ansible/hosts  # 主机列表配置文件#library        = /usr/share/my_modules/ # 库文件存放目录 #remote_tmp     = $HOME/.ansible/tmp  # 生成的临时py命令文件存放在远程主机的目录#local_tmp      = $HOME/.ansible/tmp # 本机的临时命令执行目录#forks          = 5   # 默认并发数#poll_interval  = 15   # 默认的线程池#sudo_user      = root  # 默认sudo 用户#ask_sudo_pass = True#ask_pass      = True#transport      = smart#remote_port    = 22#module_lang    = C#module_set_locale = Falsehost_key_checking = False  ### 检查对应服务器的host_key2)[privilege_escalation]
(3)[paramiko_connection]
(4)[ssh_connection]
(5)[accelerate]
(6)[selinux]
(7)[colors]

 

 3、Ansible主机清单(/etc/ansible/hosts)

  •  Hosts部分中经常用到的变量部分:
    ansible_ssh_host     #用于指定被管理的主机的真实IP
    ansible_ssh_port     #用于指定连接到被管理主机的ssh端口号,默认是22
    ansible_ssh_user     #ssh连接时默认使用的用户名
    ansible_ssh_pass     #ssh连接时的密码
    ansible_sudo_pass     #使用sudo连接用户时的密码
    ansible_sudo_exec     #如果sudo命令不在默认路径,需要指定sudo命令路径
    ansible_ssh_private_key_file     #秘钥文件路径,秘钥文件如果不想使用ssh-agent管理时可以使用此选项
    ansible_shell_type     #目标系统的shell的类型,默认sh
    ansible_connection     #SSH 连接的类型: local , ssh , paramiko,在 ansible 1.2 之前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh (支持的前提)
    ansible_python_interpreter     #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径
    ansible_*_interpreter     #其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以是ruby或才perl等其他语
    示列如下:
    [test]
    192.168.10.1 ansible_ssh_user=root ansible_ssh_pass='P@ssw0rd'
    192.168.10.2 ansible_ssh_user=tony ansible_ssh_pass='123456'
    192.168.10.3 ansible_ssh_user=tom ansible_ssh_port=3022 ansible_ssh_pass='456789'
    上面的示例中指定了三台主机,三台主机的用密码分别是P@ssw0rd、123456、45789,指定的ssh连接的用户名分别为root、tony、tom,ssh 端口分别为22、22、3022 ,这样在ansible命令执行的时候就不用再指令用户和密码等了

     

  • 简单的主机和组
        [webservers]
        web1.contoso.com
        web2.contoso.com
        [dbservers]
        db1.contoso.com
        db2.contoso.com
    a、中括号中的名字代表组名,可以根据自己的需求将庞大的主机分成具有标识的组,如上面分了两个组webservers和dbservers组;
    b、主机(hosts)部分可以使用域名、主机名、IP地址表示;当然使用前两者时,也需要主机能反解析到相应的IP地址,一般此类配置中多使用IP地址;

 、Ansible使用

1、定义主机清单(/etc/ansible/hosts)

[root@Node3 ansible]# tail -5 /etc/ansible/hosts ## db-[99:101]-node.example.com
[Webservers]                  //定义Web组
172.17.21.206
172.17.21.207

2、使用ping模块测试主机是否在线

[root@Node3 ansible]# ansible all -m ping        //测试所有主机是否在线
172.17.21.206 | SUCCESS => {"changed": false, "ping": "pong"
}
172.17.21.207 | SUCCESS => {"changed": false, "ping": "pong"
}

3、ansible命令的使用说明

常用选项

  • ansible -m MOD_NAME -a MOD_ARGS 表示调用什么模块,使用模块的那些参数
  • ansible-doc -l 获取模块信息
  • ansible-doc -s MOD_NAME 获取指定模块的使用帮助
  •  ansible -h
    [root@Node3 ansible]# ansible -h
    Usage: ansible <host-pattern> [options]
    Options:-a MODULE_ARGS, --args=MODULE_ARGS    模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"等等module arguments    模块参数-k, --ask-pass        ask for SSH password  登录密码,提示输入SSH密码而不是假设基于密钥的验证--ask-su-pass         ask for su password    su切换密码-K, --ask-sudo-pass   ask for sudo password  提示密码使用sudo,sudo表示提权操作--ask-vault-pass      ask for vault password-B SECONDS, --background=SECONDS     后台运行超时时间run asynchronously, failing after X seconds(default=N/A)-C, --check           don't make any changes; instead, try to predict some    只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
                            of the changes that may occur-c CONNECTION, --connection=CONNECTION   连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。connection type to use (default=smart)-f FORKS, --forks=FORKS   并行任务数。NUM被指定为一个整数,默认是5specify number of parallel processes to use(default=5)-h, --help            show this help message and exit   打开帮助文档API-i INVENTORY, --inventory-file=INVENTORY    指定库存主机文件的路径,默认为/etc/ansible/hostsspecify inventory host file(default=/etc/ansible/hosts)-l SUBSET, --limit=SUBSET    进一步限制所选主机/组模式  --limit=192.168.91.135 只对这个ip执行further limit selected hosts to an additional pattern--list-hosts          outputs a list of matching hosts; does not executeanything else-m MODULE_NAME, --module-name=MODULE_NAME   执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数module name to execute (default=command)-M MODULE_PATH, --module-path=MODULE_PATH    要执行的模块的路径,默认为/usr/share/ansible/specify path(s) to module library(default=/usr/share/ansible/)-o, --one-line        condense output      压缩输出,摘要输出.尝试一切都在一行上输出。-P POLL_INTERVAL, --poll=POLL_INTERVAL    调查背景工作每隔数秒。需要- bset the poll interval if using -B (default=15)--private-key=PRIVATE_KEY_FILE    私钥路径,使用这个文件来验证连接use this file to authenticate the connection-S, --su              run operations with susu 命令-R SU_USER, --su-user=SU_USER      指定SU的用户,默认是root用户run operations with su as this user (default=root)-s, --sudo            run operations with sudo (nopasswd)    -U SUDO_USER, --sudo-user=SUDO_USER    sudo到哪个用户,默认为 root  desired sudo user (default=root)-T TIMEOUT, --timeout=TIMEOUT    指定SSH默认超时时间,  默认是10Soverride the SSH timeout in seconds (default=10)-t TREE, --tree=TREE  log output to this directory     将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。-u REMOTE_USER, --user=REMOTE_USER    远程用户, 默认是root用户connect as this user (default=root)--vault-password-file=VAULT_PASSWORD_FILE  vault password file-v, --verbose         verbose mode (-vvv for more, -vvvv to enable    详细信息connection debugging)--version             show program's version number and exit   输出ansible的版本
  • ansible-doc -h
    [root@Node3 ansible]# ansible-doc  -h
    Usage: ansible-doc [options] [module...]
    Show Ansible module documentation     显示Ansible模块文档
    Options:--version             show program's version number and exit    显示ansible-doc的版本号-h, --help            show this help message and exit  显示命令参数API文档-M MODULE_PATH, --module-path=MODULE_PATH   查询模块,--module-path=MODULE_PATH  指定模块的路径Ansible modules/ directory-l, --list            List available modules   显示已存在的所有模块列表-s, --snippet         Show playbook snippet for specified module(s)   显示playbook制定模块的用法-v                    Show version number and exit   显示ansible-doc的版本号

     


 

 

 

转载于:https://www.cnblogs.com/cloudos/p/8322151.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DOM-12 【模拟桌面待讲评】鼠标事件深入、点击与拖拽分离、双击事件

鼠标事件深入 点击事件 mousedown mouseupposition: absolute 会将内联元素变为块级&#xff08;比如a&#xff09;a标签的协议限定符&#xff08;伪协议&#xff0c;防止跳转和刷新&#xff0c;让href不生效&#xff09;&#xff0c;javascript:;&#xff0c;可以让点击和拖…

scrapy的操作

转载于:https://www.cnblogs.com/mengqingjian/p/8337772.html

Devexpress xaf针对某个用户登录后在面板中设置导航无效的解决方法

Devexpress xaf框架生成的项目默认情况下导航栏是显示在左侧&#xff0c;有时候我们用某个账户登录后&#xff0c;发现导航栏无法显示在左侧&#xff0c;操作十分不方便。我们可以去数据库删除当前登录用户的自定义布局 解决方法如下: 1、查询PermissionPolicyUser用户表&#…

DOM-13 【实战】输入及状态改变事件、京东搜索框

模块化 IIFE window.onload function () {init() }function init() {keySearch()others() // 多人开发的模块 }var keySearch (function () {var searchKw document.getElementById(J_search_kw),autoKw document.getElementById(J_autoKw),recomKw JSON.parse(document…

吴恩达“机器学习”——学习笔记二

定义一些名词 欠拟合&#xff08;underfitting&#xff09;&#xff1a;数据中的某些成分未被捕获到&#xff0c;比如拟合结果是二次函数&#xff0c;结果才只拟合出了一次函数。 过拟合&#xff08;overfitting&#xff09;&#xff1a;使用过量的特征集合&#xff0c;使模型过…

Http 概述

Http是可靠的数据传输协议。资源Web服务器是Web资源&#xff08;resource&#xff09;的宿主。包括静态文件以及动态的内容。 媒体类型Http对每种需要由web传输的对象都打上了名为MIME类型的数据格式标签。主要的mime类型: text/htmltext/plainimage/jpegimage/gifvideo/quickt…

DOM-14 【实战】解决事件代理和鼠标移动事件的窘态

鼠标的滑入滑出 案例 事件现象应用场景mouseover/mouseout绑定在父元素时&#xff0c;对她的所有子元素&#xff0c;事件都生效dom结构简单mouseenter/mouseleave只对她绑定的元素有效&#xff0c;对window绑定无效dom结构简单mousemove长触发dom结构复杂// 绑定在父元素上 /…

javascript --- 再读作用域和闭包

执行环境: // 定义了变量或函数有权访问的其他数据,决定了它们各自的行为 // 每个执行环境都有一个与之关联的变量对象 // 执行环境中定义的所有变量和函数都保存在这个变量中执行环境与函数: // 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个…

DOM-15/16【实战】鼠标行为预测技术

鼠标预测行为动作复杂&#xff0c;使用事件代理得不偿失&#xff0c;在数量有限的情况下&#xff0c;使用循环绑定更好用户从menu斜着向右下角滑入时&#xff0c;可能是进入main&#xff0c;也可能是要选择子菜单&#xff0c;在判断前先做延迟如何判断用户进入main的意图&#…

ES6-1 ES6版本过渡历史

一 历史 HTML HTML 1, HTML 2, HTML 3 1991-1997 IETF(the Internet Engineering Task Force) 国际互联网工程任务组1997.1 HTML3.2 W3C JavaScript 1995 liveScript(后改名为JavaScript1996年改名)1996 javascript 1.0 1.1;1997 Jscript1997.6 ECMAScript 1.01998.6 ECMAS…

Django-model进阶

知识预览 QuerySet中介模型查询优化extra整体插入回到顶部QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 。它等同于SQL 的LIMIT 和OFFSET 子句。 1>>> Entry.objects.all()[:5] # (LIMIT 5)>>> Entry.objects.all()[5:10] # (OFFSE…

ES6-2 块级作用域与嵌套、let、暂行性死区

注意&#xff0c;写在开头 function test(x 1) {var x // 不报错console.log(x) } function test1(x 1) {let x 10 // 报错console.log(x) }let的变量名不可以和参数中的名称相同。而var并不限制&#xff0c;说白了就是希望你规范使用变量名。 形参原则上数组函数内部的临…

常用的操作系统知识

为什么要有操作系统 现代计算机系统是由一个或者多个处理器&#xff0c;主存&#xff0c;磁盘&#xff0c;打印机&#xff0c;键盘&#xff0c;鼠标显示器&#xff0c;网络接口以及各种其他输入&#xff0c;输出设备组成的复杂系统&#xff0c;每位程序员不可能掌握所有系统实现…

vue --- 使用中央事件总线(bus)实现跨组件通信

使用Bus实现跨组件传输须注意以下3点: 1.需要创建一个空的Vue实例(bus),来作为中间站 2.使用bus.emit来发送事件3.使用bus.emit来发送事件 3.使用bus.emit来发送事件3.使用bus.on来监听事件(在钩子created中监听) 代码如下: <!DOCTYPE html> <html> <head>…

vue --- 获取子组件数据的一个应急方案$refs

使用$refs需要注意以下2点: 1.html方法使用子组件时,需使用ref “xxx” 声明. 2.在父组件中使用,this.refs.xxx.msg 获取数据 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> </head> <body><div id"app"…

ES6-4/5 解构赋值、函数默认值、数组解构、对象解构

ES-4 解构赋值、函数默认值、数组解构、对象解构 ES-5 隐式转换、函数参数解构、解构本质、()用法 一 解构赋值 1 虚值 含义&#xff1a;在Boolean转换结果为假的值falsy 2 函数默认值 ES6 内部使用严格相等运算符&#xff08;&#xff09;&#xff0c;判断一个位置是否有值…

echarts --- 多折线图按段显示颜色规则订制

描述: 图中有4个序列,序列1和序列2在同一个x轴下,显示不同的颜色.(如,在-40到-30,序列一是红色,而序列2是黑色) 关键: VisualMap中的seriesIndex属性(根据不同的系列,制定不同的颜色规则). 下面是代码,可以直接复制到 echart实例 中进行调试 var symbolSize 20; var data [[…

ES6-6 - this指向、箭头函数基本形式、rest运算符

一 chrome断点调试 观察函数调用栈 // 25min var x 1; function foo(x, y function () { x 2; console.log(2) }) {var x 3;y();console.log(x) } foo() console.log(x) // 2 3 1var x 1; function foo(x, y function () { x 2; console.log(x) }) {x 3;y();console.…

ES6-7 - 箭头函数的实质、箭头函数的使用场景

箭头函数返回对象 // 这种情况要要用(),否则会将对象的{}解释为块 const fn (a, b) > ({a:1, b:2})箭头函数的特点 this指向由外层函数的作用域来决定&#xff0c;它本身没有this&#xff0c;不能通过call、apply、bind改变不能作为构造函数使用不可以使用arguments对象&…

javasript --- 一个日期规范(x秒前,x分前...)

Time函数(通俗易懂,自己根据实际需求修改吧- -) // time.js var Time {// 获取当前时间戳getUnix: function () {var date new Date();return date.getTime();},// 获取今天0点0分0秒的时间戳getTodayUnix: function () {var date new Date();date.setHours(0);date.setMin…