ansible源码系列一ansible介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LIUSHU427/article/details/89092787

简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppetcfenginecheffuncfabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

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

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

     (3)各种核心模块、command模块shell模块;

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

     (5)playbook:可以通过该模块实现复杂任务流程

     (6)、自定义模块


安装

Ansible 中文指南:http://www.ansible.com.cn/docs/intro.html

配置PPA及安装ansible,执行如下命令:

   $ sudo apt-get install software-properties-common

   $ sudo apt-add-repository ppa:ansible/ansible

   $ sudo apt-get update

   $ sudo apt-get install ansible


ad-hoc

Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook.前者可以解决一些简单的任务, 后者解决较复杂的任务.

    执行命令:

    ansible <host group> -m <module_name>  -a “<commond>” <params>

    ansible是基于模块的,所有功能都是通过相应的模块来提供的,执行命令默认的是command模块

    command 模块不支持 shell 变量,也不支持管道等 shell 相关的东西.如果你想使用 shell相关的这些东西

    ansible test -m shell -a 'echo $TERM‘

    如果想复制文件到远程主机可以通过copy模块

    ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"


Playbooks

相对于ad-hocplaybooks可以处理更复杂处理流程

    playbook是将多个task串联成起来,并且可以根据每个task处理结果作不同处理,语法格式是YAML

    每个play可以包括vars,tasks,handlers

            vars:一个参数列表,可以在tasks,handlers引用

            tasks:任务列表,任务是按照从上到下顺序执行的

            handlers:在发生改变执行的操作

示例:

modules 具有”幂等”性,意思是如果你再一次地执行 moudle,moudle 只会执行必要的改动,只会改变需要改变的地方.所以重复多次执行 playbook 也很安全.


Handlers

Handlers就在每个task处理完之后执行,可以通过notify注册事件

比如:

即使多个task通知了相同的事件,handler也只会触发一次。

        Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别.Handlers 是由通知者进行 notify, 如果没有被 notify,handlers 不会执行.不管有多少个通知者进行了 notify,等到 play 中的所有 task 执行完成之后,handlers 也只会被执行一次.

这里是一个 handlers 的示例:


Facts

Facts通过访问远程系统获取相应的信息. 一个例子就是远程主机的IP地址或者操作系统是什么. 使用以下命令可以查看哪些信息是可用的:

    ansible hostname -m setup

Facts会返回巨量的远端系统的信息,这些信息都可以在playbook里直接使用,类似于变量。

比如:

 {{ ansible_devices.sda.model }}

如果不需要远程主机的信息可以关闭facts(默认是开户的),如下命令:

-hosts: whatever

     gather_facts: no


vars 优先级

extra vars (-e in the command line) always win

then comes connection variables defined in inventory (ansible_ssh_user, etc)

then comes "most everything else" (command line switches, vars in play, included vars, role vars, etc)

then comes the rest of the variables defined in inventory

then comes facts discovered about a system

then "role defaults", which are the most "defaulty" and lose in priority to everything.

extra vars (在命令行中使用 -e)优先级最高

然后是在inventory中定义的连接变量(比如ansible_ssh_user)

接着是大多数的其它变量(命令行转换,play中的变量,included的变量,role中的变量等)

然后是在inventory定义的其它变量

然后是由系统发现的facts

然后"role默认变量", 这个是最默认的值,很容易丧失优先权


When语句:

     在我只想在特定条件才想执行的task可以用when过滤

 eg:

当然也可以根据执行过的task结果作为条件


循环:

Ansible提供循环可以在一个任务里执行一组事情,比如创建一组用户,安装很多包,删除特定文件。Ansible循环分很种,也支持自定义的循环。

介绍几种常用的循环

标准循环:

哈希循环:

还有一些其它循环:嵌套循环、文件列表循环、子元素循环、随机选择等,都可以在官方文档里找到资料


Roles:

Roles 基于一个已知的文件结构,去自动的加载某些 vars_filestasks handler。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles

一个 playbook 如下:

---

   - hosts: webservers

     roles:

     - common

     - webservers

这个 playbook 为一个角色 ‘x’ 指定了如下的行为:

如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play

如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play

如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play

如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)

所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。

所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。

所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。

所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。


Ansible Galaxy

https://galaxy.ansible.com/ 提供了一些由社区开发的roles

对于我们做项目是一个很好的参考。

安装一个第三方的role非常简单,只需要执行下面的命令:

$ ansible-galaxy install username.rolename

比如安装一下usernamebinarycode,roleopenstack-keystonerole可以执行以下命令: 

$ ansible-galaxy install binarycode.openstack-keystone

猜你喜欢

转载自blog.csdn.net/LIUSHU427/article/details/89092787