马哥出品 ansible中文文档:http://www.ansible.com.cn/index.htmlhtml
ansible介绍:python
ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT运维管理工具。这个工具的目标有这么几项:让咱们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。基于Python开发,可实现对多台服务器进行批量配置、程序的部署及指令的运行。大大减小了在运维工程中的工做量。mysql
ansible是基于模块工做的,自己没有批量部署的能力。真正具备批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:sql
(1)、链接插件connection plugins:负责和被监控端实现通讯;shell
(2)、host inventory:指定操做的主机,是一个配置文件里面定义监控的主机;apache
(3)、各类模块核心模块、command模块、自定义模块;json
(4)、借助于插件完成记录日志邮件等功能;centos
(5)、playbook:剧本执行多个任务时,非必需可让节点一次性运行多个任务。安全
ansible特色:
服务器
1.简单,ansible天然的自动化语言与容许运维人员,开发者,和IT管理人员在很短的时间内完成自动化项目。
2.无代理,默认使用SSH而不须要客户端。避免了额外的端口开启,提升安全性,避免没必要要的管理,减小CPU的使用
3.干的活多,ansible能干自动完成软件部署,配置管理,流程化管理,和cloud provisioning。
ansible安装:
因为ansible是用python开发的,安装过程当中依赖众多python模块,这里建议yum安装ansible,想要更新版本的可下载源码编译安装,
yum install ansible -y
yum安装ansible的默认配置文件路径,ansible.cfg是ansible的主配置文件,
ansible]# ls /etc/ansible/
ansible.cfg hosts roles
hosts是默认的hostfile路径,可配置DNS域名,ip。
经过ssh key方式链接远端客户机,省去密码环节
ssh-keygen -t rsa -P ''
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.137.130
注意这个地方是有个坑的,因为ansible执行的时候须要把临时模块拷贝到客户端,而默认的拷贝方式是经过sftp来的方式拷贝的,若是你的客户端没有装sftp,那么执行ansible会出错的。
若是没装sftp能够用scp。 下面的这一行原本是注释起来的,把注释去掉就OK了
ansible]# grep "scp_if_ssh" /etc/ansible/ansible.cfg
scp_if_ssh = True
还有个坑,即便装了sftp也不必定能用,你的ssh要启用它才OK。
ansible]# grep "Subsystem" /etc/ssh/sshd_config
Subsystem sftp /usr/lib/openssh/sftp-server
ansible的基本工做流程:
1.ansible经过OPENSSH或者python的pramamiko链接客户端
2.把ansible module推送到客户端。
ansible]# grep "remote_tmp" /etc/ansible/ansible.cfg
remote_tmp = $HOME/.ansible/tmp
ansible]# ansible one -a "ls ~/.ansible"
salt-master | success | rc=0 >>
tmp
3.经过ssh执行客户端上的ansible module
4.执行完毕
5.删除刚刚推送过去的ansible module
ansible基本命令行模块:
ansible-doc -s 模块名 ##查看模块用法帮助
ansible-doc -l ##查看有哪些可用模块
1.临时作小事情或一次性行为可用命令行,大型或常常重复使用的活用play-book
2.命令行三剑客:command(默认),shell(支持管道,变量,),raw(客户机不能装python时使用)
3.官方建议用command,shell和raw须要用到的时候再用
command:命令模块,默认模块,用于远程执行命令
-a 'COMMAND'
ansible]# grep -n "module_name" ansible.cfg
97:#module_name = command
ansible all -a 'date'
user:
-a 'name= state={present|absent} system= uid='
# ansible one -m user -a 'name=mysql uid=306 system=yes group=mysql'
# ansible one -m user -a 'name=mysql shell=/sbin/nologin createhome=no'
group:
-a 'name= gid= state= system='
# ansible one -m group -a 'name=mysql gid=306 system=yes'
cron:修改定时任务
-a 'name="" minute= hour= day= month= weekday= job= user= state='
state状态
present:增长
absent:删除,配置name就可移除
# ansible one -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'
copy:复制文件到远程主机
-a 'dest= src= mode= owner= group='
src=:定义本地源文件路径
dest=:定义远程目标文件路径
content=:取代src=,表示直接用此处指定的信息生成目标文件内容;
# ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=/root mode=640'
# ansible all -m copy -a 'content="Hello Ansible\nHi MageEdu" dest=/tmp/test.ansible'
file:设定文件属性
-a 'path= mode= owner= group= state={directory|link|present|absent} src='
path=:指定文件路径,可使用name或dest来替换
建立文件的符号连接
src=:指明源文件
path=:指明符号连接文件路径
# ansible all -m file -a 'path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'
# ansible all -m file -a "path=/tmp/resolv.conf state=absent"
# ansible salt-master -m file -a 'dest=/tmp/ansible.log owner=lixc group=lixc mode=644
state=touch' #touch:远程主机建立文件
force:须要在两种状况下强制建立软连接,
一种是源文件不存在,但以后会创建的状况下;
另外一种是目标软连接已存在,须要先取消以前的软链,而后建立新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被连接的源文件路径,只应用于state=link的状况
dest:被连接到的路径,只应用于state=link的状况
state:
directory:建立递归文件,若是目录不存在,就建立目录,
file:即便文件不存在,也不会被建立
link:建立软连接
hard:建立硬连接
touch:若是文件不存在,则建立一个新的文件,若是文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消连接文件
ping:测试指定主机可否链接
yum:安装程序包
-a 'name= state={present|latest|absent}'
name:指明要安装的程序包,能够带上版本号
state=:present,latest表示安装,absent表示卸载
# ansible one -m yum -a 'name=mysql-server state=latest|installed'
还有一个后台执行的功能。
-B 30是设置后台执行时间为30秒,
-P2是没两秒钟报告一次状态,这个当你的任务要执行很长时间的时候能够用。
# ansible one -m yum -a 'name=apache2 state=installed' -B 30 -P2 >>/dev/null
service:指定运行状态
-a 'name= state={started|stopped|restarted} enabled='
name=:服务名称
state=:状态,取值有started,stopped,restarted
enabled=:是否开机自动启动,取值为true或者false
shell: ##可支持管道,变量,command模块不支持,
例:echo "centos" |passwd --stdin centos
# ansible storm_cluster -m shell -a "/tmp/rocketzhang_test.sh"
script: ##将本地脚本复制到远程主机并运行之;要使用相对路径指定脚本
-a '/path/to/script'
setup: ##收集远程主机的facts
每一个被管理节点在接收并运行管理命令以前,会将本身主机相关信息,如操做系统版本,ip地址等报告给远程的ansible主机
Inventory的默认路径是在/etc/ansible/hosts,分为静态和动态两种
静态:须要手工的把你要管理的主机写进去。
动态:事先有一个资源管理系统,里面有全部主机信息,用脚本程序把资源管理系统里的信息给拉过来,以json格式呈现
配置静态Inventory:
ansible]# cat -n /etc/ansible/hosts
1 [alltest:children]
2 salt
3 leihuo
4
5 [salt]
6 salt-master ansible_ssh_user=lixc ansible_ssh_pass=123456
7 10.240.162.112 ansible_connection=paramiko
8
9 [leihuo]
10 lixc ansible_ssh_host=192.168.131.203 ansible_ssh_port=21100
11 10.240.162.11[1:9]:22
第1行,alltest这个组包含俩子组分别是下面的salt,和leihuo
第6行能够设置主机的默认链接用户,及密码
第7行能够设置ssh的链接方式,默认是openssh,我这里用paramiko,不用官网推荐用openssh,由于openssh查询key的时候,很耗时,效率不高。
第10行,能够给主机随便取个别名,这里的“lixc”就是一个别名,若是ssh默认端口不是22,这里能够
指定特定的端口,
指定ssh端口也能够像第11行,这么指定。
不过以上两种指定ssh端口方法,只针对咱们有少部分的主机是特殊端口,若是咱们全部主机都是指定的端口,配置文件里有个选项,改为咱们须要的端口就OK了,修改后对全局有效
ansible]# grep "remote_port" /etc/ansible/ansible.cfg
remote_port = 22
第7行和11行,是俩相同的主机,说明同一主机能够在不一样的组中。在现实当中就像我一台服务器便可以装mysql也能够装apache是一个道理。
变量:
ansible的变量主要给后面的playbook使用,分为主机变量和组变量
ansible]# cat -n /etc/ansible/hosts
1 [alltest:children]
2 salt
3 leihuo
4
5 [salt]
6 salt-master salt-port=4505 mysql-port=3306
7 10.240.162.112 salt-path=/usr/bin/salt-call
8
9 [leihuo]
10 lixc ansible_ssh_host=192.168.131.203 ansible_ssh_port=21100
11 10.240.162.11[1:9]:22
12 [alltest:vars]
13 ls-path=/bin/ls
14 liss=lisisi
6,7行设置主机变量
12-14行,设置的为alltest这个组的变量。组变量就是,我这个组的成员均可以用
固然咱们也能够不在/etc/ansible/hosts里面定义变量,也能够把变量写进单独的文件里,不过变量定义的形式就不是谁=谁,这么个形式了。而是遵循yaml语法的key: value的形式。
把变量写进文件:
ansible]# for dir in {host_vars,group_vars};do ls /etc/ansible/${dir};done
10.240.162.112 salt-master
alltest
文件定义格式:
ansible]# cat /etc/ansible/host_vars/salt-master
---
salt-port: 4505
mysql-port: 3306
ansible目标主机匹配patterns:
匹配全部主机
*或者all
匹配多个组
salt:leihuo
在salt这个组里,但不能在leihuo这个组里的主机
salt:!leihuo
取两个组的交集
salt:&leihuo
排除某一主机
ansible-playbook site.yaml --limit salt-msater
固然也能够用正则,在/etc/ansible/hosts里面去定义。如
~salt(master|minion)\.li*\.com