版权声明:本文为博主原创文章。未经博主同意不得转载。

https://blog.csdn.net/O4dC8OjO7ZL6/article/details/79765539

点击上方“中兴开发人员社区”,关注我们

每天读一篇一线开发人员原创好文

http://mmbiz.qpic.cn/mmbiz_png/8rlpLIcBeicHqvfEoaw4xHuotViafvZQyIDOOdGj7vzk0IpHkxcI9wbPpicBSIDnIhZzrl5OMVgj22iaagVqcE0ia1g/640?

wx_fmt=png" alt="640?wx_fmt=png" />

前言

近期在重构一款命令行工具。使用 golang 又一次开发。但须要继续维持原有的命令,同一时候添加新命令。

在重构的过程中,须要对现命令行工具和原命令行工具的命令输出结果进行比对,确保全然一致(项目要求)。命令行工具须要在部署完毕系统之后进行使用,每一个系统完毕时的部署组件又略微有点差异。

所以事实上须要在多套服务主机上进行測试。

须要做这些动作:

  • 拷贝一些配置文件到主机上:用户配置、IP和port文件

  • 安装命令行工具,确保使其在服务主机上能够使用

  • 运行一堆測试命令

按理说,我不断把须要的配置和二进制文件复制到主机上进行測试也能完毕。

但在使用的过程中存在以下几个问题:

  • 測试发现,结果不正确时须要及时改动代码。再次拷贝二进制文件到主机上

  • 主机环境须要多次推倒,又一次部署,验证版本号更新问题

  • 须要手动一个一个命令的运行

  • 測试有几套主机

看上去手动的方法。有点费劲。

眼下我从事的工作就是 PaaS 部署相关的,部署层面的脚本的运行、组件的安装、服务的启动等都是使用 Ansible 来操作。详细的脚本编写由其它同事,我仅仅知道这个东西是干嘛的。没实质性的学习。于是想借这个机会主动学习下 Ansible.

学习之处,差点犯了老问题,即:从头開始看官方文档,而不注重当前须要解决的问题。

由于事实上整个 Ansible 的内容体系非常多。

不注重当前须要解决的问题,会导致你抓不住重点。

意识到后专注在当前须要解决的问题上:

  • 拷贝配置文件和安装脚本到多个主机上

  • 在多个主机上測试命令行工具


Ansible

看了上面的事件背景。你大概知道这个 Ansible 究竟是个什么东西。

Ansible 是一个配置管理和应用部署工具。即在管理主机上操作一些命令就能在节点主机上进行对应的动作。由 Python 编写。由模块化组成,即运行动作的实体。在 ansible 上都是靠着对应的模块运行动作,比方拷贝 copy 模块、运行 command 模块、shell 模块、文件 file 模块等。

Ansible 的目标有例如以下:

  • 自己主动化部署应用

  • 自己主动化管理配置

  • 自己主动化的持续交付

  • 自己主动化的(AWS)云服务管理。


原理

管理主机从 hosts 里读取主机清单,通过 playbook 按顺序同一时候对管理的主机进行对应的操作。

如图:

https://mmbiz.qpic.cn/mmbiz_png/8rlpLIcBeicGiae9blZn58DRgMDYibJ7VibSgJpdBicLG2VTQibMvft9LFVHhIP1klZUtc6wQvWQM9v4fUtbQnrF0XOQ/640?

wx_fmt=png" alt="640?wx_fmt=png" />

https://mmbiz.qpic.cn/mmbiz_png/8rlpLIcBeicGiae9blZn58DRgMDYibJ7VibSmP7FC0HWXf5wAkcE9HaR4cr5GkZeq8AbJiaut98kdb0IIibDNdhLfakQ/640?wx_fmt=png" alt="640?

wx_fmt=png" />

管理主机主要是对主机的定义和配置、编写 playbook(即节点主机的运行动作)。

运行:

1. 命令行

  1. ansible all -m ping

2. playbook

  1. ansible-playbook example.yml

主机清单

编辑文件:/etc/ansible/hosts

即:定义主机名称,变量等

主机的变量包括什么: 主机的运行用户、连接port、password等

相似于 ini 格式的文件

  1. [test-new-cli]
  2. 10.62.60.72
  3. [test-old-cli]
  4. 10.62.62.88

上面的样例:将两个主机的分为两组:test-new-cli 和 test-old-cli

