Linux ansible 服务

                  Linux ansible 服务

Ansible

  

运维工具的分类:

agent:基于专用的agent程序完成管理功能,puppet, func, zabbix, …

agentless:基于ssh服务完成管理,ansible, fabric, …

    使用agentless基于ssh服务管理时,最好使用ssh密钥对进行认证连接。

 

ansible架构:

Ansible Coreansible主架构;

Modules:模块;

Core Modules:核心(标准模块)

Customed Modules:自定义模块

Host Iventory:主机清单(要管理的主机);

Files:通过文件加载要管理的主机

CMDB:通过外部设备进行管理主机

PlayBooks:剧本;

Hosts

roles:定义要完成的任务功能

Connection Plugins:连接插件,连接至各被管控的主机,完成并发连接,ansible默认一次管控5台主机;

 

ansible特性:

模块化:调用特定的模块,完成特定的任务;

基于Python语言研发,由Paramiko, PyYAMLJinja2三个核心库实现;

部署简单:agentless基于ssh服务完成管理;

支持自定义模块,使用任意编程语言;

强大的playbook机制;

幂等性;

 

安装及程序环境:

程序:

 ansible

 ansible-playbook

 ansible-doc

配置文件:

  /etc/ansible/ansible.cfg

主机清单:

  /etc/ansible/hosts

插件目录:

      /usr/share/ansible_plugins/

 

ansible管理获取模块:

获取模块列表:ansible-doc -l

    获取模块列表帮助:ansible-doc -h

获取指定模块的使用帮助:ansible-doc -s MOD_NAME

 

基本使用入门:

ansible命令格式:

Usage: ansible <host-pattern> [options]  

常用选项:

-m MOD_NAME  -a MOD_ARGS

 

配置Host Inventory

/etc/ansible/hosts

[group_id]:配置主机清单组;

HOST_PATTERN1

HOST_PATTERN2

 

示例:

  ansible主机清单中定义服务组:

blob.png

blob.png

ansible常用模块:

ping:探测目标主机是否存活;

 示例:

blob.png

command模块:在远程主机执行命令;

shell模块:在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 ;

注意:commandshell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;

示例:

   在远端主机执行hostname命令:

blob.png

示例:

  在远程各个主机上创建分别创建centos用户:

blob.png

 为在各个远程主机上创建的centos用户设置密码:

blob.png

copy模块:拷贝文件到远端主机上:

  用法:

(1) 复制文件

-a "src=  dest=  "

(2) 给定内容生成文件

-a "content=  dest=  "

     content:直接给定内容;

     mode:设置权限;

其它参数:mode, owner, group, …

示例:

  拷贝content=remote  到各个远程被控主机websrvs组的/tmp/remote.ansible

  websrvs组中的主机:192.168.3.2  192.168.3.8

blob.png

blob.png

验证:copywebsrvs组主机其中192.168.3.2中的内容:

blob.png

file模块:设置文件属性

   用法:

state:定义文件目标状态;

absent:删除指定的文件;

director:创建目录;

link:定义链接文件;

(1) 创建目录:

  -a "path=  state=directory"

(2) 创建链接文件:

      -a "path=  src=  state=link"

(3) 删除文件:

 -a "path=  state=absent

      absent:缺席的;在此意为:删除;

示例:

 在远端主机上创建目录:

blob.png

在远端主机上删除创建的目录:

blob.png

在远端主机上创建链接文件:

blob.png

blob.png

验证远端主机上的link文件:

blob.png

fetch模块从远程某一台主机拉取文件;

blob.png

cron模块管理周期性任务计划  

    -a ""

minute=

hour=

day=

month=

weekday=

job=

name=

user=

state={present|absent}

示例:

  使用ansible给各远程主机设置周期性计划任务:

blob.png

  删除各远程主机上的周期性计划任务可以使用 state=absent

blob.png

blob.png

hostname模块管理远端主机的主机名

name=

示例:

为远端主机192.168.3.2主机设置hostname主机名:

