Ansible是自动化运维工具,由Python编写的开源工具,基于ssh协议连接被管理服务器,从而实现批量管理。并且它是基于模块工作的,本身没有批量部署的能力,真正批量部署的是ansible所运行的模块,而ansible只是提供一种框架
工作原理
Ansible由节点和控制机器组成。 控制机器是安装Ansible的地方,节点由这些机器通过SSH管理。 借助SSH协议,控制机器可以部署临时存储在远程节点上的模块。
控制机器使用ansible或者ansible-playbooks在服务器终端输入的Ansible命令集或者playbook后,Ansible会遵循预先编排的规则将playbook逐条拆解为Play,再将Play组织成Ansible可以识别的任务tasks,随后调用任务涉及到的所有MODULES及PLUGINS,根据主机清单INVENTORY中定义的主机列表通过SSH协议将任务集以临时文件或者命令的形式传输到远程节点并返回结果,如果是临时文件则执行完毕后自动删除。
hosts配置文件是ansible管理的主机列表文件,里面记载着管理主机的ip、端口等信息
其有两种方式:
一是单个主机名或主机ip记录
二是将某一类主机分组记录,譬如:
[web]
192.168.1.1
192.168.1.2
192.168.1.3
[mysql]
192.168.1.[4..6]
参数类型 | 参数说明 | |
---|---|---|
ansible_host | 主机地址 | 远程主机ip |
ansible_port | 主机端口 | 设置SSH连接端口,默认22 |
ansible_user | 主机用户 | 默认SSH远程连接的用户身份 |
ansible_password | 用户密码 | 指定SSH远程主机密码 |
模块被认为是 Ansible 的工作单元。每个模块大多是独立的,可以用标准的脚本语言编写,如 Python、Perl、bash
常用模块
command:默认模块,如果不加-m参数指定模块,那么就默认command模块。这个模块可以直接在远程主机上执行命令,并将结果返回给主机。注意:该模块不支持'|' 管道符
sh# 进入/etc目录下
ansible all -m command -a "cd /etc"
shell:万能模块,调度shell解释器运行命令
sh# 查看80端口
ansible all -m shell -a "netstat -nlpt | grep 80"
user:该模块主要是用来管理用户账号
sh# 创建chuntian用户
ansible all -m user -a "name=chuntian"
#指定chuntian用户主组为din
ansible all -m user -a "name=chuntian group=din"
# 删除chuntian用户
ansible all -m user -a "name=chuntian state=absent"
group:该模块主要用于添加或删除组
sh# 创建组名www,并设置gid为666(修改同理)
ansible web -m group -a "name=www gid=666"
# 删除www组
ansible web -m group -a "name=www state=absent"
copy:将本地文件或目录拷贝到远程主机,常用选项如下:
src:本地路径
content:用于指定文件内容
dest:目标路径
mode:指定拷贝后文件的权限
backup:是否备份
sh# 将/etc/nginx/nginx.conf文件拷贝到远程主机/etc/nginx下
ansible all -m copy -a "src=etc/nginx/nginx.conf dest=/etc/nginx"
# 在/opt下生成文件test.txt,并指定第一行内容为abc,第二行内容为123
ansible all -m copy -a "content=abc\n123 dest=/opt/test.txt"
# /etc/nginx/nginx.conf文件拷贝到远程主机/etc/nginx下,并将原conf文件备份
ansible all -m copy -a "src=etc/nginx/nginx.conf dest=/etc/nginx backup=yes"
fetch:该模块用于从远程某主机获取(复制)文件到本地
dest:用来存放文件的目录
src:在远程拉取的文件,并且必须是一个file,不能是目录
sh# 拷贝远程主机/etc/nginx/nginx.conf到本地/etc目录下
ansible all -m fetch -a "src=/etc/nginx/nginx.conf dest=/etc"
file:该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等
sh# 在/opt目录下创建一个test.txt文件
ansible all -m file -a "path=/opt state=touch"
# 在/opt目录下创建一个chuntian目录
ansible all -m file -a "path=/opt state=directory"
# 为/opt/test.txt 创建一个位于/tmp目录下名为cc.txt的软连接
ansible all -m file -a "path=/tmp/cc.txt state=link src=/opt/test.txt"
# 删除test.txt或者指定目录
ansible all -m file -a "path=/etc/test.txt state=absent"
cron:该模块用于管理定时任务
minute:设置计划任务中分钟设定位的值,默认为””。 hour:同上 day:同上 month:同上 weekday:此参数用于设置计划任务中周几设定位的值,默认为””。 注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为”* * * * *”,这样表示每秒都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确。 user:设置当前计划任务属于哪个用户。 job:指定计划的任务中需要实际执行的命令或者脚本。 name:设置计划任务的名称。 state:当计划任务有名称时,修改或删除对应的任务,当删除计划任务时,需要将 state 的值设置为 absent。
sh# 任务名称为”crontab test”,任务于每天1点5分执行,任务内容为输出test字符。
ansible all -m cron -a "name='crontab test' minute=5 hour=1 job=echo 'test'"
# 任务名称为”crontab day test”,任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出 test 字符。
ansible all -m cron -a "name='crontab day test' minute=1 hour=1 day=*/3 job=echo 'test'"
# 删除名为crontab test计划任务,删除任务的同时可以进行备份。
ansible all -m cron -a "name='crontab test' state=absent backup=yes"
yum:该模块主要用于软件的管理
name:安装的包名
state:installd-->安装,latest-->安装最新,absent-->卸载
sh# 下载nginx
ansible all -m yum -a "name=nginx state=installd"
# 下载nginx最新版本
ansible all -m yum -a "name=nginx state=latest"
# 卸载nginx
ansible all -m yum -a "name=nginx state=absent"
script:将本机的脚本在被管理端的机器上运行,但是被管理端机器不会有脚本文件
sh# 将本地test.sh脚本在远程机器上执行
ansible all -m script -a "/test.sh"
systemd:使用systemctl 管理程序的话,可以使用systemd模块,systemctl 可以 控制程序启/停,reload,开机启动,观察程序状态(status)等
sh# 启动nginx
ansible all -m systemd -a "name=nginx state=startd"
# 停止nginx
ansible all -m systemd -a "name=nginx state=stoppd"
# 重载nginx
ansible all -m systemd -a "name=nginx state=reload"
Playbooks 是 Ansible 的配置、部署和编排语言,它是基于YAML语言编写的。他们可以描述您希望远程系统实施的策略,或者描述一般 IT 流程中的一系列步骤。
核心元素 | 元素说明 |
---|---|
Hosts | 执行的远程主机列表 |
Tasks | 任务 |
Variables | 内置变量或者自定义变量在playbook中调用 |
Templates | 可替换文件中的变量并实现一些简单逻辑的文件 |
Handlers和notify | 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行 |
tags标签 | 指定某条任务执行,用于选择运行playbook中的部分代码。 ansible具有幂等性,因此会自动跳过没有变化的部分, 即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。 此时,如果确信其没有变化,就可以通过tags跳过此些代码片断 ansible-playbook -t tagsname useradd.yml |
yaml---
- hosts: mysql
remote_user: root
tasks:
- name: install mysql
yum: name=mysql-server state=installd
- name: start mysql
systemd: name=mysql state=started
yaml---
- hosts: web # 指定web组服务器
remote_user: root # 在被管理服务器中以root执行
tasks:
- name: install nginx # 下载nginx
yum: name=nginx state=installd
- name: copy nginx.conf # 拷贝本机的nginx配置文件至web组服务器中并备份
copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
notify: reload # 当nginx.conf 发生变化时,就执行相应handlers
tags: reloadnginx # 打标签
- name: start nginx # 启动nginx
systemd: name=nginx state=started
tags: startnginx # 打标签
handlers:
- name: reload # 重启nginx
systemd: name=nginx state=restarted
使用变量的方法
yaml# 将nginx全部换成变量
---
- hosts: web
remote_user: root
tasks:
- name: install {{ rpmname }}
yum: name={{ rpmname }} state=present
- name: copy {{ rpmname }}.conf
copy: src=/tmp/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yes
notify: reload
tags: reload{{ rpmname }}
- name: start {{ rpmname }} service
service: name={{ rpmname }} state=started
tags: start{{ rpmname }}
handlers:
- name: reload
将nginx换成keepalived
sh# 使用ansible-playbook -e VARS
ansible-playboook test.yaml -e "key=value"
ansible-playbook nginx.yml -e rpmname=keepalived
yaml---
- hosts: web
remote_user: root
vars:
- rmpname: keepalived # 这里定义
tasks:
- name: install {{ rpmname }}
yum: name={{ rpmname }} state=present
- name: copy {{ rpmname }}.conf
copy: src=/tmp/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yes
notify: reload
tags: reload{{ rpmname }}
- name: start {{ rpmname }} service
service: name={{ rpmname }} state=started
tags: start{{ rpmname }}
handlers:
- name: reload
本文作者:春天y
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!