主机的变量有这么些:

  • ansible_ssh_host
    将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

  • ansible_ssh_port
    sshport号.假设不是默认的port号,通过此变量设置.

  • ansible_ssh_user
    默认的 ssh username

  • ansible_ssh_pass
    ssh password(这样的方式并不安全,我们强烈建议使用 —ask-pass 或 SSH 密钥)

  • ansible_sudo_pass
    sudo password(这样的方式并不安全,我们强烈建议使用 —ask-sudo-pass)

  • ansible_sudo_exe (new in version 1.8)
    sudo 命令路径(适用于1.8及以上版本号)

  • ansible_connection
    与主机的连接类型.比方:local, ssh 或者 paramiko.

  • ansible_ssh_private_key_file
    ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

  • ansible_shell_type
    目标系统的shell类型.默认情况下,命令的运行使用 ‘sh’ 语法,可设置为 ‘csh’ 或 ‘fish’.

  • ansible_python_interpreter
    目标主机的 python 路径.

看不懂怎么用:

举个样例,你想连接主机 192.168.100.100 , 切换到 root 用户下运行对应的操作。

假设你直接ssh username@192.168.100.100 会要求你输入username和password。

假如我编辑主机清单使得自己不须要输入usernamepassword,怎么操作?

  1. [test-new-cli]
  2. example ansible_ssh_host=192.168.100.100 ansible_ssh_user=username ansible_ssh_pass=root

即配置好192.168.100.100 的主机别名为example, 主机的username和password为:username/root


Yaml

包括三种类型:

  • 键值对:key: value

  • 数组

  • 纯量:整型、字符串、布尔型

这个非常好理解:假设你熟悉Python, 这三种类型就相当于:map, list, 变量

假设你熟悉golang, 这三种类型就相当于: map, 数组。 变量

演示样例:

  1. ---
  2. - name: "execute command nodepool node list by { {item.name} }"
  3.  shell: "{ {item.cli} } nodepool node list { {item.id} }"
  4.  register: result
  5. - name: show result
  6.  debug:
  7.    msg: "{ {result.stdout_lines} }"
  8.  with_items:
  9.    - { name: "new-cli", cli: "new-cli", id: "1" }
  10.    - { name: "old-cli", cli: "old-cli", id: "1" }

模块

Ad-doc

ansible 命令行式,适合运行单条命令。

  1. # 操作 192.168.100.100 主机。看管理主机是否和192.168.100.100的主机连通
  2. ansible example -m ping
  3. # 操作 192.168.100.100 主机,拷贝管理主机下的/root/opcli/conf 文件至节点主机/etc/opcli/conf 下
  4. ansible test-new-cli -m copy -a="src=/root/opcli/conf dest=/etc/opcli/conf"
  • m: 模块

  • a: 接參数

能够看出适合运行单条命令


Patterns

假如你的节点主机分组非常多了。Ad-hoc 怎样选择特定特征的节点主机分组呢?

使用类正則表達式。

比方触发全部节点主机进行动作:

  1. ansible all -m ping
  2. ansible * -m ping
  3. 两者等价,都是选择全部的节点主机

演示样例:

1. 主机别名或者IP
  1. one.example.com
  2. one.example.com:two.example.com
  3. 192.168.1.50
  4. 192.168.1.*
2. 一个或多个groups
  1. webservers
  2. webservers:dbservers
3. 排除一个组
  1. webservers:!phoenix
  2. # 隶属 webservers 组但同一时候不在 phoenix组
4. 两个组的交集
  1. webservers:&staging
  2. # 同一时候隶属于 webservers 和 staging 组
5. 列表
  1. webservers[0]
  2. webservers[0-25]
6. 其它

有什么需求,看官方文档吧。

Playbook

编写 yaml 文件。适合运行多步操作的复杂操作。能够看成是Ad-doc 命令的集合。甚至能够看成是一门编程语言。

运行:ansible-playbook example.yml

依照 example.yml 文件中的任务集合按步运行任务。


演示样例

命令演示样例,仅举几例。有带參数、有没带參数的。

我们终于的目标是:在节点主机上运行这些命令进行比对两者结果。

新版本号:

命令 说明
command-cli nodepool list 查询资源池
command-cli nodepool node list  查询资源池节点
command-cli node list 查询节点
command-cli node show  查询某个节点
command-cli task list 查询部署任务

旧版本号:

命令 说明
old-cli nodepool list 查询资源池
old-cli nodepool node list  查询资源池节点
old-cli node list 查询节点
old-cli node show  查询某个节点
old-cli task list 查询部署任务

