A-A+
系统运维|Ansible 介绍、安装配置及常用模块解析-syscto.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。 1.ansible的安装直接用yum安装,配置好epel源即可。 ansible工作模式 前面学习使用的都是基于ansible的push模式工作,即不要在远程主机做任何操作只需要在控制机编排playbook,push到远程主机即可完成任务。 另一个工作模式就是pull pull模式使用场景: 被控节点在配置时不可用,比如自动伸缩的服务池 被控节点较多,控制机资源有限无法满足高线程和低时间的运行效率 工作流程: 每台被控端需要安装ansible和git(svn) 所有的配置及playbooks都存放在git仓库 被控制端的ansible-pull计划任务会定期检查给定的git和tag或者分支 ansible-pull执行的playbooks即local.yml或者hostname.yml 每次更改playbooks只需要提交到git即可 2.ansible安装目录在/etc/ansible下。 服务器环境 192.168.32.200:作为ansible管理节点 192.168.32.202:被管理节点 ansible.cfg配置文件 hostfile=/etc/ansible/hosts #指定默认hosts配置的位置 host_key_checking = False #不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤 ask_pass=True # 每次执行ansible命令是否询问ssh密码 ask_sudo_pass=True # 每次执行ansible命令时是否询问sudo密码 3.首先在ansible管理节点上修改hosts文件 cd /etc/ansible/ vim hosts // 在最后一行加入以下内容 [test] 192.168.32.202 4.ssh-keygen -P '' 生成公钥 ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.32.202 //将公钥文件传输到各节点上 5.示例 Ansible有一个非常有用的模块是 command,相信很多人都需要它!Command模块就是“远程执行命令” 相比Ansible的内置模块而言,Command模块无法通过返回值来判断命令是否执行成功。 但Ansible添加了creates 和 removes 的属性,以此检查命令是否成功执行或者是否应该被执行。 如果你定义了 creates 属性,当文件已存在时,它不会再执行。相反如果定义了 removes 属性, 则只有文件存在的情况下命令才会被执行 ansible webhosts -m command -a 'rm -rf /tmp/test removes=/tmp/test' 192.168.32.202 | success | rc=0 >> 如果“受控节点”上 /tmp/testfile 并不存在,Ansible则提示跳过,输出如下: MachineName | skipped 否则,如果文件存在,则返回成功: ansible test -m command -a 'date' //command和shell模块可以在被控端执行命令 192.168.32.202 | success | rc=0 >> Sat Jan 10 16:13:44 EST 2015 ansible webhosts -m shell -a 'date' Enter passphrase for key '/root/.ssh/id_rsa': 输入公钥密码 192.168.32.202 | success | rc=0 >> Sat Jan 10 16:17:40 EST 2015 安装软件和启动服务。yum,service模块 ansible test -m yum -a 'name=vsftpd state=present' // yum模块远程安装软件 ansible test -m service -a ‘name=vsftpd state=started enabled=yes’ 支持管道的命令:raw模块,类似于shell模块 ansible test -m raw -a 'ifconfig | grep eth0' 搜集系统信息并以主机名为文件分别保存在/tmp目录 ansible all -m setup --tree /tmp/ 搜集和内存相关的信息 ansible all -m setup -a 'filter=ansible_*_mb' roles目录结构说明 tasks,handlers,vars(只对当前role有效),files存放文件,ansible默认会从这里找文件,对应task里面 的copy,script模块。 template存放模板,对应task里面的template模板。task存放任务,include默认 读取这里的任务。 查看系统信息 ansible test -m setup 字段名 参考值 含义 ansible_architecture x86_64 受控节点系统框架 ansible_distribution CentOS 受控节点的操作系统发行版 ansible_distribution_version 6.3 受控节点发行版本的版本号 ansible_domain kisops.org 受控节点的主域名 ansible_fqdn site01.kisops.org 受控节点的完整机器名 ansible_interfaces [“lo”,”eth0”] 列出受控节点所有的网卡 ansible_kernel 2.6.32-431.5.1.el6.x86_64 受控节点的内核版本号 ansible_memtotal_mb 30099 受控节点总内存大小(兆) ansible_processor_count 24 受控节点的CPU核心 ansible_virualization_role guest 受控节点的身份:host为宿主机,guest为虚拟机 ansible_virtualization_type kvm 受控节点的虚拟化类型 Ansible还有一个基础模块叫file,顾名思义是与文件相关的。 它可以用于查看文件的属性、修改文件属性、查询文件是否被修改等等 ansible test -u root -m file -a 'path=/etc/fstab' 192.168.32.202 | success >> { "changed": false, "gid": 0, "group": "root", "mode": "0644", "owner": "root", "path": "/etc/fstab", "size": 779, "state": "file", "uid": 0 } 在/tmp目录以nobody用户的身份创建一个test的文件夹 ansible test -u root -m file -a 'path=/tmp/test state=directory mode=755 owner=nobody' 192.168.32.202 | success >> { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "nobody", "path": "/tmp/test", "size": 4096, "state": "directory", "uid": 99 } 如果目录不存在或属性和预设的不一致,Changed的值就为True。 如果相同(比如重复执行指令),Changed的值将变为False。 copy模块。Copy模块的作用就是从“控制节点”上拷贝文件到“受控节点”上。 ansible test -m copy -a 'src=/etc/fstab dest=/tmp/fstab mode=644 owner=root' 192.168.32.202 | success >> { "changed": true, "checksum": "0eafb3ce197c848fca254e3a1356934a96f310bf", "dest": "/tmp/fstab", "gid": 0, "group": "root", "md5sum": "99f84827ef399f896305ca09ce1c668a", "mode": "0644", "owner": "root", "size": 805, "src": "/root/.ansible/tmp/ansible-tmp-1420871736.8-93337290722652/source", "state": "file", "uid": 0 } 查看当前登录的用户 ansible -i hosts all -a 'whoami' Enter passphrase for key '/root/.ssh/id_rsa': 192.168.32.202 | success | rc=0 >> root 这是一条ad-hoc命令——临时执行命令,ad-hoc是ansible里的一个概念, 在上面命令中就是 -a , 默认ansible执行时会从该配置中加载hosts配置,因此可以通过修改.ansible.cfg来指定默认的hosts文件地址: # .ansible.cfg [defaults] hostfile=/etc/ansible/hosts 查看ansible的模块 ansible-doc -l ansible-doc file查看制定模块的帮忙信息,以file模块为例 ansible命令参数介绍 -m:要执行的模块,默认为command -a:模块的参数 -u:ssh连接的用户名,默认用root,ansible.cfg中可以配置 -k:提示输入ssh登录密码。当使用密码验证的时候用 -s:sudo运行 -U:sudo到那个用户,默认为root -K:提示输入sudo密码,当不是NOPASSWD模式时使用 -C:只是测试一下会改变什么内容,不会真正去执行 -c:连接类型(default=smart) -D:diff -f:fork多少个进程并发处理,默认为5个 -i:指定hosts文件路径,默认default=/etc/ansible/hosts -I 指定pattern,对<host_pattern>已匹配的主机中再过滤一次 --list-hosts:只打印有哪些主机会执行这个playbook文件,不是实际执行 -M:要执行的模块路径,默认为/usr/share/ansible -o:压缩输出,摘要输出 --private-key 私钥路径 -T: ssh连接超时时间,默认10秒 -t:日志输出到该目录,日志文件名以主机名命名 -v:verbost --limit 明确排查某些主机或组,在ansible1.2开始。排除一个文件中的足迹可以用“@” -B:表示后台执行的时间 表示统配inventory中的所有主机 : all 或者 * 匹配一个组的特定标号的主机 test[0] 表示匹配test组中的第一个主机 test[0:25] 表示匹配test组中的第一个到第二十五个主机(“:”表示范围,测试发现应该使用“-”) 默认情况下ansible会记录一些模块的参数等信息到每个被监控端的syslog日志里,除非在任务或者剧本里设 置了no_log:True会不记录日志 使用file模块删除文件或者目录 ansible test -m file -a "/tmp/test state=absent" user模块 对于创建新用户和更改删除用户很方便 在首次连接时会出现检查keys的提示 解决办法: vim /etc/ansible/ansible.cfg host_key_checking=False playbook(剧本),顾名思义,就是需要定义一个脚本或者说配置文件,然后定义好做什么。 ansible-playbook http.yml --syntax-check 检查playbook的语法 ansible-playbook playbook.yml --list-hosts 查看一个playbook会对那些主机产生影响 ansible-playbook playbook.yml --list-tasks 查看都有那些任务要执行 playbook的组成 target section 定义将要执行playbook的远程主机组 variable section :定义playbook运行时需要使用的变量 task section:定义将要在远程主机上执行的任务列表 handler section:定义task执行完后需要调用的任务 一个简单的playbook是这样的,把当前用户名输出到whoami.rst文件中: # playbook.yml --- - hosts: webhosts # hosts中指定 remote_user: root # 如果和当前用户一样,则无需指定 tasks: - name: whoami shell: 'whoami > whoami.rst' hosts后面根据webhosts是从hosts中读取的,tasks是是关键词,指明了要执行哪些任务; 下面的name是任务的名称,shell是前面提到的module(模块),单引号中是命令。 使用playbook批量安装软件 vim ftp.yml --- - hosts: webhosts # hosts中指定 tasks: - name: yum -y install ftp shell: yum -y install ftp ansible-playbook ftp.yml PLAY [webhosts] *************************************************************** GATHERING FACTS *************************************************************** Enter passphrase for key '/root/.ssh/id_rsa': ok: [192.168.32.202] TASK: [yum -y install ftp] **************************************************** changed: [192.168.32.202] PLAY RECAP ******************************************************************** 192.168.32.202 : ok=2 changed=1 unreachable=0 failed=0 ansible实时批量执行脚本 ansible all -m script -a “/root/123.sh” 解决在运行ansible的时候会挑出一些warnning vim /etc/ansible/ansible.cfg system_warnings = False 如果客户端的ssh端口不是22的话,需要修改hosts [server] 172.16.21.102:16861 172.16.21.103:16861 ansible_ssh_port=16861 ansible 使用yml文件时如何取消回执信息: 在yml文件里添加gather_facts: no |