一、初步介绍node
Ansible是一个完全的简单的配置管理、应用部署、任务执行和多节点编制引擎。设计原则有一个死去的简单的安装过程和最小的学习曲线是很是快和并行默认不须要服务器或客户端守护进程,使用现有的SSHd使用一种语言,是机器和人类友好容易专一于安全审核/审查/修改的内容当即管理远程机器,没有在任何动态语言引导容许模块开发,不只Python做为非根可用最简单的自动化系统使用。python
在管理服务器的时候对于数量较少的时候还比较轻松。可是若是一旦服务器数量过多那么管理就会很吃力。而ansible的出现可以很好的知足需可以很好解决问题。nginx
二、进一步解析ansibleshell
2.一、结构图以下vim
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 若是肯定使用这个文件使用使用cron。D而不是单个用户的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在则stop和start之间沉睡几秒钟
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文件用于定义此角色用到的各handler在handler中使用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