文件夹结构:

  1. demo-for-ansible:
  2. ---nodepool/nodepool-list.yml
  3. ---nodepool/nodepool-node-list.yml
  4. ---node/node-list.yml
  5. ---node/node-show.yml
  6. ---task/task-list.yml
  7. ---main.yml

第一步:编写主机清单

/etc/ansible/hosts

  1. [test_client]
  2. 192.168.100.100 ansible_ssh_user=xiewei ansible_ssh_pass=root ansible_connection=ssh
  3. 192.168.100.101 ansible_ssh_user=xiewei ansible_ssh_pass=root ansible_connection=ssh
  4. 192.168.100.102 ansible_ssh_user=xiewei ansible_ssh_pass=root ansible_connection=ssh

定义主机连接类型、username、password


第二步:编写 yaml 文件

主要动作:

  • 在节点主机上创建两个文件夹: /etc/client/conf 和 /et/client/commands

  • 拷贝管理主机文件夹:/etc/client/conf 文件至节点主机: /etc/client/conf

  • 拷贝管理主机二进制文件:/root/gosrc/src/client/command-cli 至节点主机 /etc/client/commands

  • 软连接节点主机二进制文件:/etc/client/commands/command-cli 至节点主机 /usr/bin/command-cli

  • 运行上表中查询命令:nodepool, node, task

main.yml

  1. ---
  2. - hosts: test_client
  3.  remote_user: root
  4.  become: yes
  5.  become_user: root
  6.  become_method: sudo
  7.  tasks:
  8.    # 在节点主机上创建文件夹:/etc/client/conf
  9.    - name: create /etc/client/conf /etc/client/commands
  10.      file:
  11.        path: "/etc/client/{ {item} }"
  12.        owner: root
  13.        group: root
  14.        mode: 0755
  15.        state: directory
  16.      with_items:
  17.      - "conf"
  18.      - "commands"
  19.    # 拷贝管理主机配置文件/etc/client/conf和二进制文件至 /etc/client/conf, /etc/client/commands
  20.    - name: copy /etc/client/conf
  21.      copy: src="{ { item.src } }" dest="{ { item.dest } }" owner=root group=root mode=0644
  22.      with_items:
  23.      - { src: "/etc/client/conf", dest: "/etc/client/conf" }
  24.      - { src: "/root/gosrc/src/client/command-cli", dest: "/etc/client/commands"}
  25.    # 软连接到 /usr/bin/command-cli
  26.    - name: link  /etc/client/commands
  27.      file: src="/etc/client/commands/command-cli" dest="/usr/bin/command-cli" state=link
  28.    # nodePool list
  29.    - include_tasks: "nodepool/nodepool-list.yml"
  30.      with_items:
  31.      - { client: "new client", name: "command-cli"}
  32.      - { client: "old client", name: "old-cli"}
  33.    # nodePool node list <id>
  34.    - include_tasks: "nodepool/nodepool-node-list.yml"
  35.      with_items:
  36.      - { id: "1", client: "new client", name: "command-cli"}
  37.      - { id: "1", client: "old client", name: "old-cli"}
  38.    # node list
  39.    - include_tasks: "node/node-list.yml"
  40.      with_items:
  41.      - { client: "new client", name: "command-cli"}
  42.      - { client: "old client", name: "old-cli"}
  43.    # node show <id>
  44.    - include_tasks: "node/node-show.yml"
  45.      with_items:
  46.      - { client: "new client", name: "command-cli", id: 1}
  47.      - { client: "old client", name: "old-cli", id: 1}
  48.    #  task list
  49.    - include_tasks: "task/task-list.yml"
  50.      with_items:
  51.      - { client: "new client", name: "command-cli"}
  52.      - { client: "old client", name: "old-cli"}

task-list.yml

  1. ---
  2. - name: execute command task list
  3.  shell: "{ {item.name} } task list"
  4.  register: result
  5. - name: show result
  6.  debug:
  7.    msg: "{ {result.stdout_lines} }"

第三步: 检查语法

两种方法

  1. ansible-playbook main.yml --syntax-check

  2. 先安装 pip install ansible-lint

  1. ansible-lint main.yml

第四步: 运行

  1. ansible-playbook main.yml

整个的编写流程大概是这样。核心是编写 yml 文件,调用 ansible 支持的各种模块完毕任务。


