参考资料:
Ansible Playbook 介绍()
ansible playbook核心元素详解()
ansible playbook详解()
1、关于Ansible
Ansible是一个部署工具;Ansible通过SSH协议实现远程节点和管理节点之间的通信。理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。
安装前操作:
[root@host-172-18-21-78 config]# ansible --help #查看帮助
[root@host-172-18-21-78 config]# ansible --version # 检查ansible是否安装
ansible 2.4.0
config file = None
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible-2.4.0-py2.7.egg/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 20 2015, 02:00:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)]
ansible playbook实践
一、安装:(使用yum或pip方式)
Ansible是python开发的,故依赖一些python库和组件,如:paramiko,PyYaml和jinja三个关键组件;
只要机器上安装了 Python 2.6 或 Python 2.7 (windows系统不可以做控制主机),都可以运行Ansible.安装ansible很简单,可通过git从githu上直接获取代码,也可以像redhat/CentOS上通过yum进行安装。
方式一:
yum install epel-release -y
yum install ansible -y
方式二:
yum install ansible jinja2 -y
pip install ansible jinja2
备注:1.只需在执行机器上安装即可,被执行机器无需安装
2.jinja2为ansible所需要的模块
使用 ansible --version 来查看是否安装完成
ansible使用格式:
[root@DB2 ansible]# ansible all -m shell -a "ifconfig|grep eno16777736"
172.17.0.102 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
172.17.0.112 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
172.17.0.105 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
二、开始配置:
1)需求:准备2-3台机器,使用ansible playbook echo.yml发送任务到每台机器上运行脚本。
1.1、创建ansible相关文件及文件夹:
mkdir /data/ansible #创建任务目录
mkdir /data/ansible/config #ansible任务的hosts配置文件目录
mkdir /data/ansible/logs #ansible任务的日志目录
touch /data/ansible/ansible.cfg #ansible任务的配置文件
*****************************
1.2、制作ansible主机相关:(被执行主机信息位置/etc/ansible/hosts可能不是/data/ansible/config/hosts)
1)创建hosts文件并登记被执行主机的信息:
#使用admin账号,[ ]内配置一个组名
vim /data/ansible/config/hosts
###hosts文件内容开始###
[hosts_group]
192.168
.
1.16
ansible_ssh_port=
22
ansible_ssh_user=admin ansible_ssh_pass=xxx
192.168
.
2.30
ansible_ssh_port=
22
ansible_ssh_user=admin ansible_ssh_pass=xxx
192.168
.
1.18
ansible_ssh_port=
22
ansible_ssh_user=admin ansible_ssh_pass=xxx
[hosts_group:vars]
ansible_connection=paramiko
###hosts文件内容结束###
解释:[hosts_group]为组名
*****************************
1.3、编辑任务的配置文件:(ansible主配置文件ansible.cfg )
vim /data/tmpansible/ansible.cfg
###ansible.cfg文件内容开始###
[defaults]
host_key_checking = False
# 默认用这个
callback_plugins = /usr/share/ansible_plugins/callback_plugins
# 默认用这个
ANSIBLE_SSH_ARGS=
"-o StrictHostKeyChecking=no"
# 默认用这个
_forks=
5
# 默认用这个,并发任务数
inventory = /data/tmpansible/config/hosts
# 要修改为任务目录(参考上面创建的目录)
log_path= /data/tmpansible/logs/app.log
# 要修改为任务目录(参考上面创建的目录)
timeout =
10
###ansible.cfg文件内容结束###
*******************************
三、编辑任务相关:
2.1、任务echo.yml相关:vim /data/tmpansible/echo.yml (ansible任务的执行模板。为yml文件格式)
###echo.yml内容开始###---- name:操作三台主机 hosts:hosts_group #对应config/hosts下的3台主机组的名称 roles: #角色(echo为任务的角色) - echo #ansible会执行roles下面的echo任务的tasks ###echo.yml内容结束### |
2.2、任务roles相关
mkdir -p /data/tmpansible/roles/echo/{templates,tasks,files} #批量递增创建templates,tasks,files这三个文件夹
echo.yml中的echo;templates为ansible的任务的模板,可以使用宏变量;#echo为具体roles的任务,对应
#tasks为具体的任务,默认会执行它下面的任务;files为tasks会使用的文件;
2.2.1、编辑任务执行文件main.yml #千万不要自定义文件名,这个才是我们实际需要操作的内容(拷贝文件、执行脚本之类)
vim /data/tmpansible/roles/echo/tasks/main.yml
###main.yml文件内容开始###
---
- name: (Checkbundle) Step
1
, Transfer domain.txt(拷贝文件)
copy: src=文件名 dest=目录/文件名
- name: (Checkbundle) Step
2
, Transfer scripts(拷贝脚本)
#这个是将templates目录下的文件复制过去,里面可以嵌套更改一些变量 (模板:dest=**/scripts/**.sh)
template: src=脚本名 dest=目录/脚本名
- name: (Checkbundle) Step
3
,
#
这个是执行脚本(模板:nohup sh **/scripts/**.sh &)
shell: nohup sh 目录/脚本名 &
###main.yml文件内容结束###
**************注 释**********************
# { { install_dir_name }} 等就是变量,实际操作的时候请替换成真正的脚本名字,具体脚本中也能增加变量
# 变量的索引地址可以放在 /data/tmpansible/group_vars/all 中 例如"install_dir_name: jutidejiaobenmingzi"
2.2.2、创建脚本
vim /data/tmpansible/roles/echo/templates/scripts.sh
###scripts.sh文件内容开始###
#!/bin/bash
echo
"hello"
> /tmp/echo
###scripts.sh文件内容结束###
2.2.3、执行任务
cd /data/ansible/
#然后观察屏幕输出或者logs下的日志 |
四、ansible常用模块及用法
官方模块列表:
1、copy模块(从本地copy文件分发到目录主机路径 )
src= 源文件路径
dest= 目标路径注意:src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去
content= 自行填充的文件内容owner 属主 group 属组 mode权限
示例:[root@DB2 ansible]# ansible all -m copy -a "src=/data/1.txt dest=/tmp/1.txt.ansible mode=600"
查看node1、node2主机的/tmp目录,文件已经以1.txt.ansible重名民的方式传输成功。
2、fetch模块(从node1拉取文件到ansible主机端)
示例:[root@DB2 ansible]# ansible all -m fetch -a "src=/tmp/an.txt dest=/tmp"
3、command模块(在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析。不支持管道功能)
示例:[root@DB2 ansible]# ansible all -m command -a "ifconfig"
4、shell模块(由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,shell模块可以做到。)
示例:[root@DB2 ansible]# ansible all -m shell -a "ifconfig|grep eno"
5、file模块(设置文件属性(创建文件))
path=目标路径 group 目录属组 owner 属主state=directory为目录,link为软件链接
示例:创建目录:[root@DB2 ansible]# ansible all -m file -a "path=/var/tmp/hello.dir state=directory"
创建软连接文件:[root@DB2 ansible]# ansible all -m file -a "src=/tmp/hi.txt path=/var/tmp/hi.link state=link"
6、cron模块(通过cron模块对目标主机生成计划任务)
分(minute)时(hour)日(day)月(month)周(week)
name=(本次计划任务的名称)
state=present生成(默认)|absent 删除(基于name)
示例1:对所有机器执行任务:每隔3分钟从time.windows.com同步时间(因为cron默认是生成任务,结尾不加state=present也表示生成任务)
[root@DB2 ansible]# ansible all -m cron -a "minute=*/3 job='/usr/sbin/update time.windows.com &>/dev/null' name=update_time"
示例2:删除计划任务(结尾加state=absent为删除任务)
[root@DB2 ansible]# ansible all -m cron -a "name=update_time state=absent"
7、yum模块(故名思义就是yum安装软件包的模块)
enablerepo表示启用, disablerepo禁用某repo库name 安装包名state (present' or
installed', latest')表示安装, (
absent' or `removed') 表示删除
示例:通过安装epel扩展源并安装nginx
[root@DB2 ansible]# ansible all -m yum -a"name=epel-release state=installed"
[root@DB2 ansible]# ansible all -m yum -a"name=nginx state=installed"
8、service模块(服务管理模块)
name:服务名state:服务状态enabled: 是否开机启动 true|falserunlevel: 启动级别 (systemed方式忽略)
示例:开机启动nginx:[root@DB2 ansible]# ansible all -m service -a "name=nginx state=started enabled=true"
9、script模块(把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;)
示例:直接在ansible上执行脚本
[root@DB2 01]# ansible all -m script -a "/root/01/scripts/test.sh"
[root@DB2 01]# cat /tmp/ansible.txt
ansible script test!