Linux服务之ansible自动化

一、初步介绍node

Ansible是一个完全的简单的配置管理、应用部署、任务执行和多节点编制引擎。设计原则有一个死去的简单的安装过程和最小的学习曲线是很是快和并行默认不须要服务器或客户端守护进程,使用现有的SSHd使用一种语言,是机器和人类友好容易专一于安全审核/审查/修改的内容当即管理远程机器,没有在任何动态语言引导容许模块开发,不只Python做为非根可用最简单的自动化系统使用python

在管理服务器的时候对于数量较少的时候还比较轻松。可是若是一旦服务器数量过多那么管理就会很吃力。而ansible的出现可以很好的知足需可以很好解决问题。nginx

二、进一步解析ansibleshell

2.一、结构图以下vim

wKiom1ZoB6XTgQNgAABmZFt4cNs128.png

 


2.二、对于ANSIBLE来讲须要在服务器上进行部署想关进程才能对其划分的服务器进行管理。centos

而安装程序须要的安装有以下几个安全

[root@localhost ~]# rpm -qa ansible服务器

ansible-1.9.2-1.el7.noarchbabel

若是是手动编译安装须要解决其依赖关系其须要的依赖包以下网络

python-jinja2 

PyYAML 

python-paramiko 

python-babel 

python-crypto

2.三、ANSIBLE主要的一些配置文件

[root@localhost ~]# rpm -ql ansible | less

/etc/ansible

/etc/ansible/ansible.cfg——ansible主配置文件

/etc/ansible/hosts——定义须要的控制服务器的ip地址或者服务器名

/etc/ansible/roles——定义须要角色

/usr/bin/ansible-doc——ansible须要的帮助文档

/usr/bin/ansible-playbook——执行剧本

/usr/bin/ansible-vault——ansible库文件

对于ansible而言全部的配置文件都在ansible目录下面。

2.四、对于ansible而言在操做以前须要事先配置ansible端能基于密钥认证的方式联系各被管理节点。以下的操做

[root@wp ~]# ssh-keygen ——对于弹出来的界面回车到结束便可

[root@wp ~]# ssh-copy-id -i  ~/.ssh/id_rsa  root@172.16.17.1

[root@wp ~]# ssh-copy-id -i  ~/.ssh/id_rsa  root@172.16.17.22

把全部的须要管理的服务器统一添加都群组中去。

2.五、ansible简单的操做以下

 ansible <host-pattern> [-f forks] [-m module_name] [-a args]

[root@localhost ~]# ansible-doc -s

Usage: ansible-doc [options] [module...]

Options:

  -h, --help            show this help message and exit

  -l, --list            List available modules

  -s, --snippet         Show playbook snippet for specified module(s)

  -v                    Show version number and exit

[root@localhost ~]# 

三、ansible具体介绍

3.一、对其主配置文件进行说明

[root@node1 ~]# vim /etc/ansible/ansible.cfg 

[defaults]

inventory      = /etc/ansible/hosts——默认用户存放文件

#library        = /usr/share/my_modules/——ansible默认模块

remote_tmp     = $HOME/.ansible/tmp

pattern        = *——全局匹配

forks          = 5——分叉五次

poll_interval  = 1——投票间隔

sudo_user      = root——默认以root用户设置

#remote_port    = 22——默认远程端口

sudo_exe = sudo——以sudo的方式执行执行权限

timeout = 10——ssh链接超时10s

 

[root@localhost ~]# vim /etc/ansible/hosts 

[keep]定义ansible

172.16.17.1

172.16.17.3

[httpd]

172.16.17.4

172.16.17.5

3.二、对于ansible而言除了可以单个命令执行还能够定义剧本一次执行。

第二部分、接下说说ansible经常使用模块

一、Setup

收集远程主机的服务器的基本信息

Ansible  HOSTS  -m setup

二、File 设置文件的一些经常使用属性

[root@localhost ~]# ansible-doc -s  file

force须要在两种状况下强制建立软连接一种是源文件不存在但以后会创建的状况下另外一种是目标软连接已存在,须要先取消以前的软链而后建立新的软链有两个选项yes|no

group定义文件/目录的属组

