ansible安装配置和基本使用
一、ansible安装 ansible依赖于Python 2.6或更高的版本、paramiko、PyYAML及Jinja2。 1.1 编译安装 解决依赖关系 #yum-yinstallpython-jinja2PyYAMLpython-paramikopython-babelpython-crypto 解压安装包 #tarxfansible-1.5.4.tar.gz #cdansible-1.5.4 编译安装 #pythonsetup.pybuild #pythonsetup.pyinstall 拷贝配置文件 #mkdir/etc/ansible #cp-rexamples/*/etc/ansible 1.2 rpm包安装 使用阿里云镜像源即可,这里为了方便使用,就直接使用yum安装了。 Fedora用户可直接安装Ansible,但RHEL或CentOS用户,需要配置EPEL #yuminstall-yepel-release #yuminstall-yansible 注意:不同版本的ansible的功能差异可能较大。 二、配置 配置文件介绍: 配置文件:/etc/ansible/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密码 主机清单:/etc/ansible/hosts 主程序:ansible、ansible paly-book、ansible-doc 1.将要管理的主机纳入/etc/ansible/hosts配置文件中,可以填写IP或是主机名 [WebServers] 10.10.10.3 10.10.10.4 2.基于ssh的方式与被管理的主机进行通信,在管理的主机上(部署ansible的主机上)生成一对非对称密钥,将公钥发给被管理的主机。 (1)生成一对密钥:ssh-keygen -t rsa [root@wlmyum.repos.d]#ssh-keygen-trsa#默认存放的地方为/root/.ssh目录下 Generatingpublic/privatersakeypair. Enterfileinwhichtosavethekey(/root/.ssh/id_rsa): Enterpassphrase(emptyfornopassphrase): Entersamepassphraseagain: Youridentificationhasbeensavedin/root/.ssh/id_rsa. Yourpublickeyhasbeensavedin/root/.ssh/id_rsa.pub. Thekeyfingerprintis: e8:60:67:4d:29:90:d2:4d:7d:52:2f:c7:e4:87:a4:80root@wlm Thekey'srandomartp_w_picpathis: +--[RSA2048]----+ |..+.o...o| |.o.Eoo.B.| |..ooo*.| |=o.| |o+S| |.=| |.| || || +-----------------+ (2)将公钥发给要管理的主机:ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.3 [root@wlmyum.repos.d]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@10.10.10.4 Theauthenticityofhost'10.10.10.4(10.10.10.4)'can'tbeestablished. RSAkeyfingerprintis43:8a:cc:2c:6a:07:0e:16:17:04:b5:dd:2c:4a:9a:41. Areyousureyouwanttocontinueconnecting(yes/no)?yes /usr/bin/ssh-copy-id:INFO:attemptingtologinwiththenewkey(s),tofilteroutanythatarealreadyinstalled /usr/bin/ssh-copy-id:INFO:1key(s)remaintobeinstalled--ifyouarepromptednowitistoinstallthenewkeys root@10.10.10.4'spassword: Permissiondenied,pleasetryagain. root@10.10.10.4'spassword: Numberofkey(s)added:1 Nowtryloggingintothemachine,with:"ssh'root@10.10.10.4'" andchecktomakesurethatonlythekey(s)youwantedwereadded. 3.开始使用我们的第一条ansible命令,进行验证: #ansibleall-mping [root@wlmyum.repos.d]#ansibleall-mping 10.10.10.4|SUCCESS=>{ "changed":false, "ping":"pong" } 10.10.10.3|SUCCESS=>{ "changed":false, "ping":"pong" } 命令介绍: 简单实用格式:ansible<host-pattern>[-mmodule_name][-aargs][options] ansibleall-mping: all代表所有被管理的主机都进行操作-mping指定使用ping模块,ping通了返回的结果为pong 三、基本使用 1.常用命令 ansible-doc命令:获取模块列表,及模块使用格式; ansible-doc-l:获取列表 ansible-doc-smodule_name:获取指定模块的使用信息 2.ansible命令格式 ansible<host-pattern>[-fforks][-mmodule_name][-aargs] <host-pattern> 指明管控主机,以模式形式表示或者直接给定IP,必须事先定义在文件中;all设置所有 [-f forks] 指明每批管控多少主机,默认为5个主机一批次 [-m module_name] 使用何种模块管理操作,所有的操作都需要通过模块来指定 [-a args] 指明模块专用参数;args一般为key=value格式注意:command模块的参数非为kv格式,而是直接给出要执行的命令即可; 注意:<host-pattern>默认读取/etc/ansible/hosts,也可以指明自定义文件路径 -iPATH, --inventory=PATH:指明使用的host inventory文件路径; 3.常用模块介绍(module_name) 1)command模块:远程主机上运行命令 例如: ansibleWebServers-mcommand-a"ls/tmp" command模块可以省略,此命令可以直接写为: ansibleWebServers-a"ls/tmp" [root@wlmyum.repos.d]#ansibleWebServers-mcommand-a"ls/tmp" #WebServers组里的所有主机执行ls/tmp操作 10.10.10.4|SUCCESS|rc=0>> ansible_1DyyqF keyring-e9DiYC keyring-teKcdb orbit-gdm pulse-bcZcwuv9QjKR pulse-qnyrpnncnwcb 10.10.10.3|SUCCESS|rc=0>> ansible_itWaHf systemd-private-6d81b379511c48219f27f97e16064052-colord.service-RK8yfy systemd-private-6d81b379511c48219f27f97e16064052-cups.service-wm4x9x systemd-private-6d81b379511c48219f27f97e16064052-httpd.service-UXyj9P systemd-private-6d81b379511c48219f27f97e16064052-named.service-Nw7Sew systemd-private-6d81b379511c48219f27f97e16064052-rtkit-daemon.service-QM4tRC systemd-private-6d81b379511c48219f27f97e16064052-vmtoolsd.service-p58UCc 给远程主机添加用户,并设置密码: ansibleWebServers-a"useraddansible1" ansibleWebServers-a"echodtsdts|passwd--stdinansible1" #直接这样使用不会成功,不支持管道,下面介绍shell模块 [root@wlmyum.repos.d]#ansibleWebServers-a"useraddansible1" 10.10.10.4|SUCCESS|rc=0>> 10.10.10.3|SUCCESS|rc=0>> [root@wlmyum.repos.d]#ansibleWebServers-a"echodtsdts|passwd--stdinansible1" 10.10.10.4|SUCCESS|rc=0>> dtsdts|passwd-stdinansible1#只显示了“dtsdts|passwd--stdinansible1”内容 10.10.10.3|SUCCESS|rc=0>> dtsdts|passwd-stdinansible1 2)shell模块:远程主机在shell进程下运行命令,支持shell特性,当然也支持管道 给用户添加密码: ansibleWebServers-mshell-a"echodtsdts|passwd--stdinansible1" [root@wlmyum.repos.d]#ansibleWebServers-mshell-a"echodtsdts|passwd--stdinansible1" 10.10.10.4|SUCCESS|rc=0>> 更改用户ansible1的密码。 passwd:所有的身份验证令牌已经成功更新。 10.10.10.3|SUCCESS|rc=0>> 更改用户ansible1的密码。 passwd:所有的身份验证令牌已经成功更新。 3) copy模块:把当前主机文件复制到远程主机位置,可以指定mode(权限)、own(所属主)、group(所属组) ansibleall-mcopy-a"src=/tmp/abc.txtdest=/root/mode=644owner=ansible1group=root" #src="本地主机文件"dest="远程主机文件" [root@wlmyum.repos.d]#ansibleall-mcopy-a"src=/tmp/abc.txtdest=/root/" 10.10.10.4|SUCCESS=>{ "changed":true, "checksum":"325287cee456533bf76025312e5d05e842cb43a9", "dest":"/root/abc.txt", "gid":0, "group":"root", "md5sum":"1c6d47c6e4d59c630751b47fff140b89", "mode":"0644", "owner":"root", "size":15, "src":"/root/.ansible/tmp/ansible-tmp-1484639082.19-114656107854348/source", "state":"file", "uid":0 } 10.10.10.3|SUCCESS=>{ "changed":true, "checksum":"325287cee456533bf76025312e5d05e842cb43a9", "dest":"/root/abc.txt", "gid":0, "group":"root", "md5sum":"1c6d47c6e4d59c630751b47fff140b89", "mode":"0644", "owner":"root", "size":15, "src":"/root/.ansible/tmp/ansible-tmp-1484639082.46-26533455703361/source", "state":"file", "uid":0 } 4)cron模块:在远程主机制定crontab周期性计划任务 minute=hour=day=month=weekday=job=name=(必须填写)state= 例如: ansibleall-mcron-a"minute=*/10job='/sbin/ntpdate10.10.10.10&>/dev/null'name=Synctime" 在被管理的主机上使用crontab -l查看 [root@WebServer~]#crontab-l #Ansible:Synctime */10****/sbin/ntpdate10.10.10.10&>/dev/null 在管理(ansible)的主机上,可以删除制定的计划任务 ansibleall-mcron-a"state=absentname=Synctime"#name="name" [root@wlmyum.repos.d]#ansibleall-mcron-a"state=absentname=Synctime" 10.10.10.4|SUCCESS=>{ "changed":true, "envs":[], "jobs":[] } 10.10.10.3|SUCCESS=>{ "changed":true, "envs":[], "jobs":[] } 5)fetch模块:和copy相反,从远程主机拷贝文件到本地主机 ansibleWebServers-mfetch-a“src=/root/abc.txtdest=/root/kel/flat=yes” src="远程主机文件"dest="本地主机"可以不要flat=yes参数 flat=yes作用: 当dest=/root/kel/,abc.txt会保存在/root/kel/目录下 当dest=/root/kel,会拷贝abc.txt文件,并命名为kel 6)file模块:file模块它包含了文件、文件夹、超级链接类的创立、拷贝、移动、删除操作 ansibleWebServers-mfile-a #修改文件的所有组、人、权限。 path=/etc/foo.confowner=foogroup=foomode=0644 #操作链接的案例 src=/file/to/link/todest=/path/to/symlinkowner=foogroup=foostate=link #参数化案例 src=/tmp/{{item.path}}dest={{item.dest}}state=linkwith_items: -{path:'x',dest:'y'}-{path:'z',dest:'k'} #使用touch来创建一个空文件并定义权限 path=/etc/foo.confstate=touchmode="u=rw,g=r,o=r" #touch一个空文件,并且修改权限 path=/etc/foo.confstate=touchmode="u+rw,g-wx,o-rwx" 7)yum模块:用于yum安装包安装和卸载等操作 #ansibleWebServers-myum-a“name=httpd” #在远程主机上使用yum安装htpd服务 8)service模块:服务管理,就是service命令 ansibleall-mservice-a"" #不管当前什么情况,启动apache name=httpdstate=started #不管当前什么情况,停止apache name=httpdstate=stopped #不管当前什么情况,重启apache name=httpdstate=restarted #系统重启后,启动apache name=httpdenabled=yes 9) user/group模块:user模块,用于管理用户;group模块,用于管理group #ansibleall-muser-a"name=test01group=root" #添加一个test01用户,所属组为root #ansibleall-muser-a"name=test01state=absentremove=yes" #删除test01用户 #ansibleall-mgroup-a"name=testgrp01" #添加一个testgrp01的组 #ansibleall-mgroup-a"name=testgrp01state=absent" #删除组testgrp01 四、Playbooks剧本 playbooks是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。playbook组织格式为使用YAML语言来进行编写。 playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个paly组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。 YAML是用来写配置文件的,接下来的配置文件都是以yaml为后缀。 1.先来一个playbook的例子: 在ansible主机上的/root/下创建httpd目录,将本机的httpd.conf文件拷贝该目录下,修改配置文件里的监听的端口为8081 #vimweb.yaml#注意:文件一般以yaml为后缀 -hosts:WebServers#运行指定任务的目标主机 remote_user:root#在远程主机上执行任务的用户 tasks:#任务列表 -name:installhttpdpackage#设置任务名称,非必要 yum:name=httpdstate=present#使用yum模块安装httpd -name:installconfigurefile copy:src=/root/httpd/httpd.confdest=/etc/httpd/conf/#使用copy模块 -name:starthttpdservice service:name=httpdstate=started#使用service模块,start服务 测试: ansible-playbook --check playbook:只检测可能会发生的改变,但不真正执行操作; ansible-playbook playbook:直接执行 ansible-playbook --list-hosts:列出运行任务的主机; [root@wlmhttpd]#ansible-playbook--checkweb.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.3] ok:[10.10.10.11] TASK[installhttpdpackage]*************************************************** ok:[10.10.10.3] ok:[10.10.10.11] TASK[installconfigurefile]************************************************** changed:[10.10.10.11] ok:[10.10.10.3] TASK[starthttpdservice]***************************************************** ok:[10.10.10.3] ok:[10.10.10.11] PLAYRECAP********************************************************************* 10.10.10.11:ok=4changed=1unreachable=0failed=0 10.10.10.3:ok=4changed=0unreachable=0failed=0 [root@wlmhttpd]#ansible-playbookweb.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.3] ok:[10.10.10.11] TASK[installhttpdpackage]*************************************************** ok:[10.10.10.3] ok:[10.10.10.11] TASK[installconfigurefile]************************************************** ok:[10.10.10.3] ok:[10.10.10.11] TASK[starthttpdservice]***************************************************** changed:[10.10.10.11] changed:[10.10.10.3] PLAYRECAP********************************************************************* 10.10.10.11:ok=4changed=1unreachable=0failed=0 10.10.10.3:ok=4changed=1unreachable=0failed=0 2.通过这个事例的使用,下面来概括一下介绍playbook playbook的基础组件: Hosts:运行指定任务的目标主机 remoute_user:在远程主机上执行任务的用户 sudo_user: task:任务列表 格式: (1)action:module arguments (2) module:arguments 注意:shell和command模块后面直接跟命令,而非key=valume类的参数列表 设置在特定条件下触发: (1)某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers; handlers: 任务,在特定条件下触发; 接收到其他任务的通知是被触发; (2)任务可以通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用; 运行playbook的方式: (1)测试 ansible-playbook --check 只检测可能会发生的改变,但不真正执行操作; ansible-playbook --list-hosts 列出运行任务的主机; (2)运行 ansible-playbook 3.上面的脚本里,改变了配置文件之后会启动服务,但是不会重启服务,如果以后又改变配置文件,只有restart才会生效,那怎么实现了? 下面介绍handlers。 在特定条件下触发;接收到其他任务的通知时被触发。Tasks中的任务都是有状态的,changed或者ok。 在Ansible中,只在task的执行状态为changed的时候,才会执行该task调用的handler。Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了。我改了配置文件要重启吧。 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers; handlers: 任务,在特定条件下触发; 接收到其他任务的通知是被触发; 事例脚本如下: -hosts:WebServers remote_user:root tasks: -name:installhttpdpackage yum:name=httpdstate=present -name:installconfigurefile copy:src=/root/httpd/httpd.confdest=/etc/httpd/conf/ notify:restarthttpd#加notify标签,如果copy的执行结果为change,就会触发下面handlers里name:restarthttpd的操作 -name:starthttpdservice service:name=httpdstate=started handlers: -name:restarthttpd#这里的名称和notify是一致的 service:name=httpdstate=restarted#restarthttpd服务 测试(配置文件没有变动): [root@wlmhttpd]#ansible-playbook--checkweb_handlers.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.3] ok:[10.10.10.11] TASK[installhttpdpackage]*************************************************** ok:[10.10.10.3] ok:[10.10.10.11] TASK[installconfigurefile]************************************************** ok:[10.10.10.11] ok:[10.10.10.3] TASK[starthttpdservice]***************************************************** ok:[10.10.10.3] ok:[10.10.10.11] PLAYRECAP********************************************************************* 10.10.10.11:ok=4changed=0unreachable=0failed=0 10.10.10.3:ok=4changed=0unreachable=0failed=0 执行: [root@wlmhttpd]#ansible-playbookweb_handlers.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.3] ok:[10.10.10.11] TASK[installhttpdpackage]*************************************************** ok:[10.10.10.11] ok:[10.10.10.3] TASK[installconfigurefile]************************************************** ok:[10.10.10.3] ok:[10.10.10.11] TASK[starthttpdservice]***************************************************** ok:[10.10.10.11] ok:[10.10.10.3] PLAYRECAP********************************************************************* 10.10.10.11:ok=4changed=0unreachable=0failed=0 10.10.10.3:ok=4changed=0unreachable=0failed=0 修改了被管理主机上10.10.10.3上的配置文件后再执行: [root@wlmhttpd]#ansible-playbookweb_handlers.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.11] ok:[10.10.10.3] TASK[installhttpdpackage]*************************************************** ok:[10.10.10.11] ok:[10.10.10.3] TASK[installconfigurefile]************************************************** ok:[10.10.10.11] changed:[10.10.10.3] TASK[starthttpdservice]***************************************************** ok:[10.10.10.11] ok:[10.10.10.3] RUNNINGHANDLER[restarthttpd]************************************************ changed:[10.10.10.3] PLAYRECAP********************************************************************* 10.10.10.11:ok=4changed=0unreachable=0failed=0 10.10.10.3:ok=5changed=2unreachable=0failed=0 4.指定执行哪些name内的操作,添加tags标签 任务可以通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用; 在上一个脚本的基础上,添加tags标签操作,样例脚本如下: -hosts:WebServers remote_user:root tasks: -name:installhttpdpackage yum:name=httpdstate=present tags:insthttpd#添加tags标签,名称为insthttpd -name:installconfigurefile copy:src=/root/httpd/httpd.confdest=/etc/httpd/conf/ notify:restarthttpd tags:instconf#添加tags标签,名称为instconf -name:starthttpdservice service:name=httpdstate=started tags:starthttpd#添加tags标签,名称为starthttpd handlers: -name:restarthttpd service:name=httpdstate=restarted 执行: 在ansible-playbook命令上使用-t指定进行调用 [root@wlmhttpd]#ansible-playbook-tstarthttpdweb_handlers.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.3] ok:[10.10.10.11] TASK[starthttpdservice]***************************************************** ok:[10.10.10.11] ok:[10.10.10.3] #只执行了starthttpdservice PLAYRECAP********************************************************************* 10.10.10.11:ok=2changed=0unreachable=0failed=0 10.10.10.3:ok=2changed=0unreachable=0failed=0 [root@wlmhttpd]#ansible-playbook-tinstconfweb_handlers.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.11] ok:[10.10.10.3] TASK[installconfigurefile]************************************************** ok:[10.10.10.11] ok:[10.10.10.3] #值执行了installconfigurefile PLAYRECAP********************************************************************* 10.10.10.11:ok=2changed=0unreachable=0failed=0 10.10.10.3:ok=2changed=0unreachable=0failed=0 5.在playbook中使用变量 1)主机的系统变量(facts) ansible会通过module setup来收集主机的系统信息,这些收集到的系统信息叫做facts,这些facts信息可以直接以变量的形式使用。 哪些facts变量可以引用呢?在命令行上通过调用setup module命令可以查看 $ansibleall-msetup-uroot 怎样在playbook中使用facts变量呢,答案是直接使用: --- -hosts:all user:root tasks: -name:echosystem shell:echo{{ansible_os_family}} -nameinstallntponDebianlinux apt:name=gitstate=installed when:ansible_os_family=="Debian" -nameinstallntponredhatlinux yum:name=gitstate=present when:ansible_os_family=="RedHat" 2)ansible-playbook命令行中的自定义变量; -e VARS, --extra-vars=VARS 使用事例: vimname.yaml -hosts:WebServers remote_user:root vars: -pkgname:memcached#在playbook内部定义变量,变量名称为pkgname,值为memcached tasks: -name:installapackage yum:name={{pkgname}}state=present#使用name={{pkgname}}调用变量的值 测试: [root@wlm~]#ansible-playbook--syntax-checkname.yaml#语法检测 playbook:name.yaml [root@wlm~]#ansible-playbook--checkname.yaml#测试使用 PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.11] ok:[10.10.10.3] TASK[installapackage]******************************************************* changed:[10.10.10.11] changed:[10.10.10.3] PLAYRECAP********************************************************************* 10.10.10.11:ok=2changed=1unreachable=0failed=0 10.10.10.3:ok=2changed=1unreachable=0failed=0 手动指定变量(-e VARS):在执行脚本时,指定变量的值 [root@wlm~]#ansible-playbook-epkgname=httpd--checkname.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.11] ok:[10.10.10.3] TASK[installapackage]******************************************************* changed:[10.10.10.11] changed:[10.10.10.3] PLAYRECAP********************************************************************* 10.10.10.11:ok=2changed=1unreachable=0failed=0 10.10.10.3:ok=2changed=1unreachable=0failed=0 [root@wlm~]#ansible-playbook-epkgname=httpdname.yaml PLAY[WebServers]************************************************************** TASK[setup]******************************************************************* ok:[10.10.10.11] ok:[10.10.10.3] TASK[installapackage]******************************************************* 3) 通过roles传递变量; 4) Host Inventory 在/etc/ansible/hosts 文件里面编写 (a)向不同的主机传递不同的变量; IP/HOSTNAME varalable=value var2=value2 (b)向组中的主机传递相同的变量; [groupname:vars] variable=value invertory参数: 用于定义ansible远程连接目标主机是使用的参数,而非传递给playbook的变量; ansible_ssh_host ansible_ssh_port ansible_ssh_user ansible_ssh_pass ansible_sudo_pass