1、初步介绍

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

在管理服务器的时候对于数量较少的时候还比较轻松。但是如果一旦服务器数量过多那么管理就会很吃力。而ansible的出现能够很好的满足需能够很好解决问题。

2、进一步解析ansible

2.1、结构图如下

wKiom1ZoB6XTgQNgAABmZFt4cNs128.png

 


2.2、对于ANSIBLE来说需要在服务器上进行部署想关进程才能对其划分的服务器进行管理。

而安装程序需要的安装有如下几个

[root@localhost ~]# rpm -qa ansible

ansible-1.9.2-1.el7.noarch

如果是手动编译安装需要解决其依赖关系其需要的依赖包如下

python-jinja2 

PyYAML 

python-paramiko 

python-babel 

python-crypto

2.3、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.4、对于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.5、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 ~]# 

3、ansible具体介绍

3.1、对其主配置文件进行说明

[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.2、对于ansible而言除了能够单个命令执行还可以定义剧本一次执行。

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

1、Setup

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

Ansible  HOSTS  -m setup

2、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'

3、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

4、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中即可。

5、group 用户组管理

      gid         指定用户组GUD

      name=      指定用户组名

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

      system     创建用户组

6、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 '

7、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'

8、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'

 

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

1、对于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 ~]# 

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

对于每个角色都需要上面定义的每个目录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及其以后的版本才支持

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

4、补充的部分

tasks中的main.yml中还以使用很多的命令几乎ansible能操作的命令都能在其中定义

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

- name: add system users

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

  with_items:

     - test1

     - test2

5、剧本定义完成之后就可以去执行剧本犹如演绎出话剧一样

[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