mode定义文件/目录的权限

owner定义文件/目录的属主

path必选项定义文件/目录的路径

recurse递归的设置文件的属性只对目录有效

src要被连接的源文件的路径只应用于state=link的状况

dest被连接到的路径只应用于state=link的状况

state指定须要实现的状态状态有以下的这些

directory若是目录不存在建立目录

file即便文件不存在也不会被建立

link建立软连接

hard建立硬连接

touch若是文件不存在则会建立一个新的文件若是文件或目录已存在则更新其最后修改时间

absent删除目录、文件或者取消连接文件

例子

     ansible nginx -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link'

     ansible nginx -m file -a 'path=/tmp/test.sh state=touch'

     ansible nginx -m shell -a 'echo "hell world" > /tmp/test.sh'

     ansible nginx -m file -a 'path=/tmp/test1 state=directory mode=744'

三、command 在控制的服务器中执行命令

      chdir       # 在运行某个目录下的命令以前先切换到目录下

      creates     # 若是建立的文件存在即退出不建立

      executable  # 以shell的方式执行命令可是须要时绝对路径的前提下

      removes    # 移除某个文件可是若是不存在就不执行

 例子

[root@localhost ~]# ansible nginx -m command -a 'date'

172.16.17.1 | success | rc=0 >>

Thu Oct 22 00:51:39 CST 2015

172.16.17.22 | success | rc=0 >>

Thu Oct 22 00:51:39 CST 2015

四、user   添加用户

[root@localhost ~]# ansible-doc -s user

      createhome    除非设置为“不”,一个主目录将为用户建立帐户时或者主目录不存在。

      force         当状态 为absent就如使用 `userdel --force'同样

      generate_ssh_key  是否产生问题中的用户的SSH密钥。这将不会覆盖现有的SSH密钥。                                   

      groups       列出全部用户组当 groups=空的时候把附加组都删除

      home        给用户建立家目录

      move_home  修改用户的家目录

      name=       建立删除修改时候须要的指定用户  

      password     给用户添加一个秘密

      remove      删除用户至关于`state=absent', 

      shell         指定拥护采用的shell格式   

      state        不管该账户是否存在若是该状态与所述状态不一样则采起行动。

      system      建立系统用户

      uid         指定拥护UID

      update_password     更改秘密

须要特别说明的是password后面指定的密码不能是明文后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中而登录的时候输入的密码会被hash加密之后再去与/etc/shadow中存放的密码去作对比会出现不一致的现象。因此须要先将密码字符串进行加密处理openssl passwd -salt -1 "123456"而后将获得的字符串放到password中便可。

五、group 用户组管理

      gid         指定用户组GUD

      name=      指定用户组名

      state        该组是否应该在远程主机上

      system     建立用户组

六、cron 远程客户端执行任务计划

      backup      在建立新的crontab任务以前对其以前建立的进行备份

      cron_file     若是肯定使用这个文件使用使用cronD而不是单个用户的crontab

      day         # Day of the month the job should run ( 1-31, *, */2, etc )

      hour        # Hour when the job should run ( 0-23, *, */2, etc )

      job         # The command to execute. Required if state=present.

      minute      # Minute when the job should run ( 0-59, *, */2, etc )

      month      # Month of the year the job should run ( 1-12, *, */2, etc )

      name=      # Description of a crontab entry.

      state        # Whether to ensure the job is present or absent.

      user        # The specific user whose crontab should be modified.

      weekday    # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )

例子

[root@wp ~]# ansible all -m cron -a 'name="sync time from ntpserver"state=present minute=*/3 job="/bin/cat /etc/issue &> /dev/null"'

[root@wp ~]# ansible all -m cron -a 'name="sync time from ntpserver"state=absent '

七、copy 复制文件

     复制文件到远程主机

copy模块包含以下选项

backup在覆盖以前将原文件备份备份文件包含时间信息。有两个选项yes|no

content用于替代"src",能够直接设定指定文件的值

dest必选项。要将源文件复制到的远程主机的绝对路径若是源文件是一个目录那么该路径也必须是个目录

directory_mode递归的设定目录的权限默认为系统默认权限

