一.ansible介绍
Ansible组成结构 Ansible 是Ansible的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。 Ansible Playbook 任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,yaml格式。 Inventory Ansible管理主机的清单,默认是/etc/ansible/hosts文件。 Modules Ansible执行命令的功能模块,Ansible2.3版本为止,共有1039个模块。还可以自定义模块。 Plugins 插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。 API 提供给第三方程序调用的应用程序编程接口。
二.安装ansible
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum -y install ansible
三. 配置inventory
1.组配置
[monitor] 192.168.1.1
根据实际需求填写,机器需要提前做好免登录,可以通过这个命令批量添加for i in {1,2,3,6}; do ssh-copy-id -i 192.168.1.3$i ; done
2.测试invertory ip是否通
ansible monitor -m ping -o
3.查看inventory monitor组服务器列表
ansible monitor --list
四.模块使用
1.模块的使用说明
ansible-doc -s 模块名称(可以查看某个模块的具体参数使用)
2.command使用
(注意:shell中的"<", ">", "|", ";", "&","$"等特殊字符不能在command模块中使用,如果需要使用,则用shell模块)
1.ansible monitor -a 'chdir=/tmp pwd'(先切换目录,在执行命令)
#creates,如果creates的文件存在,则不会执行后面操作
2.ansible monitor -a 'creates=/tmp1 ls /etc/'
#removes 和creates相反,如果存在,则会执行后面操作。如果不存在则不会执行后面的操作
3.ansible monitor -a 'removes=/tmp1 ls /etc/'
3.shell使用
专门用来执行shell命令的模块,和command模块一样,参数基本一样,都有chdir,creates,removes等参数
#使用creates不更新时间戳
ansible monitor -m shell -a 'creates=/tmp/test/1.txt cd /tmp/test && touch 1.txt && ls'
4.script使用
用于在被管理机器上面执行shell脚本的模块,脚本无需在被管理机器上面存在
ansible monitor -m script -a "a.sh"
5.file使用
用于对文件的处理,创建,删除,权限控制等
#创建目录
ansible monitor -m file -a 'path=/tmp/test1 state=directory'
#创建文件
ansible monitor -m file -a 'path=/tmp/test1 state=touch'
#建立软链接(src表示源文件,path表示目标文件)
ansible monitor -m file -a 'src=/tmp/test1 path=/tmp/test3 state=link'
#删除文件
ansible monitor -m file -a 'path=/tmp/test1 state=absent'
# 创建文件时同时设置权限等信息
ansible monitor -m file -a 'path=/tmp/test4 state=directory mode=775 owner=root group=root'
6.copy使用
用于管理端复制文件到远程主机,并可以设置权限,属组,属主等
# 复制文件到远程主机并改名
ansible monitor-m copy -a 'dest=/tmp/a.sh src=/root/ansible_test.sh'
#复制文件到远程主机,并备份远程文件,安装时间信息备份文件(当更新文件内容后,重新copy时用到)
ansible monitor -m copy -a 'dest=/tmp/a.sh src=/root/ansible_test.sh backup=yes'
# 直接在远程主机a.sh中添加内容
ansible monitor -m copy -a 'dest=/tmp/a.sh content="#!/bin/bash\n echo `uptime`"'
# 复制文件到远程主机,并设置权限及属主与属组
ansible monitor -m copy -a 'dest=/tmp/passwd src=/etc/passwd mode=700 owner=root group=root'
7.fetch使用
用于从被管理机器上面拉取文件,拉取下来的内容会保留目录结构,一般情况用在收集被管理机器的日志文件等
# 从被管理机器上拉取cron日志文件,默认会已管理节点地址创建一个目录,并存放在内
ansible monitor -m fetch -a 'dest=/tmp src=/var/log/cron'
8.user使用
用于对系统用户的管理,用户的创建、删除、家目录、属组等设置
# 创建用户名指定家目录,指定uid及组
ansible monitor -m user -a 'name=mysql home=/opt/mysql uid=1002 group=root'
# 创建用户,不创建家目录,并且不能登录
ansible monitor-m user -a 'name=apache shell=/bin/nologin uid=1003 create_home=no'
#删除用户
ansible monitor-m user -a 'name=apache state=absent'
#删除用户并删除家目录
ansible monitor-m user -a 'name=mysql state=absent remove=yes'
9.group使用
#创建组
ansible monitor-m group -a 'name=www'
#创建组并且指定uid
ansible monitor-m group -a 'name=www1 gid=1005'
#删除组
ansible monitor-m group -a 'name=www1 state=absent'
10.yum使用
#安装软件包
ansible monitor-m yum -a 'name=httpd state=installed'
#卸载软件包
ansible monitor-m yum -a 'name=httpd state=removed'
11.pip使用
# 使用pip时,需要保证被管理机器上有python-pip软件包
ansible monitor-m yum -a 'name=python-pip'
# 安装pip包
ansible monitor-m pip -a 'name=flask'
12.service
服务模块,用于对服务进行管理,服务的启动、关闭、开机自启等
# 启动服务,并设置开机自启动
ansible monitor-m service -a 'name=crond state=started enabled=yes'
13.cron
用于指定计划任务,和crontab -e一样
# 创建一个计划任务,并描述是干嘛用的
ansible monitor-m cron -a "name='这是一个测试的计划任务' minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/test.sh'"
#查看计划任务
ansible monitor -m shell -a 'crontab -l'
#创建一个么有描述的临时任务
ansible monitor-m cron -a "job='/bin/sh /root/test.sh'"
#删除任务
ansible monitor -m cron -a "name='None' job='/bin/sh /root/test.sh' state=absent"
14.setup
获取系统信息的模块
# 查看模块参数
[root@ansible ~]# ansible-doc -s setup
# 查看系统所有信息
[root@ansible ~]# ansible monitor -m setup
# filter 对系统信息进行过滤
[root@ansible ~]# ansible monitor-m setup -a 'filter=ansible_all_ipv4_addresses'
# 常用的过滤选项
ansible_all_ipv4_addresses 所有的ipv4地址
ansible_all_ipv6_addresses 所有的ipv6地址
ansible_architecture 系统的架构
ansible_date_time 系统时间
ansible_default_ipv4 系统的默认ipv4地址
ansible_distribution 系统名称
ansible_distribution_file_variety 系统的家族
ansible_distribution_major_version 系统的版本
ansible_domain 系统所在的域
ansible_fqdn 系统的主机名
ansible_hostname 系统的主机名,简写
ansible_os_family 系统的家族
ansible_processor_cores cpu的核数
ansible_processor_count cpu的颗数
ansible_processor_vcpus cpu的个数
五.playbook
1.案例一
一个简单的playbook使用
# 创建playbook文件
[root@ansible ~]# cat playbook01.yml
--- #固定格式
- hosts: 192.168.1.31 #定义需要执行主机
remote_user: root #远程用户
vars: #定义变量
http_port: 8088 #变量
tasks: #定义一个任务的开始
- name: create new file #定义任务的名称
file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情
- name: create new user
user: name=test02 system=yes shell=/sbin/nologin
- name: install package
yum: name=httpd
- name: config httpd
template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
- restart apache #notify要执行的动作,这里必须与handlers中的name定义内容一致
- name: copy index.html
copy: src=/var/www/html/index.html dest=/var/www/html/index.html
- name: start httpd
service: name=httpd state=started
handlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作
- name: restart apache #要与notify定义的内容相同
service: name=httpd state=restarted #触发要执行的动作
#测试页面准备
[root@ansible ~]# echo "playbook test file" >>/var/www/html/index.html
#配置文件准备
[root@ansible ~]# cat httpd.conf |grep ^Listen
Listen {{ http_port }}
#执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok
[root@ansible ~]# ansible-playbook playbook01.yml
PLAY [192.168.1.31] *********************************************************************************************
TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.1.31]
TASK [create new file] ******************************************************************************************
changed: [192.168.1.31]
TASK [create new user] ******************************************************************************************
changed: [192.168.1.31]
TASK [install package] ******************************************************************************************
changed: [192.168.1.31]
TASK [config httpd] *********************************************************************************************
changed: [192.168.1.31]
TASK [copy index.html] ******************************************************************************************
changed: [192.168.1.31]
TASK [start httpd] **********************************************************************************************
changed: [192.168.1.31]
PLAY RECAP ******************************************************************************************************
192.168.1.31 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 验证上面playbook执行的结果
[root@ansible ~]# ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02'
192.168.1.31 | CHANGED | rc=0 >>
/tmp/playtest.txt
uid=990(test02) gid=985(test02) 组=985(test02)
[root@ansible ~]# curl 192.168.1.31:8088
playbook test file
案例2:部署一个监控程序到外网
---
- hosts: monitor
become: yes
become_user: root
become_method: sudo
tasks:
- name: copy monitor
copy:
src: /root/monitor/
dest: /root/monitor/
backup: yes
mode: 755
owner: root
group: root
- name: restart monitor
shell: cd /root/monitor;nohup ./main -restart
- name: check monitor
shell: ps aux|grep main

















