Ansible教程
  SCeAm4eXcUNH 2023年11月02日 37 0

Ansible特点: 基于Python开发,非常容易进行二次开发。 Ansible丰富的内置模块,基本可以满足一切需求 管理模式非常简单,一条命令可以影响上千台机器。 无客户端模式,底层通过SSH通信


Ansible原理介绍: Ansible没有客户端,也不需要在被管理主机添加代理程序,通过SSH完成底层通信,而SSH在Linux中默认已经存在,在Windows中需要powershell,ansible要求管理端必须是Linux操作系统,在管理节点通过应用模块将指令发送到被管理主机上,并在执行完毕后自动删除临时文件。


Ansible使用中的不同角色,可以分为以下三大部分: 使用者:使用Ansible实现自动化运维控制端; Ansible工具集:ansible可以实现的功能; 作用对象:Ansible可以影响的主机。


实验环境: 一台Ansible:192.168.3.1 被控端host1:192.168.3.2 被控端host2:192.168.3.3


一.准备工作:

可以访问公网


二.安装Ansible:

[root@ansible ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@ansible ~]# yum -y install ansible

验证安装结果:

[root@ansible yum]# ansible --version
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

三.创建SSH交互免密登录: Ansible通过ssh对设备进行管理,而ssh包含两种认证方式:一是通过密码认证,二是通过密钥对认证,前者是必须和系统交互,而后者是免交互登陆。如希望通过ansible自动管理设备,应该配置为免交互式登录被管理设备。

[root@ansible ~]# ssh-keygen -t rsa						#生成密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:IXw+ZtlGQWZ805oSWy9WHhiDYHHquOYOs7OG6D61X2I root@ansible
The key's randomart image is:
+---[RSA 2048]----+
|        +=*.o+   |
|     . . =+.=.+  |
|      o + .= B . |
|       * =o = o  |
|      . S oo .   |
|   .   + o       |
| ...+Eo.         |
|....+*o          |
|oo..+=o          |
+----[SHA256]-----+
[root@ansible ~]# ssh-copy-id root@192.168.3.2			#将自己的密钥上传到被远程节点服务器
[root@ansible ~]# ssh 192.168.3.2
[root@host1 ~]# exit
[root@ansible ~]# ssh-copy-id root@192.168.3.3
[root@ansible ~]# ssh 192.168.3.3
[root@host2 ~]# exit

四.配置Ansible: Ansible通过将设备列表以分组的方式添加到/etc/ansible/hosts文件来实现对设备进行管理,所以在正式管理之前,首先要编写hosts文件,hosts文件中,以[ ]包含的部分代表组名,列表支持主机名和IP地址,默认情况下,通过访问22号端口来管理设备,若目标主机上使用了非默认的ssh端口,还可以在主机名称之后使用冒号加端口号表明,以行为单位分割配置。另外,hosts文件还支持通配符。

[root@ansible ~]# vim /etc/ansible/hosts
[web]
192.168.3.2
192.168.3.3
[ftp]
ftp.benet.com:222		##通过222端口进行管理
[mail]
zs1.accp.com
zs[2:5].accp.com 		##[2:5]表示2~5之间的所有数字,即表示zs2.accp.com,zs3.accp.com...

可以将同一个主机同时归属不同的组中 配置完成后可以真多hosts定义的组进行远程操作,也可以针对组中的某一个或多个主机进行操作。


五.进行指定化批量操控: Ansible 返回的值非常友好,一般会用三种颜色来表示执行结果: *绿色:表示执行成功并且没有对目标机器做修改 *红色:表示执行过程有异常 *黄色:表示命令执行后有状态变化 1、对web组中的192.168.3.2主机操作,通过-limit参数限定主机的变更。

