Ansible是一款自动化运维、批量管理服务器的工具,批量系统配置、程序部署、运行命令等功能。基于Python开发,基于ssh进行管理,不需要在被管理端安装任何软件。Ansible在管理远程主机的时候,只有是通过各种模块进行操作的。
需要关闭防火墙和SELinux,设置为disabled模式,然后重启服务器
![26bff7aa399849ceb86f9c7a50383f78.png](https://i-blog.csdnimg.cn/blog_migrate/3d46938875428ffaa115dc7ec9e292fc.png)
![4277c996f0c84a7196b9b596c4667b52.png](https://i-blog.csdnimg.cn/blog_migrate/775b2af7f0d7f1d1527cdddca22f09d6.png)
配置host让各个电脑能够通过域名访问
![2cafe6258260492690c2dee527fec0d1.png](https://i-blog.csdnimg.cn/blog_migrate/bb1f0a48730df04caa87b59899209908.png)
![72df9aaaab544cde94fdcc76251fdf4e.png](https://i-blog.csdnimg.cn/blog_migrate/49730879c652115b09b4837fa53e6129.png)
设置免密登录ssh-keygen,能够让control主机通过Ansible管理其他主机
![af80636b2ea6442192b759f53710e54f.png](https://i-blog.csdnimg.cn/blog_migrate/bc66be9a99b08a87d17a15db10055f44.png)
![1f73a764d6fa486895a021515ba24c28.png](https://i-blog.csdnimg.cn/blog_migrate/8148c798972c1e2fa16aae585b1a14aa.png)
查看登录情况
![5e5ab8db0cfc4e99a28d42e51154182b.png](https://i-blog.csdnimg.cn/blog_migrate/bbe58a74dffc841f2e73a8e7585d7176.png)
安装Ansible
![23bc3d6062f641918a140fc15f291ef7.png](https://i-blog.csdnimg.cn/blog_migrate/67d88fce11bf7a8e34681d6c02d8671f.png)
配置Ansible管理环境,创建Ansible目录在该目录进行对其他主机的配置。
![8e8a305e4fa342458a6a8766bfd4a69d.png](https://i-blog.csdnimg.cn/blog_migrate/7ac38e0c7fee367721e9d9fba56a3e3b.png)
参考/etc/ansible/ansible.cfg模板编辑ansible.cfg(文件名必须是ansible.cfg)
![d4e7bd566f2c4636a62f18464ea9fbed.png](https://i-blog.csdnimg.cn/blog_migrate/edc5a81b010b9c42c6277eccfabf8537.png)
![7ca6fe6c795348368f407c5dac5d64d5.png](https://i-blog.csdnimg.cn/blog_migrate/2105619dea1495eb2ed9b8753d565302.png)
inventory=hosts:主机清单,需要管理的主机,配置在当前目录的hosts文件中,文件名自定义、
![c6b4a2d38c044cefae3a3051ec98e4cd.png](https://i-blog.csdnimg.cn/blog_migrate/aa275bc142b5423b02164def739d87f6.png)
编辑主机清单文件[ ]中为组名,[ ]下面为组的成员。Node[3:4]简化,表示从3到4。ctrl+n表示补全内容。可以嵌套组cluster表示大组,webservers和database表示小组
![1e62033c58c148f6943fe1579480e663.png](https://i-blog.csdnimg.cn/blog_migrate/62e6131f83e7996ebbe72d71f3a6c3c4.png)
![184d78572ca94c49aca2899a61bd4a48.png](https://i-blog.csdnimg.cn/blog_migrate/bb61862b2b4abddfec0a91ad488634bf.png)
命令格式:ansible 主机集合 -m 模块名 -a " 参数 "。
查看主机:ansible all --host
![d147c23af9d0477489f9db8ca4d4c131.png](https://i-blog.csdnimg.cn/blog_migrate/7f9829655364679cfba38ef1b4cc2493.png)
查看组的成员
![6e195463210c4d1981adf72b3c50cd54.png](https://i-blog.csdnimg.cn/blog_migrate/5c0b675a90582378f3064f16afb404e7.png)
让所有的主机执行一条命令,如创建/tmp/abc目录(必须在~/ansible自己定义的里面有ansible.cfg文件ansible下面执行)
![62c76efe1f9448fb8948ba443127d0f6.png](https://i-blog.csdnimg.cn/blog_migrate/6dde61116a82a355013cd463cea4c0e6.png)
查看被管理的其他主机
![c2b239f2bb6c46eeb0597ae3bb000f38.png](https://i-blog.csdnimg.cn/blog_migrate/f40964d2e61701386a5c958012fcf1d6.png)
![44cd912d2e2b455d982356e47134eb0d.png](https://i-blog.csdnimg.cn/blog_migrate/a0eb1b549ae8d7c4dd0e114170041c6b.png)
ansible进行远程管理的两个方法:1、adhoc临时命令,就是在命令行上执行的管理命令如ansible all -a "mkdir /tmp/abc"。2、playbook剧本,把管理任务用特定格式写到文件中。无论那种方式都是通过模块加参数进行管理。
adhoc临时命令:ansible 主机或组列表 -m 模块(工具) -a "参数 "(-a是可选的)
ping模块:检测所有远程主机能否ping通(因为ping主机传递的回应时间不一样所以主机的顺序有时候不一样)
![9e7d2589960e4d3ca3f01a6df20b0c9f.png](https://i-blog.csdnimg.cn/blog_migrate/9ef523025cf3bdd88525fbba70270f53.png)
ansible-doc -l :查看所有的模块,大约有2834
![d00a173cd8244569b1fad9fad3933f3f.png](https://i-blog.csdnimg.cn/blog_migrate/9a92288cbcff5faccbb3063bc4256902.png)
![814028783c224707b4a0c4ed48a2e315.png](https://i-blog.csdnimg.cn/blog_migrate/0376c7046cf0d8dcdd6186096f227b06.png)
command模块:ansible默认模块,用于在远程主机上执行任意命令,如ansible all -a "mkdir /tmp/abc" ,command不支持shell特性,如管道、重定向
![b3144a14fa0341feac30de8b40cb3f74.png](https://i-blog.csdnimg.cn/blog_migrate/6b5c02d3de44fef8180417c6251e321d.png)
使用
shell模块能够使用管道符等基础命令
![b42fae945417434aac3085219429fd76.png](https://i-blog.csdnimg.cn/blog_migrate/0d8f519e1d4f92f8fbf37e2988a18247.png)
script模块:用于在远程主机上执行脚本。如在test组执行开启http服务的脚本
![146ad7004946481b8a364dff0d7a7483.png](https://i-blog.csdnimg.cn/blog_migrate/79c861af388da20b0f20af1b816d801b.png)
![3d2ef65b6ab44cd39bcb1d2ca14fd98c.png](https://i-blog.csdnimg.cn/blog_migrate/eaec1454ad177cca739fea546f1ce135.png)
此时Node1主机还没有安装http服务
![2feb1e693da743ed8da9e0b3ad40da92.png](https://i-blog.csdnimg.cn/blog_migrate/989a44f5ae1e07863a1bc67ec5d0bbed.png)
执行test组执行test.sh脚本
![0b1fef197d0f41e085ca7e99603194de.png](https://i-blog.csdnimg.cn/blog_migrate/a187fc0108e269d27d29ba074a67cd82.png)
查看http服务
![80cbf1363c584c2a834f807808051129.png](https://i-blog.csdnimg.cn/blog_migrate/c97186a395e70a85752f67d9df742366.png)
不建议使用command、shell和script模块,因为当执行脚本和创建文件第一次能够执行成功,但第二次有可能失败因为文件已经创建了,没有幂等性。
![b43fad427b5c41cc80ee41680ae7ed0c.png](https://i-blog.csdnimg.cn/blog_migrate/ac71ee9644ab08aa2e9548c747645a6e.png)
file模块:可以创建文件、目录、链接等,还可以修改权限、属性等。
常用的选项:path:指定文件路径。owner:设置文件所有者。group:设置文件所属组。mode:修改文件权限。state:状态,touch表示创建文件,directory表示创建目录,link表示创建软连接,absent表示删除。src:source的简写,原地址。dest:destination的简写,目标地址
使用file模块创建文件,执行几次都不会报错,绿色表示没有改动
![96f4e556427c465087f6c24ddfe6194c.png](https://i-blog.csdnimg.cn/blog_migrate/141c232f15c51604d046ad323177bc35.png)
ansible-doc file:查看模块的功能。搜索EXAMPLE查看file模块的案例
![c62bb19f19a44a0fb96f250d02e35d62.png](https://i-blog.csdnimg.cn/blog_migrate/c93bf307633e0fb939274cb21c3c4e2d.png)
![cbdea35643014da6886d12f2feb53623.png](https://i-blog.csdnimg.cn/blog_migrate/e34efe9e5f187864f0974d07806791ac.png)
在test主机上创建1.txt文件,黄色表示改动成功
![9080281b0e2240b99595ddccc3d55b64.png](https://i-blog.csdnimg.cn/blog_migrate/03d76887f1fe15784df7fe078e7c541c.png)
![2eedeedd0d564824b7128234045c524a.png](https://i-blog.csdnimg.cn/blog_migrate/9be21810dc2ba86f75ff0ef77b77f25a.png)
当在执行一次还是黄色,当使用touch创建文件不存在会创建文件,存在会修改文件的时间
![a34d3bd952f645a3a251671b8dc4a994.png](https://i-blog.csdnimg.cn/blog_migrate/263de7142535dc41bfeb6cccde8b9978.png)
ansible有期望模式,当目标主机有要执行的文件就会显示绿色,没有就会创建文件以满足期望为黄色。ansible test -m file -a "path=/tmp/1.txt owner=sshd group=amd mode=0777"
![3dd12d8e53f84e64a6b5876949865680.png](https://i-blog.csdnimg.cn/blog_migrate/b96f8247109a3cb783a9472bb21a1ffb.png)
此时查看修改成功。
![254093eb256543c1b04c119c8bd0b32e.png](https://i-blog.csdnimg.cn/blog_migrate/53b55d3b0cfaf32fdce1d8b0c6b7dae7.png)
删除文件absent。ansible test -m file -a "path=/tmp/1.txt state=absent"
![ba4e1e088b4b4e77826d67369d72b109.png](https://i-blog.csdnimg.cn/blog_migrate/557c9b5f8838ebcb0df7381eaadf8c7b.png)
创建软连接link。 ansible test -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"
![13b8fbd12eb045449e7f3a42ff853fd3.png](https://i-blog.csdnimg.cn/blog_migrate/555fff28b65438059cce3890bdf3f2ef.png)
![df38f1adb3f74ec7bb24627277bd139f.png](https://i-blog.csdnimg.cn/blog_migrate/1c480dc7e18ca97ee0fe5ff91f33d814.png)
copy模块:用于将文件从控制端拷贝(上传)到被控端。
常用选项:src:源地址,控制端的文件路径。dest:目标地址,被控制端的文件路径。content:内容,需要写到文件中的内容。owner:设置文件所有者。group:设置文件所属组。mode:修改文件权限。
将文件拷贝到test主机中。 ansible test -m copy -a "src=a.txt dest=/root"
![6b3a49976f174ce58d28b80ab89d7e48.png](https://i-blog.csdnimg.cn/blog_migrate/8df7c9e53cc1676d1d1ffe707b76e936.png)
![70329ad2432d441bbbccfcac1420ff85.png](https://i-blog.csdnimg.cn/blog_migrate/c42deb57cf03caaac87f918f27cbfcd1.png)
可以上传目录但必须是非空目录才能上传,否则传递不了
![24dc26a3d44449fb96b2d6c51ef87a3a.png](https://i-blog.csdnimg.cn/blog_migrate/64d9bd5ce19de947bb9052a7b856a5f7.png)
当被控主机的SELinux不是disabled需要安装Python3-libselinux软件包
让被控主机自己创建文件并指定内容为什么。
ansible test -m copy -a "dest=/tmp/test.txt content='hello world\n'"
![ad483b543cbd447299893880b3d57f58.png](https://i-blog.csdnimg.cn/blog_migrate/8cc4c14228382e99d34b9ebdb26f78a1.png)
![66c2cf2d3e934dac86ef37a3cddcf18e.png](https://i-blog.csdnimg.cn/blog_migrate/be5af58ef25778f34917f67ac266931c.png)
fetch模块:下载。src:源地址,被控制端的文件路径。dest:目标地址,控制到的文件路径。下载的必须是文件,不能下载目录。
将目标主机的文件下载到本地用户的家目录下面。 ansible webservers -m fetch -a "src=/etc/hostname dest=~/"
![a7b564c2c7b0420b912461c874a9af84.png](https://i-blog.csdnimg.cn/blog_migrate/a8a97c74ed60de284ff4fee49aa4a30a.png)
![7ffecf3f531d4b4da1d996789623ba4b.png](https://i-blog.csdnimg.cn/blog_migrate/0fb7e7b0bef50cd3cbb9b1ce0bb630b9.png)
lineinfile模块:用于确保目标文件中有某一行内容。
常用选项:path:待修改的文件路径。line:写入文件的一行内容。regexp:正则表达式,用于查找文件中的内容。
test的主机的/etc/issue文件中一定要有一行“hello world"的字符串,如果没有默认添加到文件结尾
![ff856a73014c431fa145515b2281fa9a.png](https://i-blog.csdnimg.cn/blog_migrate/6448a3b368eccaf179c51e4e58ac864c.png)
![61945fc311a240ecb454d149bb4c954d.png](https://i-blog.csdnimg.cn/blog_migrate/d233557827272438a403da8e35b43f96.png)
当再次输入该命令后文件中的helloworld也只有一行
![e5b5ab0efa844f6ab0b47a6225e4caf2.png](https://i-blog.csdnimg.cn/blog_migrate/8fd6a90dd82bf3f5ab00108d14387e1f.png)
![355f23c7438f49e39d9abf5c96877c43.png](https://i-blog.csdnimg.cn/blog_migrate/0bba663a0b2728e7afa624ef49c7d108.png)
让/etc/issue文件中有hello字符串的一行替换成“123456”,如果没有找到“hello”的字符串行就会在文件的末尾添加“123456”
![ae12a1187a884aa88c0e1dcb58176b1d.png](https://i-blog.csdnimg.cn/blog_migrate/2b10c1174c1e7b42eb7aa5514c6ee378.png)
![e79e00992c874d1eb8b0cc079be8ea77.png](https://i-blog.csdnimg.cn/blog_migrate/40767783c0bb8e53c27095a236bacb75.png)
再次输入该命令就会在我就的末尾添加123456
![2deafe3323924f60a5e75d96fd9f8299.png](https://i-blog.csdnimg.cn/blog_migrate/f32c7bba3736fa2fff66afa1573177f9.png)
replace模块:lineinfile会替换一行,replace可以替换关键字。
常用选项:path:待修改的文件路径。replace:将正则表达式查到的内容,替换成replace的内容。regexp:正则表达式,用于查找文件中的内容。
将/etc/issue文件中的123替换为abc
![d7dab77fa52a42bfbce5e2f1f2317c18.png](https://i-blog.csdnimg.cn/blog_migrate/01230894293e7caa40e68cdbd1c25f3d.png)
![78ac13c8b58f403f82977978dd7966ee.png](https://i-blog.csdnimg.cn/blog_migrate/8f124bcf5bd1ab1b5be89430b32a74c9.png)
练习:
在目标主机上创建/tmp/my目录,属主和属组都是adm,权限为0777
ansible test -m file -a "path=/tmp/my state=directory owner=adm group=adm mode='0777'"
![9df249420c354a3ca42e8b8052eb6dbf.png](https://i-blog.csdnimg.cn/blog_migrate/30edc5a17061a8d7cbd44e10315bbd03.png)
![5aaa54c4672b4a6b9c152b53a8439c1e.png](https://i-blog.csdnimg.cn/blog_migrate/05138b3715516a575b4a17f491ca1503.png)
将控制端的/etc/hosts文件上传到目标主机的/tmp/my目录中,属主和属组都是adm,权限为0600
ansible test -m copy -a "src=/etc/hosts dest=/tmp/my owner=adm group=adm mode=0600"
![bc407ced992445669eb57b096d9f93ff.png](https://i-blog.csdnimg.cn/blog_migrate/4300564cb35db0f3f3866c111a958349.png)
![8384c44ae2294c64b5a110cfef54cff5.png](https://i-blog.csdnimg.cn/blog_migrate/2b299cb99bd7c7d4b44f99f7502d01a0.png)
替换目标主机/tmp/my/host文件中的Node4为server4
ansible test -m replace -a "path=/tmp/my/hosts regexp='Node4' replace='server4'"
![a5fa275ae292475d9cd822d26b49b5e5.png](https://i-blog.csdnimg.cn/blog_migrate/3caeabd7df7fda0abf1e879ad77ce594.png)
![34b98ceb9e2541318d1a7bd501866987.png](https://i-blog.csdnimg.cn/blog_migrate/17de66a29fa8bd3405cccde9923fbcea.png)
将目标主机/tmp/my/hosts文件下载到控制端的当前目录
ansible test -m fetch -a "src=/tmp/my/hosts dest=."
![13f66f1300ab420488c501464a399834.png](https://i-blog.csdnimg.cn/blog_migrate/e11805459ba29eb101229e86c3977812.png)
![0f9dd51b3d2c47babe4e318e160285a0.png](https://i-blog.csdnimg.cn/blog_migrate/fd3c2db7de35f45bb2c563c9adde8559.png)
![d75eec7b63bb4bd2acff953d8d2248aa.png](https://i-blog.csdnimg.cn/blog_migrate/9e9d783111a0e2a36f16f720119889de.png)
user模块:实现Linux用户管理。
常用选项:name:待创建的用户名。uid:用户ID。group:设置主组,groups:设置附加组。home:设置家目录。password:设置用户密码。state:状态,present表示创建,它是默认选项,absent表示删除。remove:删除用户家目录、邮箱等,值为yes或true都可以。
创建用户lisi
![489bc6867bb04013ab02394b9facc743.png](https://i-blog.csdnimg.cn/blog_migrate/3177e07779ee5445f253b861606bc9e0.png)
![6ef47f0b922344688ea7f1e071be2db1.png](https://i-blog.csdnimg.cn/blog_migrate/98b6332b528c00ad2a59127aa9c9ccb4.png)
创建用户wangwu,UID为1111,属组为adm,附加组为root,家目录为/home/wangwu(默认可以不写)。
ansible test -m user -a "name=wangwu uid=1111 group=adm groups=root home=/home/wangwu"
![101b2a2f4b5240e79f0fa4e4912ba1c0.png](https://i-blog.csdnimg.cn/blog_migrate/bceed9054e7bac1c19fdc0a3d1dfa78e.png)
![e50e27bc2f9442a8b538b74b007df97b.png](https://i-blog.csdnimg.cn/blog_migrate/b6efc927a4373d0e07a316f46f469f4e.png)
添加lisi用户密码。此时设置的密码没有生效
![603a9378ae7442aabc2f568fff74482a.png](https://i-blog.csdnimg.cn/blog_migrate/0c3f95bff052e68fab7b6afc9cc76074.png)
![283856f9eb6e4cd6b89cce47e845c8e4.png](https://i-blog.csdnimg.cn/blog_migrate/80838fb733fdbe1ba79bfa59841215b2.png)
需要设置加密密码,将123456给sha512算法进行加密。
ansible test -m user -a "name=lisi password={{'123456'|password_hash('sha512')}}"
![5444c3ec40174c6bb1f8476d5b9c916c.png](https://i-blog.csdnimg.cn/blog_migrate/a60ae4d844e73a547683f2f61df4b582.png)
此时设置的密码才会生效
![885e097eaaf940d1806ff0967e9f11d2.png](https://i-blog.csdnimg.cn/blog_migrate/9e8a7ad066c3cfd263a18fd6fbea4602.png)
删除lisi用户,添加remove=yes才能把用户的家目录给删除否则该用户的家目录还在。
![217f7eeaadc64925ad7be389a70f1a91.png](https://i-blog.csdnimg.cn/blog_migrate/148540718d0144619d60360aca1d18db.png)
此时用户的家目录还在
![5ad5a3ef1f364db4984121fd6f4cb6eb.png](https://i-blog.csdnimg.cn/blog_migrate/6cd53bec778a91f3a6dbf8641cb8073c.png)
删除wangwu用户使用remove
![f01b72a0cc764c9992c269440ada5341.png](https://i-blog.csdnimg.cn/blog_migrate/6c887143c9746a16419d20edfd5a76f1.png)
此时用户的家目录就被删除了
![f41682d9d85d41f0a567c35f571a4dfc.png](https://i-blog.csdnimg.cn/blog_migrate/2c8cde221b338dc1e140cfa1af37834b.png)
group模块:创建、删除组。
常用选项:name:待创建的组名。gid:组的ID号。state:present表示创建,它是默认选项,absent表示删除。
创建组。ansible test -m group -a "name=devops"
![1a479d8c6a2e458c95b1aeac0e2c8036.png](https://i-blog.csdnimg.cn/blog_migrate/529db58b8cab3fe93301a25bd724eb1d.png)
删除组。ansible test -m group -a "name=devops state=absent"
![4cf3a6fc5d5242358478d9ddbfc7d721.png](https://i-blog.csdnimg.cn/blog_migrate/0eeb56fe8e4b98cb83c01f602e8a7f3e.png)
yum_repository模块:用于配置yum。
常用选项:file:指定文件名。name:yum标签。description:yum的描述信息。baseurl:yum的位置。enabled:仓库是否启用,填yes或no。gpgcheck:是否检测红帽填yes或no。
对test主机添加yum。
ansible test -m yum_repository -a "file=myrhel8 name=Appstream description=appstream baseurl=ftp://192.168.88.240/rhel/AppStream/ enabled=yes gpgcheck=no"
![659297aecf1047fa8e60c1a48674e7fd.png](https://i-blog.csdnimg.cn/blog_migrate/5ad02cfbd65877c0aed727d5577c9bf9.png)
![266defa15934405e8949fe70e68283bc.png](https://i-blog.csdnimg.cn/blog_migrate/22f695ed5a2b55802e8e0b43a1e192df.png)
![1de70c298110449ca73ac301f391aedb.png](https://i-blog.csdnimg.cn/blog_migrate/0b3a5feeb99913298d8ff652ecbb6d68.png)
添加BaseOS。
ansible test -m yum_repository -a "file=myrhel8 name=BaseOS description=baseos baseurl=ftp://192.168.88.240/rhel/BaseOS/ enabled=yes gpgcheck=no"
![b0b8e1a0c803459089bf02d94de5d8e7.png](https://i-blog.csdnimg.cn/blog_migrate/9aaaa69b2639e65956977ab16172f6a7.png)
![f9045dd769e349529ab3d667329a1fb7.png](https://i-blog.csdnimg.cn/blog_migrate/ec2c9662d34bc25326316a4c7756a759.png)
yum模块:用于RPM软件包管理,如安装、升级、卸载。
常用选项:name:包名。state:状态,present表示安装,如已安装则忽略(默认选项)。latest:表示安装或升级到最新版本,absent表示卸载,
安装wget软件包。
![10e9840d350747d8920afc4419005204.png](https://i-blog.csdnimg.cn/blog_migrate/89c5a5f8d5b5633d1832fa6b1d76bc1d.png)
卸载
![ee27383c14664b90badd1faa883ef36c.png](https://i-blog.csdnimg.cn/blog_migrate/02e58ae1ef089f84bc18240c67d70fc6.png)
安装http。并且为最新版本。绿色表示已经安装并且为最新版本
![515dadb925704d8da2a5bae7769f6080.png](https://i-blog.csdnimg.cn/blog_migrate/c4ea5257777b047c29cdb49b839bf7f9.png)
service模块:管理服务的开启、关闭
常用选项:name:控制的服务名。state:started:开启服务,stopped表示关闭,restarted表示重新开启。enabled:是否开机自启动,填yes或no。
开启httpd服务,设置开机自启动
![eb8acca315f24554967375bf6abd1bfd.png](https://i-blog.csdnimg.cn/blog_migrate/e76377e5ece0a55e70b8f09406909c51.png)
查看httpd服务的状态
![c5d6aaf39d4243bf973ffe72ae37fa3c.png](https://i-blog.csdnimg.cn/blog_migrate/48640a527276da4bbb7f7bd9df34771a.png)