下一步

  1. 熟悉 playbook

  2. 熟悉 ansible 模块

  3. 熟悉 ansible api

关注你当前须要解决的问题,切入学习,事半功倍。

https://mmbiz.qpic.cn/mmbiz_png/8rlpLIcBeicHoFXuOQzSHL79EdC8emOVJ9ibBrt4zBHLNR4CXnibLlk6tZibxX0rSslMRTo4mTUWxGf5D0prIaia03Q/640?wx_fmt=png" alt="640?wx_fmt=png" />

干货 | Ansible 上手指南的更多相关文章

  1. 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块

    五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options]    -v,--verbose  ...

  2. 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令

    2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...

  3. Rancher 快速上手指南操作(1)

    Rancher 快速上手指南操作(1)该指南知道用户如何快速的部署Rancher Server 管理容器.前提是假设你的机器已经安装好docker了.1 确认 docker 的版本,下面是 ubunt ...

  4. X下轻量级桌面WindowMaker上手指南

    layout: post title: 轻量级桌面WindowMaker上手指南 tags: x11, cygwin, raspi --- 最近工作上需要在远程Linux上运行一个桌面(我需要跑Net ...

  5. UnityShader快速上手指南(三)

    简介 这一篇还是一些基本的shader操作:裁剪.透明和法向量的应用 (纠结了很久写不写这些,因为代码很简单,主要是些概念上的东西) 先来看下大概的效果图:(从左到右依次是裁剪,透明,加了法向量的透明 ...

  6. Windows 8 系统完全上手指南 - 非常详尽的 Win8 系统入门学习手册与使用技巧专题教程!

    每次当有新版本的操作系统发布的时候,市面上总会冒出各种从入门到精通类的学习书籍,这次最新的 Windows 8 也不例外!不过,今天给大家送上免费的大礼——<Windows 8 完全上手指南&g ...

  7. Resharper上手指南

    原文http://www.cnblogs.com/renji/archive/2007/12/11/resharper.html Resharper上手指南 我是visual studio的忠实用户, ...

  8. NewLife.XCode 上手指南2018版(二)增

    目录 NewLife.XCode 上手指南2018版(一)代码生成 NewLife.XCode 上手指南2018版(二)增 NewLife.XCode 上手指南2018版(三)查 NewLife.XC ...

  9. NewLife.XCode 上手指南2018版(一)代码生成

    目录 NewLife.XCode 上手指南2018版(一)代码生成 NewLife.XCode 上手指南2018版(二)增 NewLife.XCode 上手指南2018版(三)查 NewLife.XC ...

随机推荐

  1. (转)HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  2. C# Json序列化去掉k__BackingField问题的解决方案

    方案一: 如果是WebAPI,可以加入全局设置: GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettin ...

  3. 使用pycharm以及用pycharm句子切分调试

    c在D盘建立了个文件夹,然后把segment1.py文件放进去. 然后双击segment1,就自动用pycharm打开了.然后就可以运行和debug.之前最开始的时候我segment1.py文件放桌面 ...

  4. RFC-TCP

    RFC: 793 TRANSMISSION CONTROL PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION September 1981 ...

  5. Oracle优化网上常见的5个错误观点

    最近系统的研究了一下ORACLE SQL语句性能调优,在此大言不惭的得出一个观点——网上很多性能调优的结论都是错误的或者不周全的.现在的DBA大牛些都太低调了,不出来斧正一下,小弟来借这个机会吐槽一下 ...

  6. JavaScript 中回调地狱的今生前世

    1. 讲个笑话 JavaScript 是一门编程语言 2. 异步编程 JavaScript 由于某种原因是被设计为单线程的,同时由于 JavaScript 在设计之初是用于浏览器的 GUI 编程,这也 ...

  7. Kworkerd恶意挖矿分析

    转自:https://www.360zhijia.com/anquan/417114.html 0x01 快速特征排查 TOP显示CPU占用高,但是没有高占用的进程 存在与未知服务器13531端口建立 ...

  8. iOS10 11跳转系统设置等的URL收集

    Settings App-Prefs:root Settings -> About App-Prefs:root=General&path=About Settings -> Ac ...

  9. .net core使用配置文件

    .net core使用配置文件 在 .net core中,配置文件的读取是通过IConfiguration来提供的,程序集是Microsoft.Extensions.Configuration,对应的 ...

  10. 用R语言分析与预測员工离职

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/kMD8d5R/article/details/83542978 https://mmbiz.qpic ...