[root@ansible ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.3.2"

Ansible教程_配置文件

此处没有开启httpd服务,所有会标红报错,如果出先这个说明已经可以进行远程批量操控

2、只对192.168.3.2主机操作,通过IP限定主机的变更。

[root@ansible ~]# ansible 192.168.3.2 -m command -a "systemctl status httpd"

Ansible教程_配置文件_02

此处为绿,则表示该重启http服务操作执行成功

3、只对192.168.3.0网段的主机操作,通过通配符限定主机的变更。

[root@ansible ~]# ansible 192.168.3.* -m command -a "systemctl status httpd"

Ansible教程_vim_03

此处标明对两台3网段的服务器成功进行了重启操作

4、根据组,批量化进行变更。

[root@ansible ~]# ansible web -m command -a “systemctl status httpd”

Ansible教程_vim_04

此处亦为操作成功进行


六.Ansible的命令:1.ansible Ansible是生产环境中使用非常频繁的命令之一,主要在以下场景使用: 非固化需求:非固定操作 临时一次性操作 二次开发接口调用

ansible命令详解:ansible [options] -v ##打印详细信息 -i 文件位置 ##指定hosts文件的存放位置 -f 进程数量 ##指定fork出的进程数量值 -m 模块名称 ##指定模块名称,默认模块名称为command -a 模块的参数或命令 ##指定module模块的参数或者命令 -k 密码 ##手动指定SSH的密码 -sudo 基于sudo用户指定 -u 用户名 ##指定执行用户 -C 测试指定过程 ##测试,不改变真实内容,相当于预演 -T 指定命令超时时间单位为秒 ##超时时间,默认是10s --version ##查看ansible的版本信息

eg: a:检查所有主机是否存活:

[root@ansible ~]# ansible all -f 5 -m ping

Ansible教程_vim_05

b:列出web组中所有的列表:

[root@ansible ~]# ansible web --list

Ansible教程_Ansible_06

c:批量显示web组中磁盘的空间:

[root@ansible ~]# ansible web -m command -a "df -hT"

Ansible教程_Ansible_07

d.查看硬件信息

[root@ansible ~]# ansible 192.168.3.2 -m setup [root@ansible ~]#
ansible 192.168.3.2 -m setup -a "filter=ansible_ens34"

Ansible教程_Ansible_08

2.ansible-doc

ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对背个模块都有详细的用法说明及应用案例介绍 [root@ansible ~]# ansible-doc ping

Ansible教程_Ansible_09

3.ansible-playbook ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source,用来执行系列任务,其工作机制是:通过读取预先编写好的playbook文件实现集中处理任务,ansible-playbook命令后跟yml合适的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如下:

[root@ansible ~]# ansible-playbook playbook.yml #playbook.yml文件需要实现写好,建议执行时使用绝对路径, #后面将会用到

4.ansible-console ansible-console是ansible为用户提供的一套交互式工具,类似于Windows中的cmd以及Linux中的shell。用户可以再ansible-console虚拟出来的终端商像shell一样使用ansible内置的各种命令,这为习惯于使用shell交互方式的用户提供了良好的使用体验,在终端输入ansible-console命令后,显示如下:

[root@localhost ~]# ansible-console

Ansible教程_Ansible_10

#操作与shell类似,支持tab键,快捷键Ctrl+C退出虚拟终端


七.Ansible模块:

1.command模块: Command模块在远程主机上执行命令,不支持管道,重定向等shell的特性,常用的参数如下。 chdir:在远程主机上执行命令前要提前进入目录 creates:在命令运行时创建一个文件,如果文件已存在,则不会执行创建任务。 removes:在命令运行时语出一个文件,如果文件不存在,则不会执行移除任务 executeble:指明运行命令的shell程序 在所有主机上执行“ls ./”命令式,运行前切换到/home目录

[root@ansible ~]# ansible all -m command -a "chdir=/home ls ./"

Ansible教程_vim_11

2.shell模块: Shell模块在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令。和command模块的区别就是它支持shell特性,如:管道、重定向等。

[root@ansible ~]# ansible web -m shell -a "echo "hello" >> /tmp/hello.txt"
[root@ansible ~]# ansible web -m shell -a "cat /tmp/hello.txt"

Ansible教程_配置文件_12

Ansible教程_vim_13

3.copy模块: copy模块用于复制指定主机文件到远程主机指定位置,常见参数如下。

src ##源文件位置 content ##手动编写源文件内容 dest ##目标主机上的目标文件位置 mode ##设置文件权限 owner ##设置文件属主 group ##设置文件属组 force ##强制覆盖文件

[root@ansible ~]# cat \<<END\>>/root/ansible.txt\> I am ansible \> END [root@ansible ~]# ansible web -m copy -a "src=/root/ansible.txt dest=/tmp/ mode=777 owner=nobody group=root" [root@ansible ~]# ansible web -m shell -a "cat /tmp/ansible.txt"

Ansible教程_配置文件_14

Ansible教程_配置文件_15

Ansible教程_配置文件_16

4.hostname模块: Hostname模块用于管理远程主机上的主机名,常用参数如下: #name:指明主机名

[root@ansible ~]# ansible web -m hostname -a "name=Apache"
[root@ansible ~]# ansible web -m shell -a "cat /etc/hostname"

Ansible教程_配置文件_17

Ansible教程_Ansible_18

5.yum模块 用来指定yum安装服务,常见参数如下:

name ##软件包名称 state=present|latest|absent ##软件包状态,present:表示安装程序包,latest:表示安装最新版本的程序包,absent:表示卸载程序包 update_cache ##安装软件包前更新缓存 enablerepo ##指定yum源名称 conf_file ##指定yum安装时所加载的yum配置文件

[root@ansible ~]# ansible web -m yum -a "name=httpd state=present"

Ansible教程_Ansible_19

6.service模块 用来管理远程主机上的服务的模块,常见参数如下:

name: ##被管理的服务名称 state=started|stopped|restarted|reloaded: ##动作:启动,关闭,重启,重载 enabled=yes|no ##是否设置开机启动 runlevel: ##如果设定了enabled开机启动,则要定义在哪些运行目标下自动运行

[root@ansible ~]# ansible web -m service -a "name=httpd state=started enabled=yes"或 [root@ansible ~]# ansible web -m shell -a "systemctl start httpd"

Ansible教程_vim_20

数据量太多,就展示到这儿

Ansible教程_配置文件_21

7.user模块 以下是user模块参数:

name ##用户名 home ##家目录位置 shell ##指定登陆shell uid ##指定用户uid state ##状态,present为新建、absent为删除 force ##强制删除

[root@ansible ~]# ansible web -m user -a "name=user1 system=yes uid=501 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="testuser""#此为创建一个user1的用户,uid为501,属组为root...

Ansible教程_Ansible_22

[root@ansible ~]# ansible web -m shell -a "tail -1 /etc/passwd" #查看/etc/passwd确认该用户是否创建

Ansible教程_配置文件_23

[root@ansible ~]# ansible web -m user -a "name=user1 remove=yes state=absent" #删除用户及家目录

Ansible教程_配置文件_24

[root@ansible ~]# ansible web -m shell -a "tail -1 /etc/passwd" #查看是否删除用户user1

Ansible教程_vim_25


八.playbook配置文件: Playbook配置文件使用yaml语法,具有简洁明了、结构清晰等特点。Playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表; YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表项,通过“:”来分割键和值,整个未见以“---”开始,以“…”结束。

#先进行分组
[root@ansible ~]# vim /etc/ansible/hosts				##修改/etc/ansible/hosts文件
[web1]
192.168.3.2
[web2]
192.168.3.3
:wq
[root@ansible ~]# vim /etc/ansible/a.yml						##创建a.yml文件
---															##脚本开始
- hosts: web1												##针对web1组内主机进行操作
  remote_user: root											##远端执行用户身份为root
  tasks:														##任务列表
        - name: adduser										##任务名称
          user: name=user2 state=present						##调用user模块创建用户
          tags:												##创建tag标签
          - aaa												##tag标签为aaa
        - name: addgroup									##任务名称
          group: name=root system=yes						##执行group模块创建组
          tags:												##创建tag标签
          - bbb												##标签名称bbb
- hosts: web2												##针对web2组内主机进行操作
  remote_user: root											##远端执行用户身份为root
  tasks:														##任务列表
        - name: copy file to web								##任务名称
          copy: src=/etc/passwd dest=/home					##调用copy模块复制文件
          tags:												##创建tag标签
          - ccc												##tag标签为ccc
...															##结束

所有的“-横杠”和“:冒号”后面都有空格,而且要注意缩进和对齐。Playbook的核心元素:

hosts:任务的目标主机,多个主机用冒号分割,一般会调用/etc/ansible/hosts中的分组信息 remote_user:远程主机上,运行此任务的身份默认为root tasks:任务,定义的具体任务,由模块定义的操作列表。 handlers:触发器,类似tasks,只是在特定条件下才会触发的任务。 roles:角色,将hosts剥离出去,由tasks、handlers等所组成的一种特定的结构集合

Ansible教程_Ansible_26

Playbook文件定义的任务需要听过ansible-plyabook命令进行调用执行, 命令语法:

[root@localhost ~]# ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml

[option]部分功能解析

--syntax-check:检测yml文件的语法 -C:预测试,不会改变目标主机任何设置 --list-hosts:列出yml文件影响的主机列表 --list-tasks:列出yml文件的任务列表 -t TAGS:表示只执行指定标签的任务 --skip-tags=SKIP_ATGS:表示移除了指定标签的任务,执行其他任务。 --start-at-tasks=START-AT:从指定的任务开始往下指定。

eg:

[root@ansible ~]# ansible-playbook --syntax /etc/ansible/a.yml			##yml文件语法检查
playbook: /etc/ansible/a.yml														##没有报错

Ansible教程_Ansible_27

[root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml						##预测试

Ansible教程_配置文件_28

[root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml				##列出影响了那些主机

Ansible教程_配置文件_29

[root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml					##显示任务列表

Ansible教程_vim_30

[root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml					##显示任务标签

Ansible教程_vim_31

[root@ansible ~]# ansible-playbook /etc/ansible/a.yml							##执行任务

Ansible教程_配置文件_32

[root@ansible ~]# ansible web1 -m shell -a "tail -1 /etc/passwd"
[root@ansible ~]# ansible web2 -m shell -a "ls -l /home/passwd"

Ansible教程_vim_33

2.触发器 需要出发才能执行的任务,当之前定义在tasks中的任务执行完成后,若希望在此基础上出发其他的任务,这是需要定义handlers。 Handlers是ansible提供的条件机制之一,handlers和task相似,,但是它只在被task通知的时候才会触发执行。 Handlers只会在所有任务执行完后执行,而且即使被通知了多次,它也只会执行一次,handlers按照定义的顺序依次执行 eg:

[root@ansible ~]# ansible web1 -m shell -a "netstat -anpt | grep httpd"		##httpd正在监听80端口

Ansible教程_vim_34

[root@ansible ~]# vim /etc/ansible/httpd.yml						##创建httpd.yml文件
---																##脚本开始
- hosts: web1													##
  remote_user: root												##
  tasks:															##
        - name: change port										##
          command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf		##修改端口
          notify:												##配置触发条件
        	- restart httpd server									##完成任务后调用改名字的触发器
  handlers:														##
        - name: restart httpd server								##指定触发器的名字
          service: name=httpd state=restarted						##触发任务为重启httpd服务
...																##结束

Ansible教程_Ansible_35

[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/httpd.yml 		##检查脚本

Ansible教程_配置文件_36

[root@ansible ~]# ansible-playbook /etc/ansible/httpd.yml						##执行脚本

Ansible教程_vim_37

[root@ansible ~]# ansible web1 -m shell -a "netstat -anpt | grep httpd"			##查看触发器执行结果

Ansible教程_vim_38

Playbook语法详情:

https://www.cnblogs.com/hwlong/p/9301008.html

完!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
SCeAm4eXcUNH
作者其他文章 更多

2023-11-02