参考资料:

Ansible Playbook 介绍(https://blog.csdn.net/CityzenOldwang/article/details/72628895

ansible playbook核心元素详解(https://blog.csdn.net/nextkara/article/details/72863264

ansible playbook详解(http://www.mamicode.com/info-detail-1240734.html


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为具体roles的任务,对应echo.yml中的echo;templates为ansible的任务的模板,可以使用宏变量;

#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/

ansible-playbook echo.yml

#ansible-playbook -C echo.yml可查看执行步骤

#然后观察屏幕输出或者logs下的日志

、ansible常用模块及用法

官方模块列表:https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html


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"

image.png

查看node1、node2主机的/tmp目录,文件已经以1.txt.ansible重名民的方式传输成功。

image.png

2、fetch模块(从node1拉取文件到ansible主机端

示例:[root@DB2 ansible]# ansible all -m fetch -a "src=/tmp/an.txt dest=/tmp"

image.png

3、command模块在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析。不支持管道功能

示例:[root@DB2 ansible]# ansible all -m command -a "ifconfig"

image.png

4、shell模块(由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,shell模块可以做到。

示例:[root@DB2 ansible]# ansible all -m shell -a "ifconfig|grep eno"

image.png

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"

image.png

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"

image.png示例2:删除计划任务(结尾加state=absent为删除任务

[root@DB2 ansible]# ansible all -m cron -a "name=update_time state=absent" 


image.png

7、yum模块(故名思义就是yum安装软件包的模块

enablerepo表示启用,    disablerepo禁用某repo库
name 安装包名
state (present' orinstalled', 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|false
runlevel: 启动级别 (systemed方式忽略)

示例:开机启动nginx:[root@DB2 ansible]# ansible all -m service -a "name=nginx state=started enabled=true"


9、script模块(把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;

示例:直接在ansible上执行脚本

image.png

[root@DB2 01]# ansible all -m script -a "/root/01/scripts/test.sh"

[root@DB2 01]# cat /tmp/ansible.txt 

ansible script test!

image.png