blob.png

去远端主机192.168.3.2主机上验证主机名是否设置成功:

blob.png

yum模块:管理远程主机使用yum模块安装程序包:

   注意:在远端主机上需先配置好yum仓库;

    -a ""

(1) name=  安装所指定的服务程序包。

  state={present|latest} 默认为:present

      state=absent 删除指定的程序包。

conf_file

disable_gpg_check

disablerepo

list

name=

state

update_cache

示例:

 使用ansibleyum模块为远端主机安装最新版的httpd服务:

blob.png

service模块:管理远端主机服务`started'/`stopped' `restarted'

-a ""

name=

state=

started

stopped

restarted

enabled= 定义远端主机开机是否自启动;

runlevel= 定义远端主机在那些运行级别下可以开机自启动;

示例:

  使用ansible控制远程主机httpd服务启动,并设置为开机自启动:

blob.png

group模块:在远程主机上添加/删除组:

-a ""

name=

state=

system=

gid=

示例:

 使用ansible为各远程主机创建test组:

blob.png

使用ansible删除各远程主机上的test组:

blob.png

user模块:在远端主机上创建/删除用户:  

    -a ""

name= 指定要创建的用户名

group= 指定基本组

groups= 指定附加组

comment= 备注

uid=    指定uid

system=  指定为系统用户

shell= 指定新建用户使用的shell

expires= 指定过期时长

home=  指定家目录

示例:

  使用ansible为各个远端主机创建一个用户haha

blob.png

  使用ansible删除各个远端主机上的用户haha

blob.png

setup模块:从指定的远端主机上获取远端主机详细的配置参数:

示例:

  从远端主机192.168.3.2上获取详细的配置参数:

blob.png

YAMLYAML是一个人类易读的数据序列化格式设计的脚本语言。

YAML is a data serialization format designed for human readability and  interaction with scripting languages.

数据结构:

key:value

– item1

– item2

– item3

{name:jerry, age:21}

 

ansible-playbook

核心元素:

Tasks:任务,由模块定义的操作的列表;

Variables:变量

Templates:模板,即使用了模板语法的文本文件;

Handlers:由特定条件触发的Tasks

Roles:角色;

playbook的基础组件:

Hosts:运行指定任务的目标主机;

remote_user:在远程主机以哪个用户身份执行;

sudo_user:非管理员需要拥有sudo权限;

tasks:任务列表

模块,模块参数:

格式:

(1) action: module arguments

(2) module: arguments

 

ansible-playbook:用法

  Usage: ansible-playbook [options] playbook.yml

  options

-C, –check:测试playbook任务,但不真正的执行;

–list-hosts:列出playbook任务影响到的主机;

–list-tasks:列出playbook要执行的任务;

 

运行playbook,使用ansible-playbook命令

(1) 检测语法

ansible-playbook  –syntax-check  /path/to/playbook.yaml

(2) 测试运行

ansible-playbook -C /path/to/playbook.yaml

–list-hosts

–list-tasks

–list-tags

(3) 运行

ansible-playbook  /path/to/playbook.yaml

-t TAGS, –tags=TAGS 指明要运行的任务标签

–skip-tags=SKIP_TAGS 指明要跳过的任务标签

–start-at-task=START_AT 指明要从哪个任务标签开始运行

blob.png

blob.png

示例:

 定义一个playbook,创建用户和组及安装htpd服务并启动:

blob.png

blob.png

检查playbook user.yaml剧本语法:

blob.png

为远端主机192.168.3.7安装httpd服务,复制配置文件并启动服务:

注:提供的配置文件监听的端口为:8080

blob.png

blob.png

handlers:由特定条件触发的Tasks

调用及定义方式:

tasks

– name: TASK_NAME

 module: arguments

 notify: HANDLER_NAME

handlers:

– name: HANDLER_NAME

 module: arguments

示例:

  在复制一份httpd服务监听80端口的主配置文件到远端主机192.168.3.2上,然后使其触发handlers

blob.png

blob.png

