a. ansible是一个基于Python开发的自动化运维工具 b. ansible是一个基于ssh协议实现远程管理的工具 c. ansible软件能够实现多种批量管理操做(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令) saltstack puppet
a ansible软件服务端(管理端):不须要启动任何服务 默认服务端不须要任何的配置 b ansible软件客户端(受控端):没有客户端软件安装
1 .ansible软件自动化环境架构规划html
管理主机1台: 10.0.0.61 m01 受控主机3台: 10.0.0.41 backup 10.0.0.31 nfs01 10.0.0.7 web01 Linux系统 6.9
2 ansible软件自动化部署条件python
a .ssh密钥对建立(管理主机,建议基于ssh密钥方式创建远程链接)linux
ssh-keygen -t dsa 影响免交互建立密钥对建立因素: 1)须要指定私钥存放路径 -f /root/.ssh/id_dsa 2)须要进行私钥文件密码设定 -N/-P -N ""/-P "" 免交互建立密钥对方法 ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
b .分发公钥文件(管理主机进行分发)web
ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 影响免交互批量分发密钥因素 1)须要有确认链接过程,须要输入yes/no -o StrictHostKeyChecking=no sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31" 2)须要解决密码问题 sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 Now try logging into the machine, with "ssh '172.16.1.31'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. 免交互批量分发公钥脚本: #!/bin/bash rm /root/.ssh/id_dsa ssh-keygen -t dsa -f /root/.ssh/id_dsa -N "" for ip in 31 41 7 do sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip" done
c .检查是否能够进行基于密钥远程管理shell
ssh 172.16.1.31 uptime 免交互批量检查测试脚本 #!/bin/bash rm /root/.ssh/id_dsa ssh-keygen -t dsa -f /root/.ssh/id_dsa -N "" for ip in 31 41 7 do sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip" done 基于ssh口令方式创建远程链接(也能够) vim /etc/ansible/hosts [oldboy] 172.16.1.7 172.16.1.31 ansible_user=root ansible_password=123456 172.16.1.41 ansible 172.16.1.31 -m command -a "hostname" -k --- 实现口令交互式远程管理 SSH password: 172.16.1.31 | SUCCESS | rc=0 >> nfs01
3 ansible软件下载安装vim
ansible管理主机软件安装: yum install -y ansible ansible受控主机软件安装:(可选) yum install -y libselinux-python
4.ansible软件受控主机添加配置bash
cat /etc/ansible/hosts [oldboy] 172.16.1.7 172.16.1.31 172.16.1.41
ansible软件模块架构
ansible-doc -l|wc -l 1378 ansible 管理主机信息或者主机组信息 -m 模块名称 -a 相关模块参数 主机信息:远程主机IP地址 远程主机组名称 远程全部主机all -m 指定相应模块 -a 利用模块中某些参数功能
命令类型模块:app
第一个模块:command运维
官方参考连接:http://docs.ansible.com/ansible/latest/modules/command_module.html 参数:chdir---在执行某个命令前,先切换目录 [root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd" 172.16.1.31 | SUCCESS | rc=0 >> /tmp [root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/etc/ pwd" 172.16.1.31 | SUCCESS | rc=0 >> /etc 参数:creates---判断一个文件是否存在,若是已经存在了,后面的命令就不会执行 [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname" 172.16.1.41 | SUCCESS | rc=0 >> skipped, since /etc/rsyncd.conf exists [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf.bak hostname" 172.16.1.41 | SUCCESS | rc=0 >> skipped, since /etc/rsyncd.conf.bak exists [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname" 172.16.1.41 | SUCCESS | rc=0 >> backup 参数:removes---判断一个文件是否存在,若是不存在,后面的命令就不会执行 [root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname" 172.16.1.41 | SUCCESS | rc=0 >> backup [root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname" 172.16.1.41 | SUCCESS | rc=0 >> skipped, since /etc/rsyncd.1212213123 does not exist 参数(必需要有的):free_form---表示执行command模块时,必需要有linux合法命令信息 ansible 172.16.1.41 -m command -a "ls" 172.16.1.41 | SUCCESS | rc=0 >> 1 anaconda-ks.cfg dead.letter heqing
第二个模块:shell模块(万能模块)
参数:chdir---在执行莫个命令前,先切换目录 参数:creates---判断一个文件是否存在,若是已经存在了,后面的命令就不会执行 参数:removes---判断一个文件是否存在,若是不存在,后面的命令就不会执行 参数(必需要有的):free_form---表示执行command模块时,必需要有linux合法命令信息 [root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls;pwd" 172.16.1.41 | SUCCESS | rc=0 >> 1 anaconda-ks.cfg dead.letter /root 说明:shell模块能够知足command模块全部功能,而且能够支持识别特殊字符信息 < > | ;
第三个模块:script---专门运行脚本模块
参数:chdir---在执行莫个命令前,先切换目录 参数:creates---判断一个文件是否存在,若是已经存在了,后面的命令就不会执行 参数:removes---判断一个文件是否存在,若是不存在,后面的命令就不会执行 参数(必需要有的):free_form---表示执行command模块时,必需要有linux合法命令信息
文件类型模块
第一个模块:copy----复制模块
参数:backup---对数据信息进行备份 [root@m01 ansible]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes" 172.16.1.41 | SUCCESS => { "backup_file": "/tmp/file01.txt.71887.2018-04-02@23:33:19~", "changed": true, "checksum": "029b054db136cc36d5605e3818305825ff4b8ffb", "dest": "/tmp/file01.txt", "gid": 0, "group": "root", "md5sum": "434660b5ad7deeba8815349f71409405", "mode": "0644", "owner": "root", "size": 6, "src": "/root/.ansible/tmp/ansible-tmp-1522683197.05-52744169892601/source", "state": "file", "uid": 0 } 参数:src---定义要推送数据信息 参数:dest---定义将数据推送到远程主机什么目录中 [root@m01 ansible]# touch /tmp/file01.txt [root@m01 ansible]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/" 172.16.1.41 | SUCCESS => { "changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/tmp/file01.txt", "gid": 0, "group": "root", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0644", "owner": "root", "size": 0, "src": "/root/.ansible/tmp/ansible-tmp-1522682948.27-60532389065095/source", "state": "file", "uid": 0 } [root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/" 172.16.1.41 | SUCCESS | rc=0 >> total 24 -rw-r--r-- 1 root root 0 Apr 2 23:29 file01.txt 参数:owner---设置复制后的文件属主权限 参数:group---设置复制后的文件属组权限 参数:mode---设置复制后的文件权限(600 755)
第二个模块:file----文件属性修改/目录建立/文件建立
参数:owner---设置复制后的文件属主权限 参数:group---设置复制后的文件属组权限 参数:mode---设置复制后的文件权限(600 755) ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt owner=oldboy group=oldboy mode=600" 172.16.1.41 | SUCCESS => { "changed": true, "gid": 500, "group": "oldboy", "mode": "0600", "owner": "oldboy", "path": "/tmp/file01.txt", "size": 6, "state": "file", "uid": 500 } 参数:state---用于指定建立目录或文件 建立文件 ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt state=touch" 172.16.1.41 | SUCCESS => { "changed": true, "dest": "/tmp/file01.txt", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0 } 建立目录: ansible 172.16.1.41 -m file -a "dest=/tmp/dir01 state=directory" 172.16.1.41 | SUCCESS => { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/dir01", "size": 4096, "state": "directory", "uid": 0 }
包管理模块类型
模块:yum---安装软件包模块
name:执行要安装软件的名称,以及软件的版本 state:installed安装 absent(卸载) ansible 172.16.1.41 -m yum -a "name=iftop state=installed" ansible 172.16.1.41 -m yum -a "name=iftop state=absent" list:指定软件名称,查看软件是否能够安装,以及是否已经安装过了 ansible 172.16.1.41 -m yum -a "list=iftop"
系统模块类型
模块:service---管理服务状态模块
name: 指定要管理的服务名称(管理的服务必定在chkconfig中能够看到) state:stopped started restarted reloaded enabled:yes表示服务开机自启动 no表示服务开机不要自动启动 ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"
cron---定时任务模块
* * * * * /bin/sh /server/scripts/test.sh &>/dev/null minute=0-59 * */n , - hour day month weekday job='/bin/sh /server/scripts/test.sh &>/dev/null' 添加定时任务 ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'" ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'" #name,表示定时任务的名称。 删除定时任务 ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent" ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent" 注释定时任务 ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes" ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no" 总结ansible颜色信息: 绿色:查看远程主机信息,不会对远程主机系统作任何修改 红色:执行操做出现异常错误 黄色:对远程主机系统进行修改操做 粉色:警告或者忠告信息
编写剧本规范: http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html 遵循pyyaml ①. - 用法说明,表示列表显示的内容 水果信息: - 苹果 - 香蕉 - 西瓜 ②. : 用法说明: 姓名: 张三 性别: 男 人员信息: - 运维人员: sa - 开发人员: dev - 存储人员: dba ③. 空格 用法说明: 对内容进行分级时,须要有两个空格表示分级 软件安装步骤: - 服务端安装步骤: 第一个里程碑: 检查软件是否安装 第二个里程碑: 编写配置文件内容 - 客户端安装步骤: 补充:必须使用空格分隔ansible剧本级别,必定不要使用tab键进行分割 执行脚本方法: ansible-playbook /etc/ansible/ansible-playbook/test.yaml ansible-playbook -C /etc/ansible/ansible-playbook/test.yaml --syntax-check:检测yaml文件的语法。 -C:预测试,不会改变目标主机的任何设置。 --list-tasks:列出yaml文件的任务列表。 --list-hosts:列出yaml文件影响的主机列表。 --list-tags:列出yaml文件中的标签。 -t TAGS:表示只执行指定标签的任务。 --skip-tags=SKIP_TAGS:表示出了指定标签的任务,执行其余任务。 --start-at-task=START_AT:从指定任务开始往下运行。 做业: 01. nfs服务一键化部署 02. inotify/sersync软件一键化部署