常用自动化运维工具
- OS provisioning
- Cobbler : 批量的系统安装工具
- OS config
- Cfengine :早期的一种系统配置工具
- Puppet:基于Ruby开发,采用C/S架构,扩展性强,基于SSL认证
- Saltstack:基于Python开发,采用C/S架构,相对于puppet更轻量级,配置语法采用YAML
- Deployment
- Func(ssl)
- Fabric
为什么选择ansible
- Ansible
- 是新出现的自动化运维工具,ansible是一个批量的配置管理和应用部署工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric、SaltStack )的优点。
- 相对于puppet和saltstack,ansible无需客户端,更轻量级
- ansible甚至都不用启动服务,仅仅只是一个工具,可以很轻松的实现分布式扩展
- 使用python编写,维护更简单,ruby语法过于复杂
- ssh by default:基于SSH工作更强的远程命令执行操作
- yaml,not code:使用YAML语言定制剧本playbook
- 幂等性:一种操作重复多次结果相同
Ansible工作原理
基本架构
Ansible各组件
- 核心:ansible
- 核心模块(Core Modules):这些都是ansible自带的模块
- 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
- 插件(Plugins):完成模块功能的补充
- 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
- 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
- 主机群(Host Inventory):定义ansible管理的主机
工作流程
Ansible使用
过程如下:安装→配置互信→配置主机组→获取帮助→常用模块及用法→playbook
Ansible安装
Ansible只是一个进程 不需要添加数据库也不需要启动和运行守护进程它只是一个进程你可以轻松使用它安装在任何一点主机上面(除了windows)ansible管理机不能安装到windows上面
版本的选择 因为2.0有非常大的改进 一般都会使用2.0以上的版本控制机的要求 因为ansible是python写的所以,需要在安装了python2.6或者2.7以上的python版本才可以安装
配置好epel源
yum install -y ansible
配置互信
Ansible使用ssh来进行远程管理:
在服务器上执行:
ssh-keygen -t rsa -P ‘‘ #生成公钥 ssh-copy-id -i .ssh/id_rsa.pub [email protected]192.168.0.103(这是node ip) #将公钥分发到各被管理主机上,实现秘钥登录
注:当然也可以携带密码来进行管理https://www.cnblogs.com/kaishirenshi/p/9466666.html
配置文件
主机组配置
位置:/etc/ansible/hosts
案例:
# cat /etc/ansible/hosts [test] #代表test组,以下是组内包含的所有主机 192.168.12.5[1:4] #可以用通配符来简化,代表192.168.12.51-192.168.12.54 192.168.12.5[6:9] 192.168.13.101 192.168.13.103 [app] #代表app组 192.168.12.5[0:3] 192.168.12.5[5:9] #执行命令的时候作用于组名即可批量对组内所有用户执行操作
主配置文件:
/etc/ansible/ansible.cfg
常用配置:取消host_key_checking = False 的注释,解决ansible首次连接host服务器需验证问题
获取使用说明帮助
- ansible的命令格式:
ansible <host-pattern> [-m module_name] [-a args]
<host-pattern> :可以是具体的主机、组、all(没有在组里的所有主机)
-m 指定模块名
-a 指定命令
- 获取ansible的模块列表:
# ansible-doc –l
- 获取ansible的模块的帮助:
#ansible-doc -s modename
测试:使用ping模块来测试连接情况
ansible常用模块介绍
- command:在远程主机上执行命令,不支持管道‘|‘
- shell:执行远程主机的shell/python脚本
- raw:类似于command模块、支持管道传递
说明:command、shell、raw模块的核心参数为命令本身;而其它模块的参数通常为“key=value”格式;
- scscript:在远程主机执行主控端的shell/python脚本 (使用相对路径)
- copy:复制文件到远程主机(fetch可将远程复制到本地)
- raw:类似于command模块,支持管道
- file:用于配置文件属性
- yum:用于安装软件包
- cron:配置计划任务
- user:配置用户
- group:配置用户组
- service:用于管理服务
- ping:用于检测远程主机是否存活
- setup:查看远程主机的基本信息
- mount:配置挂载点
使用方法和案例详解:
【command】
说明:在远程主机上执行命令,不支持管道‘|‘,是默认模块,可以不用-m指定
creates:如果这个参数对应的文件存在,就不运行command
free_form:要执行的linux指令
chdir:在执行指令之前,先切换到该指定的目录
removes:与creates相反,如果这个参数对应的文件不存在,就不运行command
示例:
ansible test –m command -a "chdir=/tools touch test" #在/tools目录下创建test文件
ansible test –a "chdir=/tools creates=/test touch test" #如果/tools下没有test文件则创建
【shell】
说明:可以指定运行环境,支持管道
chdir:运行command命令前先cd到这个目录 creates:如果这个参数对应的文件存在,就不运行command executable: 改变用来执行命令的shell,应该是可执行文件的绝对路径。 free_form:需要执行的脚本(没有真正的参数为free_form) removes:与creates相反,如果这个参数对应的文件不存在,就不运行command stdin(2.4后新增) no 将命令的stdin设置为指定的值 warn: 示例:ansible test -m shell -a ‘bash /root/test.sh‘ ansible test -m shell -a "chdir=/testdir ls" ansible 192.168.12.50 -m shell -a "/usr/bin/python /root/test.py" #使用python环境执行py文件
【raw】
说明:和command 功能相似,支持管道符
ansible test -m raw -a "ps -ef | grep java" #我最常用的命令,一般任务都可以用raw来执行
【script】
说明:在远程主机执行主控端的shell/python脚本 (使用相对路径)
ansible test -m script -a "/etc/ansible/test.sh"
【copy】
src:源文件
dest:目标路径
backup:覆盖之前,是否备份原文件
owner:设定文件/目录的属主
group:设定文件/目录的属组
mode:设定文件/目录的权限
示例:
ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644" ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes" #copy中使用backup将原来的文件备份一下再覆盖
【file】
group:定义文件/目录的属组
owner:定义文件/目录的属主
mode:定义文件/目录的权限
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
state:定义文件状态
directory:如果目录不存在,创建目录
touch:如果文件不存在,创建一个新文件
absent:删除文件或目录
示例:
ansible test -m file -a "src=/etc/fstab.link dest=/tmp/fstab state=link" #创建链接文件 ansible test -m file -a "path=/tmp/fstab state=absent" #删除文件 ansible test -m file -a "path=/tmp/test state=touch" #创建文件
【yum】
enablerepo:启用某个源
name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
state:定义软件包状态
present:安装
absent:删除
latest:安装最新的
示例:
ansible test -m yum -a ‘name=httpd state=latest‘ #yum安装最新的httpd ansible test -m yum -a ‘name="@Development tools" state=present‘ ansible test -m yum -a ‘name=lszrz state=present enablerepo=local‘ #指定yum源为local
ansible test -m yum -a ‘name=httpd state=remove‘ #yum卸载httpd
【cron】
backup:对远程主机上的原任务计划内容修改之前做备份
day:日(1-31,*,*/2,……)
hour:小时(0-23,*,*/2,……)
minute:分钟(0-59,*,*/2,……)
month:月(1-12,*,*/2,……)
weekday:周(0-6,*,……)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除
user:以哪个用户的身份执行
示例:
ansible test -m cron -a ‘name="check dirs" minute=1 hour=1 day=*/3 job="ls -alh > /dev/null"‘ #创建计划任务每三天一次,执行时间为01:01 ansible test -m cron -a ‘name="a job for reboot" special_time=reboot job="/some/job.sh"‘ #当重启后立马执行
ansible test -m cron -a ‘name="a job for reboot" state=absent backup=yes‘ #删除同时备份
【service】
arguments:给命令行提供一些选项
enabled:是否开机启动 yes|no
name:必选项,服务名称
runlevel:运行级别
sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
示例:
ansible test -m service -a "name=httpd state=started enabled=yes" #设置httpd服务为启动状态,并且加入开机启动项 ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started" ansible test -m service -a "name=network state=restarted args=eth0" #带参数启动
【user】
home:指定家目录,需要createhome为yes
groups:用户组
uid:用户UID
password:指定用户密码
name:用户名
createhome:是否创建家目录
system:是否创建为系统用户
remove:但state=absent时,删除家目录
state:创建或者删除
shell:指定用户shell环境
示例:
ansible test -m user -a ‘name=newuser‘ #如果用户已经存在,则不进行任何操作。 ansible test -m user -a ‘name=newuser group=testgroup‘ #用户的主组为 testgroup,testgroup 组需要提前存在,当不使用 group 设置主组时,默认主组与用户名相同。 ansible test -m user -a ‘name=newuser state=absent‘ #远程主机上删除用户 ansible test -m user -a ‘name=newuser state=absent remove=yes‘ #删除用户同时删除家目录
ansible-playbook
Ansible-playbook是用yaml编写的批量任务列表
命令格式:
ansibe-playbook test.yaml
YAML:是YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。
例子:
vi test.yaml
- hosts: test #作用的主机组 remote_user: root #指定用户 tasks: #下面写任务列表 - name: add a group #指定任务名称 group: gid=1000 name=testgroup system=no #任务执行命令 - name: excute a command command: /bin/date
#此剧本完成两个任务:①创建用户组、②执行命令
执行说明:
Ansible-playbook的主体为task list
执行过程:各任务按次序在每个主机上执行,即在所有主机上完成第一个任务后才执行第二个,当中途发生错误,所有的任务都将回滚,因此,更改playbook后重新执行即可;
Ansible-playbook中的name尽可能的详细和简洁,以便于查看执行结果
可以使用ignore_errors来忽略错误信息:
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True
练习:
制作一个playbook,要求为web-servers主机组安装最新版Apache服务,并将服务的端口通过修改配置问题改为8080,然后重启服务
- hosts: web-servers remote_user: root tasks: - name: ensure apache latest version yum: state=latest name=httpd - name: apache configure file copy: src=/tools/httpd.conf dest=/etc/httpd/conf/httpd.conf force=yes - name: restart httpd service: name=httpd state=restarted