🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# ansible部署和实践 ## 1 介绍和部署 ### 1.1 介绍 1) `ansible`的功能 ansible是一个基于Python开发的自动化运维工具,基于ssh协议实现远程管理,可以实现多种批量管理操作. * 批量系统配置 * 批量软件部署 * 批量文件拷贝 * 批量运行命令 2) 批量管理服务特征 * 管理端:不需要启动任何服务,默认服务端不需要任何的配置 * 受控端:基于ssh免秘钥,没有客户端软件需要安装 ### 1.2 `ansible`软件安装部署 1) 环境规划 | 主机名 | IP地址 | 用途 | | ------ | --------- | ------ | | m01 | 10.0.0.61 | 管理段 | | backup | 10.0.0.41 | 受控端 | | nfs01 | 10.0.0.31 | 受控端 | | web01 | 10.0.0.7 | 受控端 | 2) 免秘钥配置 生成秘钥对 ```sh ssh-keygen -t dsa ``` 分发秘钥 ```sh sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.7 sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.41 ``` 免交互批量分发秘钥参考我的批量免秘钥分发脚本 3) 口令登录方式配置[备选] 如果企业限制不允许使用ssh免秘钥方式,也可以使用在`ansible`的主机配置中,制定远程主机用户名和密码的方式 ```sh [root@xxxx ~]# vim /etc/ansible/hosts [noah] 172.16.1.7 172.16.1.31 ansible_user=root ansible_password=123456 172.16.1.41 ``` > 要先按装了`ansibl`软件,才会有该配置文件 4) 安装`ansible` 软件安装 ```sh yum install -y ansible ``` 若受控主机有启用selinux,会影响ansible链接,在不能禁用的情况下,客户机可以安装以下程序 ```sh yum install -y libselinux-python ``` * 主机列表创建 ```sh cp /etc/ansible/hosts{,.bak} cat >/etc/ansible/hosts <<"EOF" [noah] 172.16.1.7 172.16.1.31 172.16.1.41 EOF ``` ### 1.3 用法说明 1) 语法 ```sh ansible 主机信息 -m 模块名称 -a "相关模块参数"" 主机信息:远程主机IP地址,主机组名称,all代表所有主机 -m:指定使用哪个模块 -a:模块中的参数和功能 ``` 简单示例:ping模块 ```sh [root@xxxx ~]# ansible all -m ping 172.16.1.41 | SUCCESS => { "changed": false, "ping": "pong" } 172.16.1.7 | SUCCESS => { "changed": false, "ping": "pong" } 172.16.1.31 | SUCCESS => { "changed": false, "ping": "pong" } ``` ping模块没有参数,不用跟-e 2) 返回颜色 `ansible`会根据返回结果的类型不同,显示不同的颜色 * 绿色:查看远程主机信息,不会对远程主机系统做任何修改 * 红色:执行操作出现异常错误 * 黄色:对远程主机系统进行修改操作 * 粉色:警告或者忠告信息 ## 2 命令类常用模块 ansible模块列表 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html ### 2.1 command[命令模块] 1) 官方链接: http://docs.ansible.com/ansible/latest/modules/command_module.html 说明:该模块与shell模块类似,但不能识别特殊符号 2) 常用参数: ```sh free_form [必须]表示执行command模块时,必须要有linux合法命令信息,如ls chdir 在执行某个命令前,先切换目录 creates 判断一个文件是否存在,如果已经存在了,后面的命令就不会执行 removes 判断一个文件是否存在,如果不存在,后面的命令就不会执行 ``` 3) 举例 * chdir参数 ```sh [root@xxxx ~]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd" 172.16.1.31 | SUCCESS | rc=0 >> /tmp ``` * creates参数 ```sh [root@xxxx ~]# 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@xxxx ~]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname" 172.16.1.41 | SUCCESS | rc=0 >> backup ``` * removes参数 ```sh [root@xxxx ~]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname" 172.16.1.41 | SUCCESS | rc=0 >> backup [root@xxxx ~]# 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 ``` ### 2.2 shell[万能模块] 1) 官方链接 https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module 说明:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ; 2) 常用参数 ```sh free_form [必须]表示执行command模块时,必须要有linux合法命令信息,如ls chdir 在执行莫个命令前,先切换目录 creates 判断一个文件是否存在,如果已经存在了,后面的命令就不会执行 removes 判断一个文件是否存在,如果不存在,后面的命令就不会执行 ``` 3) 举例 ```sh [root@xxxx ~]# ansible 172.16.1.41 -m shell -a "hostname;pwd" 172.16.1.41 | SUCCESS | rc=0 >> backup /root ``` 可以使用该名模,执行所有linux的命令,所以叫万能模块 ### 2.3 script[脚本模块] 1) 官方连接 https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module 2) 常用参数 ```sh free_form [必须]表示执行command模块时,必须要有linux合法命令信息,如ls chdir 在执行莫个命令前,先切换目录 creates 判断一个文件是否存在,如果已经存在了,后面的命令就不会执行 removes 判断一个文件是否存在,如果不存在,后面的命令就不会执行 ``` 3) 举例 * 先查看脚本 ```sh [root@xxxx ~]# cat /server/scripts/mk.sh #!/bin/sh mkdir -p /root/abc/def touch /root/abc/123.txt ls -lh /root/abc/* ``` * 在调用这个脚本远程执行 ```sh [root@xxxx ~]# ansible 172.16.1.7 -m script -a "/server/scripts/mk.sh" 172.16.1.7 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.1.7 closed.\r\n", "stdout": "-rw-r--r-- 1 root root 0 6月 18 17:05 /root/abc/123.txt\r\n\r\n/root/abc/def:\r\n总用量 0\r\n", "stdout_lines": [ "-rw-r--r-- 1 root root 0 6月 18 17:05 /root/abc/123.txt", "", "/root/abc/def:", "总用量 0" ] } ``` ### 3 文件类常用模块 ### 3.1 copy[复制模块] 1) 官方链接: https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module 2) 常用参数 ```sh backup 对数据信息进行备份 src 定义要推送数据信息 dest [必须]定义将数据推送到远程主机什么目录中 owner 设置复制后的文件属主权限 group 设置复制后的文件属组权限 mode 设置复制后的文件权限(600 755) ``` 3) 举例 * backup参数 ```sh ansible 172.16.1.41 -m copy -a "src=/tmp/01.txt dest=/tmp/ backup=yes" ``` * src,dest参数 ```sh ansible 172.16.1.41 -m copy -a "src=/tmp/01.txt dest=/tmp/" ``` ### 3.2 file[文件操作模块] 1) 官方链接 https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module 2) 常见参数 ```sh src 定义要推送数据信息 dest [必须]定义将数据推送到远程主机什么目录中 owner 设置文件属主权限 group 设置文件属组权限 mode 设置文件权限(600 755) state 用于指定创建目录或文件 ``` 3) 举例 * 权限参数 ```sh ansible 172.16.1.7 -m file -a "dest=/tmp/01.txt owner=oldboy group=oldboy mode=600" ``` * state创建文件 ```sh ansible 172.16.1.41 -m file -a "dest=/tmp/02.txt state=touch" ``` * state创建目录 ```sh ansible 172.16.1.41 -m file -a "dest=/tmp/01dir state=directory" ``` ### 4 包管理.系统服务管理.定时任务模块 ### 4.1 yum[包管理模块] 1) 官方链接 https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module 2) 常用参数 ```sh name [必须]执行要安装软件的名称,以及软件的版本 state installed安装 absent(卸载) list 指定软件名称,查看软件是否可以安装,以及是否安装过 ``` 3) 举例 ```sh ansible 172.16.1.41 -m yum -a "name=iftop state=installed" ansible 172.16.1.41 -m yum -a "name=iftop state=absent" ansible 172.16.1.41 -m yum -a "list=iftop" ``` ### 4.2 service[系统服务管理模块] 1) 官方链接 https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module 2) 常用参数 ```sh name [必须]指定要管理的服务名称(管理的服务一定在chkconfig中可以看到) state stopped started restarted reloaded enabled yes表示服务开机自启动 no表示服务开机不要自动启动 ``` 3) 举例 ```sh ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes" ``` ### 4.3 cron[定时任务模块] 1) 官方链接 https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module 2) 常用参数 ```sh minute 分,写法同系统定时任务,如[0-59] [*] [*/n] hour 时,写法同上 day 日,写法同上 month 月,写法同上 weekday 周,写法同上 job 执行命令,如job='/bin/sh /server/scripts/test.sh &>/dev/null' ``` 3) 举例 * 添加定时任务 ```sh 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'" ``` * 删除定时任务 ```sh 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" ``` * 注释定时任务 ```sh 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"a ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no" ```