force若是目标主机包含该文件但内容不一样若是设置为yes则强制覆盖若是为no则只有当目标主机的目标位置不存在该文件时才复制。默认为yes

others全部的file模块里的选项均可以在这里使用

src要复制到远程主机的文件在本地的地址能够是绝对路径也能够是相对路径。若是路径是一个目录它将递归复制。在这种状况下若是路径使用"/"来结尾则只复制目录里的内容若是没有使用"/"来结尾则包含目录在内的整个内容所有复制相似于rsync

示例

ansible test -m copy -a "src=/etc/issue  dest=/tmp/issue  owner=root group=root mode=0644"

ansible nginx -m copy -a 'src=/etc/issue dest=/tmp/issue backup=yes'

八、ping 测试网络使用的

[root@localhost ~]# ansible nginx  -m ping   

172.16.17.1 | success >> {

    "changed": false, 

    "ping": "pong"

}

172.16.17.22 | success >> {

    "changed": false, 

    "ping": "pong"

}

9.shell

切换到某个shell执行指定的指令参数与command相同。

示例

ansible test -m shell -a "somescript.sh >> somelog.txt"

 

10.service

用于管理服务

该模块包含以下选项

arguments给命令行提供一些选项

enabled是否开机启动 yes|no

name必选项服务名称

pattern定义一个模式若是经过status指令来查看服务的状态时没有响应就会经过ps指令在进程中根据该模式进行查找若是匹配到则认为该服务依然在运行

runlevel运行级别

sleep若是执行了restarted在则stopstart之间沉睡几秒钟

state对当前服务执行启动中止、重启、从新加载等操做started,stopped,restarted,reloaded

示例

ansible test -m service -a "name=httpd state=started enabled=yes"

ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started"

ansible test -m service -a "name=network state=restarted args=eth0"

11.filesystem

在块设备上建立文件系统

选项

dev目标块设备

force在一个已有文件系统的设备上强制建立

fstype文件系统的类型

opts传递给mkfs命令的选项

12.yum

使用yum包管理器来管理软件包

选项

config_fileyum的配置文件

disable_gpg_check关闭gpg_check

disablerepo不启用某个源

enablerepo启用某个源

list

name要进行操做的软件包的名字也能够传递一个url或者一个本地的rpm包的路径

state状态presentabsentlatest

示例

ansible test -m yum -a 'name=httpd state=latest'

ansible test -m yum -a 'name="@Development tools" state=present'

ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'

13.mount

配置挂载点

选项

dump

fstype必选项挂载文件的类型

name必选项挂载点

opts传递给mount命令的参数

passno

src必选项要挂载的文件

state必选项

present只处理fstab中的配置

absent删除挂载点

mounted自动建立挂载点并挂载之

umounted卸载

示例

name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present

name=/srv/disk src='LABEL=SOME_LABEL' state=present

name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present

 

ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'

ansible test -a 'losetup /dev/loop0 /disk.img'

ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'

ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'

 

第三部分创建一个完整的剧本

一、对于ansible来讲有点像现实生活中的编剧同样。可以为定义好须要的各类角色每一个角色在所须要的环境中所扮演的的角色及其做用范围。先说明下一个ansible剧本所须要的剧本以及须要执行的动做

[root@node1 ~]# tree ansible_playbook/

ansible_playbook/——首先须要给整个剧本一个剧本名称而这个就是剧本的名字

├── pcsd.yml——指定扮演角色的身份及其执行前后顺序

└── roles——建立管理全部角色的目录

    ├── pacemaker——建立角色一的目录其中可以定义相对角色可以执行的命令

    │   ├── files——存放一些能够在全部可以扮演相对角色能复制执行的脚步目录

    │   ├── handlers——存放须要可以重启的文件地

    │   ├── meta

    │   ├── tasks——这个目录是最终要的目录定义角色须要现实的功能以下

    │      └── main.yml——

    │   ├── templates——定义模板的目录可以在定义全部的host中实现

    │   └── vars——定义角色锁所能使用的变量

    └── synctime

        ├── files

        ├── handlers

        ├── meta

        ├── tasks

        │   └── main.yml

        ├── templates

        └── vars