或执行reload服务:

blob.png

blob.png

测试:

blob.png

测试:

blob.png

tags:给指定的任务定义一个调用标识;

– name: NAME

 module: arguments

 tags: TAG_ID

多个任务可以使用同一个标签;

执行时也可以一次调用多个任务;

示例:

blob.png

blob.png

指明要在远端主机上要执行的任务标签:

blob.png

Variables

类型:

内建:

(1) facts

自定义:

(1) 命令行传递;

-e VAR=VALUE

(2) hosts Inventory中为每个主机定义专用变量值;

   (a) 向不同的主机传递不同的变量 ;

IP/HOSTNAME variable_name=value

(b) 向组内的所有主机传递相同的变量 ;

[groupname:vars]

variable_name=value

(3) playbook中定义

vars:

– var_name: value

– var_name: value

注意:variables变量在host inventoryplaybook中都可以定义。

   

           (4) Inventory还可以使用参数:

用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量;

ansible_ssh_host

ansible_ssh_port

ansible_ssh_user

ansible_ssh_pass

ansible_sudo_pass

    …

          (5) 在角色调用时传递参数

roles:

–  { role: ROLE_NAME, var: value, …}

示例:

blob.png

变量调用:

   {{ var_name }}

 

示例:

  playbook中定义变量名安装vsftpd服务:

blob.png

blob.png

这时我们可以使用命令行给playbook中的pkgname变量传递变量值,让其在远端主机上安装vsftpd服务:

blob.png

注意:命令行 -e 选项给定的变量名变量值要比playbook中给定的变量名变量值要优先使用。

我们也可以在playbook中定义变量名和变量名来安装vsftpd服务:

blob.png

blob.png

示例:

 hosts Inventory中为每个主机定义专用变量值:

blob.png

blob.png

或者向组内的所有主机传递相同的变量

blob.png

blob.png

playbook中定义任务:

blob.png

blob.png

Templates:模板

文本文件,内部嵌套有模板语言脚本(使用模板语言编写)

 

 注意:此模板不能在命令行使用,而只能用于playbook

 

Jinja2 is a template engine written in pure Python.  It provides a  Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.

  语法:

字面量:

字符串:使用单引号或双引号;

数字:整数、浮点数;

列表:[item1, item2, …]

元组:(item1, item2, …)

字典:{key1:value1, key2:value2, …}

布尔型:true/false

 

算术运算

+, -, *, /, //, %, **

 

比较操作:

==, !=, >, <, >=, <=

逻辑运算:and, or, not

执行模板文件中的脚本,并生成结果数据流,需要使用template模块;

template

-a ”“

src=

dest=

mode=

onwer=

group=

 

示例:

  使用template模板为websrvs组的远端主机安装配置nginx服务:

 1)拷贝本机ansible上的nginx.conf的主配置文件到/root目录下并制定后缀名为j2

blob.png

 2)编辑/root/nginx.conf.j2 文件,使nginxworker_processes进程调用ansiblecpu个数内键变量来生成worker进程数:

blob.png

blob.png

3)编辑ansiblehost inventory配置文件 :

blob.png

blob.png

4)编辑playbook

blob.png

blob.png

注意:此playbook需要在远端主机上的/root目录下先准备好rpm格式的软件包。如果没有可以使用wget下载。

测试:

blob.png

blob.png

blob.png

when条件测试:

     when语句:在tasks中使用,Jinja2的语法格式;

  示例:

条件测试centos6centos7 nginx服务启动:

编写playbook

blob.png

blob.png

循环:迭代,需要重复执行的任务;

   对迭代项的引用,固定变量名为"item”,使用with_items属性给定要迭代的元素;

   元素:列表

         字符串

         字典

示例:

  基于字符串列表给出元素,安装服务:

blob.png

blob.png

示例:

  基于字典列表给出元素,创建用户和组:

blob.png

blob.png

删除用户和组:

blob.png

blob.png

roles角色:

以特定的层级目录结构进行组织的tasksvarshandlerstemplatesfiles等;

