自动化运维工具ansible
3、ansible-playbook tags关键字 任务选择执行
4、ansible-playbook handlers和notify关键字 触发任务,任务绑定执行;以及多tags方法
1.epel源配置
yum install -y wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.安装ansible
yum install -y wget
Usage: ansible <host-pattern> [options] -a MODULE_ARGS, --args=MODULE_ARGS # 模块的参数 -C, --check # 会去执行,但是不做任何的改变,干跑,白跑 -f FORKS, --forks=FORKS # 指定进程数,做并发 --list-hosts #列出主机 -m MODULE_NAME # 模块名称 --syntax-check #检查语法 -k, --ask-pass ask for connection password #指定密码
#三大配置文件 /etc/ansible/ansible.cfg /etc/ansible/hosts /etc/ansible/roles
分组:
[web] 192.168.182.130 192.168.182.132 [db] 192.168.182.131 192.168.182.132 [cache] 192.168.182.130
## www[001:006].example.com [yuming] 192.168.182.[130:132]
ansible 192.168.182.130 -m ping ansible 192.168.182.131 -m ping ansible 192.168.182.132 -m ping ansible all -m ping # 所有机器,hosts文件里面 ansible 192.168.182.131,192.168.182.130 -m ping # 部分机器 ## 分组信息 [web] 192.168.182.130 192.168.182.131 [db] 192.168.182.131 192.168.182.132 [cache] 192.168.182.132 ## www[001:006].example.com 从www001到www006 ansible web --list-hosts # 用来获取符合条件的主机 ansible web -m ping # 探测组内的机器 ansible web,db -m ping # 获取db和web的并集 ansible 'web:&db' -m ping # 获取db和web的交集 ansible 'web:!db' -m ping # 获取db和web的差集,在web中但是不在db中的 ansible 'web:db' -m ping # 获取db和web的并集
系统自带的ping走的是icmp协议,ansible自带的走的是ssh
远程机器执行命令模块
chdir #切换目录 creates # 如果存在,就不执行,如果不存在,就执行 removes # 如果不存在,就不执行,如果存在,就执行 ansible web -m command -a "pwd" ansible web -m command -a "ls /tmp" ansible web -m command -a "chdir=/tmp pwd" # 切换目录,一般做编译安装 ansible web -m command -a "creates=/tmp pwd" # 不被执行,因为/tmp已经存在, ansible web -m command -a "creates=/tmp2 pwd" # 被执行,因为/tmp2目录不存在 ansible web -m command -a "creates=/tmp2 mkdir /data" # 会被执行,因为/tmp2目录不存在 ansible web -m command -a "removes=/tmp2 pwd" # 不被执行,因为/tmp2目录不存在 ansible web -m command -a "removes=/tmp pwd" # 会被执行,因为/tmp已经存在,
chdir #切换目录 creates # 如果存在,就不执行,如果不存在,就执行 removes # 如果不存在,就不执行,如果存在,就执行 ansible web -m shell -a "echo 'alex'|passwd --stdin alex" # 给用户设置密码 ansible 10.0.0.132 -m shell -a "bash a.sh" # 执行shell脚本 ansible 10.0.0.132 -m shell -a "./a.sh" ansible 10.0.0.132 -m shell -a "/root/a.sh" ansible 10.0.0.132 -m shell -a "/root/a.py" # 执行python脚本 ansible 10.0.0.132 -m shell -a "python a.py" # shell 脚本 #!/bin/bash mkdir /alex2sb11 # python脚本 #!/bin/env python #coding:utf-8 print "停车坐爱枫林晚,霜叶红于二月花"
与shell让各远程机执行自己本机上的文件不同,script执行的是控制机器上的脚本
ansible db -m script -a "/root/a.sh" # 执行的是本地的脚本,管控机上的脚本 ansible db -m script -a "creates=/root/a.sh /root/a.sh" # 判断是远程主机是否存在,如果存在,就不执行,如果不存在,就执行 ansible db -m script -a "removes=/root/a.sh /root/a.sh" # 判断的主机是否存在,如果存在,就执行,如果不存在,就不执行
backup # 创建备份文件,以时间戳结尾 content # 直接写内容 dest # 目标地址 group #文件的属组 mode # 文件的权限W 2 R 4 X 1 owner #文件的属主 src # 原文件 ansible db -m copy -a "src=/root/a.sh dest=/root/a.sh" # 复制文件 ansible db -m copy -a "src=/root/a.sh dest=/root/a.sh mode=755" # 复制文件,并修改文件的权限 ansible db -m copy -a "src=/root/a.sh dest=/root/a.sh mode=755 owner=alex" #复制文件,修改文件的权限,属主,根据md5值来判断 ansible db -m copy -a "src=/etc/init.d dest=/tmp/" # 复制文件夹 ansible db -m copy -a "src=/etc/init.d/ dest=/tmp/" # 复制文件夹下面的所有文件 ansible db -m copy -a "src=/etc/init.d dest=/tmp/ owner=alex " # 复制文件夹,并改变文件夹的属性,文件夹的文件的属性也会跟着改变 ansible db -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私语' dest=/tmp/a.sh" # 直接写文字,覆盖写入,要慎用 ansible db -m copy -a "src=/root/a.sh dest=/root/a.sh mode=755 owner=alex backup=yes" #备份文件,如果远程机器上没有要备份的文件,即使指定了backup=yes 也不会去备份文件
注意:此处备份的是远程主机上的文件
access_time # 访问时间 group # 属组 mode #权限 owner #属主 path #路径 src # 原文件,link和hard的时候使用 state: directory 文件夹 file touch 空文件 link 软连接 hard 硬链接 absent 删除 ansible db -m file -a "path=/tmp/baoyuan state=directory" # 创建一个目录 ansible db -m file -a "path=/tmp/baoyuan state=directory owner=alex mode=644" # 创建一个目录,并制定属主,权限 ansible db -m file -a "path=/tmp/baoyuan.txt state=touch owner=alex mode=644" # 创建一个文件,并制定属主,权限 ansible db -m file -a "path=/tmp/f src=/etc/fstab state=link" # 创建一个软连接 ansible db -m file -a "path=/tmp/f state=absent" # 删除
参数:
dest 目标地址
src 本地地址
示例:ansible web -m fetch -a "dest=/tmp src=/var/log/cron"
参数
disable_gpg_check # 是否要检查key disablerepo # 禁用repo enablerepo #启用repo name # 包名 state # 状态 installed removed
示例
ansible web -m yum -a "name=python2-pip" # 安装一个包 ansible web -m yum -a "name='@Development Tools'" # 安装包组 ansible web -m yum -a "name=redis,python2-pip" # 同时安装多个包 ansible web -m yum -a "name=redis state=absent" # 卸载
参数
requirements #导出的文件 name # 模块的名称 virtualenv # 虚拟环境 state #
示例
ansible web -m pip -a "name=django==1.11.18" # 安装 ansible web -m pip -a "name=flask
系统服务命令回顾(启动、自启):
ps -ef|grep redis # 查看进程 ss -tnlp #查看端口信息 # 启动服务 systemctl start redis centos7 service redis start centos6 # 开机自启动 systemctl enable redis centos7 chkconfig redis on centos6
参数
enabled # 设置开机自启动 name # 名称 state started stopped restarted reloaded
示例:
ansible web -m service -a "name=redis state=started" # 启动 ansible web -m service -a "name=redis state=stopped" # 关闭 ansible web -m service -a "name=redis state=started enabled=yes" # 启动并设置开机自启动
知识回顾: 定时任务格式(可通过 cat /etc/crontab 查看): * * * * * job 分 时 日 月 周 任务 1 * * * * job # 代表每小时的第一个分钟 2/* * * * * job # 每隔2分钟执行job 1 10-19 * * * job # 代表10到19点的第一分钟 0-59 0-23 1-31 1-12 0-7 job * * * * * tar -zcf /opt/etc.tar.gz /etc 分钟不要用*,最好是指定时间 分钟不要用*,最好是指定时间 分钟不要用*,最好是指定时间 crontab的主要作用: 收集日志 备份数据 同步时间 ansible all -m shell -a 'date' ansible all -m yum -a 'name=ntp' ansible all -m yum -a 'name=ntp' crontab -l # 查看计划任务 crontab -r # 删除所有的计划任务 crontab -e # 编辑计划任务
参数
hour #时
job #任务
minute #分
month #月
name #名字
state:present||absent
user#执行计划任务的用户
weekday#周
ansible web -m cron -a "minute=21 job='touch /tmp/cron.txt' name=touchfile" # 设置计划任务 ansible web -m cron -a "minute=23 job='touch /tmp/cron.txt' name=touchfile4 disabled=yes" # 禁用计划任务,表现为加注释 ansible web -m cron -a "name=touchfile4 state=absent" # 删除计划任务
参数
groups #附加组
home #家目录
name #用户名
shell #登录shell
remove #删除用户并删除家目录
state #状态
system #系统用户
ansible db -m user -a "name=alex2 shell=/sbin/nologin home=/opt/alex2 uid=2000 group=root" # 创建用户,并指定用户的家目录,登陆shell,uid,组 ansible db -m user -a "name=alex3 system=yes" #创建系统用户 ansible db -m user -a "name=alex3 state=absent" # 删除用户 ansible db -m user -a "name=alex2 state=absent remove=yes" # 删除用户并删除用户的家目录
gid #组id
system #系统组
name #组名
ansible db -m group -a "name=canglaoshi" #创建普通组 ansible db -m group -a "name=wutenglan system=yes" # 创建系统组 ansible db -m group -a "name=wutenglan state=absent" # 删除组
参数: 与copy模块相同,dest、src、owner... 配置文件 mkdir templates #如更改redis.conf文件,可在templates文件夹中书写: bind {{ansible_default_ipv4.address}} #playbook文件中 - hosts : web tasks : - name : install yum : name=redis - name : copyfile template : src=redis.conf dest=/etc/redis.conf tags : copyconf - name : start service : name=redis state=started - name : restart service : name=redis state=restarted tags : copyconf
获取setup模块收集的数据: ansible 192.168.182.130 -m setup |more 查看系统版本: ansible cache -m setup -a "filter=*distribution*"
yaml规范
字典key:value
列表[]
后缀名:yaml、yml
- hosts: web remote_user: root tasks: - name: copyfile copy: src=/etc/fstab dest=/tmp/fs #模块:参数
#多任务 playbook 文件 - hosts: web remote_user: root tasks: - name: copyfile copy: src=/etc/fstab dest=/tmp/fs - name: createuser user: name=alex11
幂等性:
方式一
#编写:sec.yml - hosts: web remote_user: root tasks: - name: copyfile copy: src=/etc/fstab dest=/tmp/fs - name: createuser user: name=alex11
ansible-playbook -e user=alex11 sec.yml
方式二:
hosts文件传参 [web] 192.168.182.130 user=alex130 192.168.182.132 user=alex132
ansible-playbook sec.yml
方式三:
hosts文件传参
[web:vars]
user=1315
ansible-playbook sec.yml
方式四:
yml文件中vars传参
- hosts : web vars : - user : alexyvars remote_user : root tasks: - name : echo shell : echo {{user}} > /tmp/ansiusertest.txt
方式五:
yml文件中register传参
- hosts : web vars : remote_user : root tasks: - name : sum shell : echo 5+6|bc register : user - name : echo shell : echo {{user.stdout}} > /tmp/ansiusertest.txt
hosts传参时ip地址后直接传参优先级高于[web:vars],即方法二优先级高于方法三
- hosts : web tasks : - name : install yum : name=redis - name : copyfile copy : src=/etc/redis.conf dest=/etc/redis.conf tags : copyconf - name : start service : name=redis state=started
单任务执行:
ansible-playbook -t copyconf fourth.yml
4、ansible-playbook handlers和notify关键字 触发任务,任务绑定执行;以及多tags方法
方式一:
- hosts: web tasks: - name: install yum: name=redis - name: copyfile copy: dest=/etc/redis.conf src=/etc/redis.conf tags: copy notify: restart - name: start service: name=redis state=started handlers: - name: restart service: name=redis state=restarted
redis更改配置文件后重启
方式二:
- hosts : web tasks : - name : install yum : name=redis - name : copyfile copy : src=/etc/redis.conf dest=/etc/redis.conf tags : copyconf - name : start service : name=redis state=started - name : restart service : name=redis state=restarted tags : copyconf
ansible-playbook -t copyconf thrid.yml
示例代码
#playbook文件中 - hosts : web tasks : - name : when1 shell : echo '大弦嘈嘈如急雨' >/a.txt when : cmd=='xr' - name : when2 file : path=/a.txt state=touch when : cmd=='cj' ansible-playbook -e cmd=xr six.yml
示例代码2(根据系统版本做响应操作):
- hosts: web tasks: - name: file copy: content="大弦嘈嘈如急雨" dest=/opt/file when: ansible_distribution_major_version=="7" - name: file copy: content="小弦切切如私语" dest=/opt/file when: ansible_distribution_major_version=="6"
示例代码:
#playbook文件中 - hosts : web tasks : - name : when1 shell : echo '大弦嘈嘈如急雨{{item}}' >a.txt with_items : - ju1 - ju2 - ju3
示例代码2(多with_items):
- hosts: web tasks: - name: creategroup group: name={{item}} with_items: - wusir20 - wusir21 - name: file user: name={{item}} with_items: - alex22 - alex23
示例代码3(with_items嵌套):
- hosts: web tasks: - name: creategroup group: name={{item}} with_items: - wusir22 - wusir23 - name: file user: name={{item.name}} group={{item.group}} with_items: - {"name":alex24,"group":wusir22} - {"name":alex25,"group":wusir23}
&ansible的roles
- 优点
目录结构清晰
可以相互调用
目录结构:./data/roles/nginx 需注意nginx.yml在roles同目录下
#目录结构:./data/roles/nginx 需注意nginx.yml在roles同目录下 roles/ nginx/ ├── files 存放静态的文件 │ └── fstab 拷贝文件到该目录 ├── handlers 存放需要触发的任务,里面必须main.yml文件 │ └── main.yml - name: restart service: name=nginx state=restarted ├── tasks 存放的执行的任务 ,里面必须main.yml文件 │ ├── copyfile.yml - name: copyfile tempalte: dest=/etc/nginx/nginx.conf tags: copy notify: restart │ ├── install.yml - name: installnginx yum: name=nginx │ └── start.yml - name: start service: name=nginx state=started │ ├── main.yml - import_tasks: install.yml - import_tasks: copyfile.yml - import_tasks: start.yml ├── templates 存放的模板文件 │ ├── centos6.conf 拷贝nginx.conf到该目录下并修改 │ └── nginx.conf 拷贝nginx.conf到该目录下并修改 修改:worker_processes {{ansible_processor_vcpus*2}} worker_connections 102400 └── vars 存放的是参数,里面必须main.yml文件 └── main.yml {port: 90} # 入口文件 nginx.yml: - hosts: web remote_user: root roles: - nginx
启动方式:在data目录下 语法检查:ansible-playbook --syntax-check nginx.yml 启动:ansible-playbook nginx.yml 查找顺序: - 先查找当前目录下roles目录里面指定的对应文件夹 - 找tasks目录下面的main.yml文件,如果import_tasks 就导入 - 如果遇到了templates,去找templates文件夹下面的对应文件 - 如果遇到了notify,去找handlers里面的main.yml文件 - 如果遇到了copy,去找files里面的对应文件 - 如果看到了变量,如果是setup收集的变量就去setup,如果不是就去vars里面的main.yml文件查找