[root@node1 ~]# 

二、对单个角色进行分析说明

对于每一个角色都须要上面定义的每一个目录fileshandlerstemplatestasksvarsmeta

Handers此目录中应当包含一个main.yml文件用于定义此角色用到的各handlerhandler中使用include包含的其它的handler文件也应该位于此目录中

Tasks此目录至少应该包含一个名为main.yml的文件其定义了此角色的任务列表此文件可使用include包含其它的位于此目录中的task文件

Files对于此目录来讲主要存放可以copy及其script执行的文件

Templates此目录定义template模块可以调用的模板此目录中的文件以jinjia2格式定义

vars目录应当包含一个main.yml文件用于定义此角色用到的变量

meta目录应当包含一个main.yml文件用于定义此角色的特殊设定及其依赖关系ansible 1.3及其之后的版本才支持

三、对于一个角色所能扮演的功能进行说明

对于handers来讲须要包含一个main.yml文件主要定义的以下

[root@localhost ansible_playbook]# cat roles/keepalived/handlers/main.yml 

- name: restart keepalived相对于来讲- name只是书写的方式是固定的格式主要做用在于标明须要执行的程序名称及其所要执行的动做

  service: name=keepalived state=restarted此命令才是真正可以执行的动做

[root@localhost ansible_playbook]# 

 

对于tasks来讲主要是用来定义当前角色所可以执行的动做以下

[root@localhost ansible_playbook]# cat roles/keepalived/tasks/main.yml 

- name: install keepalived——对于name来讲在ansible中是启动一个标识的做用不会被执行。而跟在name下面的命令才会被执行

  yum: name=keepalived state=present——经过yum进行安装程序

- name: template configure file——

  template: src=keepalived.conf.j1 dest=/etc/keepalived/keepalived.conf——定义须要执行的模板及其模板在相对于客户户端可以生成的文件

  when: ansible_nodename ==  'node3.dns.com'——相对于ansible而言还可以在执行剧本的时候进行必定程度上的判断来对管理主机进行分别的管理

  tags: conffile——标明当配置文件若是没有发生改变即跳过执行

  notify: ——通告

  - restart keepalived——可以执行相对管理主机上的对于服务须要重启

- name: template configure file

  template: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.conf

  when: ansible_nodename ==  'node1.dns.com'

  tags: conffile

  notify: 

  - restart keepalived

- name: start keepalived service

  service: name=keepalived state=started

四、补充的部分

tasks中的main.yml中还以使用不少的命令几乎ansible能操做的命令都能在其中定义

当有须要重复性执行的任务时可使用迭代机制。其使用格式为将须要迭代的内容定义为item变量引用并经过with_items语句来指明迭代的元素列表便可。

- name: add system users

  user: name={{ item }} state=present groups=test

  with_items:

     - test1

     - test2

五、剧本定义完成以后就能够去执行剧本犹如演绎出话剧同样

[root@wp ansible_playbook]# ansible-palybook  keepalived.yml 

PLAY [keepalived] ************************************************************* 

GATHERING FACTS *************************************************************** 

[0;32mok: [172.16.17.3][0m

[0;32mok: [172.16.17.1][0m

TASK: [synctime | sync time from 172.16.0.1] ********************************** 

[0;32mok: [172.16.17.1][0m

[0;32mok: [172.16.17.3][0m

TASK: [keepalived | install keepalived] *************************************** 

[0;32mok: [172.16.17.3][0m

[0;32mok: [172.16.17.1][0m

TASK: [keepalived | template configure file] ********************************** 

[0;36mskipping: [172.16.17.1][0m

[0;36mskipping: [172.16.17.3][0m

TASK: [keepalived | template configure file] ********************************** 

[0;36mskipping: [172.16.17.1][0m

[0;36mskipping: [172.16.17.3][0m

TASK: [keepalived | start keepalived service] ********************************* 

[0;32mok: [172.16.17.3][0m

[0;32mok: [172.16.17.1][0m

PLAY RECAP ******************************************************************** 

  changed=4    unreachable=0    failed=0   

  changed=4    unreachable=0    failed=0   

相关文章
相关标签/搜索