role_name/

files/:存储由copyscript等模块调用的文件;

tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;

handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;

vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;

templates/:存储由template模块调用的模板文本;

meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;

default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

 

playbook中调用角色的方法:

  – hosts: HOSTS

  remote_user: USERNAME

  roles:

  – ROLE1

  – ROLE2

 -{ role: ROLE3, VARIABLE: VALUE, …}

 – { role: ROLE4, when: CONDITION }

 

实验测试nginx使用角色调用:

 

/etc/ansible/roles目录下创建特定的目录角色(roles):

blob.png

blob.png

拷贝nginx安装包到/etc/ansible/nginx/file/目录下:

blob.png

拷贝ansible本机nginx的主配置模板和默认配置模板到/etc/ansible/roles/nginx/templates/目录下并添加后缀名为XXXX.j2

blob.png

blob.png

更改nginx模板的主配置文件

blob.png

blob.png

更改nginx的模板默认配置文件:

blob.png

blob.png

编辑/etc/ansible/roles/nginx/tasks/main.yml文件:

tasks任务中定义了,拷贝nginx安装包到远程主机、定义了在远程主机上安装nginx程序包、定义了拷贝ansible主机上的nginx主配置文件和默认配置文件的template模板文件到远程主机上、定义了在远程主机上启动nginx服务并开机自启动。

blob.png

blob.png

编辑/etc/ansible/roles/nginx/handlers/main.yml文件:

blob.png

blob.png

编辑/etc/ansible/roles/nginx/vars/main.yml

blob.png

blob.png

playbook中调用nginx角色:

blob.png

blob.png

测试/etc/ansible/nginx.yml语法:

blob.png

测试:

blob.png

blob.png

playbook使用字典调用nginx角色:

blob.png

blob.png

原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/60052

(0)
上一篇 2016-11-18 23:50
下一篇 2016-11-19 01:06

相关推荐

  • 关于 文本处理工具、正则表达式、grep 的简单举例

                              文本处理工具 抽取文本的工具 文件内容:less和cat 文件截取:head和tail 按列抽取:cut 按关键字抽取:grep 文件查看命令:cat,tac,rev cat […

    系统运维 2016-08-08
  • 基于Cobbler实现多版本操作系统自动部署

    前言     在生产环境中,当需要批量部署几十甚至上百台服务器时,实现自动化安装操作系统尤为重要,按照传统的光盘引导安装是不可想象的;此前我们通过pxe+kickstart简单实现了自动化安装,但只能实现单一版本安装,当需要部署不同版本或不同引导模式(BIOS、EFI)时,此种方式就不够灵活。而Cobbler正是为了解…

    Linux干货 2015-08-11
  • PHP安全模式详解(PHP5.4安全模式将消失)

    1. 安全模式      一直没有用过php的safe_mode安全模式,以此说明作为日后参考。      PHP 的安全模式是为了试图解决共享服务器(shared-server)安全问题而设立的。在结构上,试图在 PHP 层上解决这个问题是不合理的,但修改 web 服务器层和操作系统层显得非常不现…

    Linux干货 2015-06-02
  • linux上安全软件SElinux

    selinux简介 SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的 实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的 任务中所需要文件。SELinux 默认安装在 Fedora 和 Red …

    系统运维 2016-09-19
  • Linux LVM

    Linux LVM 前言     LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,目前最新版本为:稳定版1.0.5,开发版 1.1.0-rc2,以及LVM2开发版。无论在Linux或者其他类似…

    系统运维 2016-04-24
  • NFS(Network File System)介绍与应用(双httpd + php-fpm + nfs + mysql 搭建discuz论坛)

    NFS相关介绍 一、NFS简介     1. NFS(Network File System): NFS是一个文件共享协议, 也是是在类Unix系统中在内核中实现的文件系统。      2. 起源: 最早是由SUN公司研发,非常古老,只是实现文件共享,安全控制方面比较简…

    Linux干货 2015-07-21