Ansible自动化运维工具

打印 上一主题 下一主题

主题 838|帖子 838|积分 2514

目录

一、什么是Ansible

1、简介

Ansible是一款自动化运维工具,基于Python开发,聚集了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统部署、批量步伐部署,批量运行命令等功能。
Ansible是基于模块工作的,自己没有批量部署的本领,真正具有批量部署本领的是Ansible运行的模块,Ansible只是提供一个框架。Ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。
2、架构



  • ansbile:焦点步伐
  • modules:包括ansible自带的焦点模块以及自界说模块
  • plugins:完成模块功能的补充,包括连接插件,邮箱插件
  • palybooks:脚本,界说ansbile多任务设置文件,由ansible自动实验
  • inventory:界说ansbile管理的主机清单
  • connection plugins:负责和被监控端实现通信
3、工作流程


  • 加载设置文件: Ansible 默认查找 /etc/ansible/ansible.cfg 设置文件,这个文件包含了Ansible运行时的行为设定,如连接方式、插件路径等。
  • 解析Inventory: Ansible 使用 Inventory 文件(默认是 /etc/ansible/hosts)来确定需要操作的目标主机或主机组。
  • 编译Playbook或命令: Ansible 准备实验的Playbook或直接实验的Ad-Hoc命令,并解析其中的任务和模块调用。
  • 模块加载与实验计谋准备: 对于每个任务,Ansible 加载相应的模块(如 command 模块),并准备实验上下文,包括变量、环境等。
  • 生成并传输临时脚本: Ansible 会根据任务和模块生成一个或多个临时的Python脚本,并通过SSH连接传输到目标主机的临时目录,通常位于目标用户的 ~/.ansible/tmp/ansible-tmp-/ 目录下。
  • 赋予实验权限: 在目标主机上,Ansible 会给这个临时Python脚本加上实验权限,以便可以或许运行。
  • 实验远程脚本: Ansible 通过SSH在目标主机上实验这个临时脚本,并收集实验效果。
  • 效果收集与处理: 实验完毕后,各个主机的实验效果被收集并汇总,Ansible根据这些效果决定是否继续实验后续任务,或是根据Playbook中的错误处理逻辑(如 rescue 和 always 块)进行操作。
  • 清理: 一旦任务实验完成,无论成功还是失败,Ansible 会清理目标主机上的临时文件,包括删除之前上传的Python脚本。
  • 退出与报告: 清理完成后,Ansible 进程在目标主机上退出,并向控制机报告终极的实验状态和效果。
二、部署Ansible批量管理

1、涉及主机

主机名脚色IP地点server控制节点192.168.112.10host1受管节点192.168.112.20host2受管节点192.168.112.30host3受管节点192.168.112.402、安装部署Ansible

控制节点
2.1、yum安装
  1. yum install -y epel-release                #Centos需要安装EPEL仓库
  2. yum install -y ansible                #yum包管理安装Ansible
  3. ansible --version                #查看Ansible安装版本
复制代码

2.2、其他方式

安装管理主机
3、设置免密登录

3.1、控制节点设置hosts解析
  1. [root@server ~]# vim /etc/hosts
  2. 192.168.112.10 server
  3. 192.168.112.20 host1
  4. 192.168.112.30 host2
  5. 192.168.112.40 host3
复制代码
3.2、生成密钥对
  1. [root@server ~]# ssh-keygen -P "" -t rsa
  2. Generating public/private rsa key pair.
  3. Enter file in which to save the key (/root/.ssh/id_rsa):
  4. Created directory '/root/.ssh'.
  5. Your identification has been saved in /root/.ssh/id_rsa.
  6. Your public key has been saved in /root/.ssh/id_rsa.pub.
  7. The key fingerprint is:
  8. SHA256:eSgh2wm7WxXS8n61UI4wKK0yEl3mLlzwIFBdOQSAgag root@server
  9. The key's randomart image is:
  10. +---[RSA 2048]----+
  11. |B+=o++o.         |
  12. |+o B..oo         |
  13. |o . B *.=   .    |
  14. |Eo o O * * +     |
  15. |. = = + S + o    |
  16. | . + . + . o .   |
  17. |    . . . . .    |
  18. |     o   .       |
  19. |    .            |
  20. +----[SHA256]-----+
复制代码

  • -P "":设置空暗码
  • -t rsa: 指定生成密钥的类型为RSA
  • 简化后续实验输暗码操作
3.3、将公钥发送给受管节点
  1. ssh-copy-id -i /root/.ssh/id_rsa.pub root@host1
  2. ssh-copy-id -i /root/.ssh/id_rsa.pub root@host2
  3. ssh-copy-id -i /root/.ssh/id_rsa.pub root@host3
复制代码

过程中需要输入受管节点的暗码
3.4、测试免密登录
  1. ssh root@host1
  2. ssh root@host2
  3. ssh root@host3
复制代码

4、界说主机清单

4.1、ansible常见的设置文件


  • /etc/ansible/ansible.cfg:主设置文件
  • /etc/ansible/hosts:主机清单文件
  • /etc/ansible/roles:脚色目录
4.2、备份主机清单文件
  1. cp -f hosts hosts.bak
复制代码

4.3、修改主机清单,设置分组
  1. vim /etc/ansible/hosts
  2. [all-servers]
  3. server
  4. host1
  5. host2
  6. host3
  7. [node1]
  8. host1
  9. [node2]
  10. host2
  11. [node3]
  12. host3
  13. [mysql_test]
  14. host1
  15. host2
  16. [web_test]
  17. host2
  18. host3
  19. [manager]
  20. server
复制代码

三、Ansible参数阐明及实验状态

1、参数阐明

参数阐明-h表现资助信息,包含可用的命令和选项。-i指定Inventory文件的路径,默以为/etc/ansible/hosts。-l限制playbook或命令的作用范围,仅对匹配的主机实验。-u指定连接远程主机时使用的用户名。-b在远程主机上实验操作时临时提升权限,相当于使用sudo。--become-user=USER提升权限后切换到的用户。-m用于ad-hoc命令,指定要使用的模块名。-a指定模块的参数。-f指定并发进程数,默以为5。-v增长输出的具体程度,多次使用可获得更多调试信息。-vvv设置更具体的输出级别,有助于调试。--check实验模拟运行,不现实改变系统状态,用以预览操作效果。--diff修改文件时,表现修改前后的差异。-C检查实验效果-e指明变量名--syntax-check检查实验命令是否存在语法错误2、Ansible的实验状态


  • 绿色:实验成功并且不需要做改变的操作
  • 黄色:实验成功并且对目标主机做变更
  • 赤色:实验失败
  • 粉色:告诫信息
  • 蓝色:表现ansible命令实验的过程
四、Ansible常用模块

1、ping模块

主机连通性测试
  1. #一个一个测试
  2. ansible -m ping node1
  3. ansible -m ping node2
  4. ansible -m ping node3
  5. ansible -m ping manager
  6. #以组为单位测试
  7. ansible -m ping all-servers
复制代码


2、command模块

ansible的默认模块,用于在远程主机上实验简单的Linux命令,并将效果返回主机
不支持管道,变量及重定向等
2.1、选项及描述
  1. ansible-doc -s command
复制代码
选项描述argv将命令作为列表而非字符串转达。使用argv可避免对原本会被误解的值(例如用户名中带空格的情况)进行引用。只能提供字符串或列表形式之一,不能同时提供。chdir在实验命令前切换到此目录。cmd要实验的命令。creates如果该文件已经存在,此步骤不会实验。removes如果该文件存在,此步骤将会实验。stdin直接将指定的值设置为命令的stdin。stdin_add_newline如果设置为yes,在stdin数据末尾追加换行符。strip_empty_ends从stdout/stderr效果的结尾去除空行。warn启用或禁用任务告诫。2.2、结合chdir和removes、creates列出指定目录下内容
  1. #node1组先切换到root目录下aliyun.sh文件存在不执行ls
  2. ansible node1 -m command -a 'chdir=/root/ creates=aliyun.sh ls'
  3. #node1组先切换到root目录下aliyun.sh文件存在就执行ls
  4. ansible node1 -m command -a 'chdir=/root/ removes=aliyun.sh ls'
复制代码

2.3、检察磁盘空间
  1. #查看mysql_test组中所有主机的磁盘空间
  2. ansible mysql_test -m command -a 'df -h'
  3. #查看web_test组中所有主机的磁盘空间
  4. ansible web_test -m command -a 'df -h'
复制代码

3、shell模块

shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。
3.1、选项及参数
  1. ansible-doc -s command
复制代码
选项描述chdir在实验命令前切换到此目录。cmd要实验的命令及其可选参数。creates当指定的文件已存在时,此步骤将不实验。executable更改用于实验命令的shell。这需要shell可实验文件的绝对路径。free_form要实验的Linux指令,一般使用Ansible的-a参数代替。removes当指定的文件存在时,此步骤将实验。stdin直接将指定的值设置为命令的stdin。stdin_add_newline是否在stdin数据末尾添加换行符。warn是否启用任务告诫。3.2、检查远程主机的系统版本
  1. #查看mysql_test组远程主机的系统版本
  2. ansible mysql_test -m shell -a 'cat /etc/os-release | grep PRETTY_NAME | cut -d "=" -f2'
  3. #查看web_test组远程主机的系统版本
  4. ansible web_test -m shell -a 'cat /etc/os-release | grep PRETTY_NAME | cut -d "=" -f2'
复制代码

3.3、检察远程主机防火墙状态
  1. #查看mysql_test组中所有的主机防火墙firewalld和selinux的状态
  2. ansible mysql_test -m shell -a 'systemctl status firewalld ; getenforce'
复制代码
这里验证了command模块不能使用命令别名、管道、重定向以及逻辑运算符(如;, &&, ||)
由于command模块直接将整个字符串转达给系统实验,分号;以及随后的getenforce命令被视为命令的一部分,而不是独立的指令。这导致系统尝试查找名为类似\x3b.service(分号;的ASCII转义序列)的服务状态,以及尝试将getenforce当作一个服务单位来查找,由于这两个都不是有效的服务单位名称,因此返回了错误信息。

3.4、创建、检察指定目录
  1. #在mysql_test组下的主机循环创建/root/tmp_1/NOW+当前时间的目录
  2. ansible mysql_test -m shell -a "mkdir -p /root/tmp_1/NOW-$(date +'%H:%M:%S')"
  3. #find查找是否正确创建
  4. ansible mysql_test -m shell -a "find /root/tmp_1 -mmin -5"
复制代码

4、user模块

主要用于管理远程系统上的用户账户,包括创建、修改和删除用户。
它答应你设置用户的暗码、shell、主目录、权限等属性
4.1、选项及描述
  1. ansible-doc -s user
复制代码
选项描述comment用户的描述信息createhom是否创建家目录force在使用state=absent时, 行为与userdel –force划一group指定根本组groups指定附加组,如果指定为(groups=)表示删除所有组home指定用户家目录move_home如果设置为home=时, 试图将用户主目录移动到指定的目录name指定用户名non_unique该选项答应改变非唯一的用户ID值password指定用户暗码remove在使用state=absent时, 行为是与userdel –remove划一shell指定默认shellstate设置帐号状态,默以为present表示新建用户,指定值为absent表示删除system当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户uid指定用户的uidupdate_password更新用户暗码expires指明暗码的过期时间append添加一个新的组4.2、添加系统用户,指定uid、家目录及注释
  1. #给web_test组中添加一个系统用户zhangsan家目录为/home/zhangsan,用户id为111,注释信息为hello zhangsan
  2. ansible web_test -m user -a "system=yes name=zhangsan home=/home/zhangsan uid=111 comment='hello zhangsan'"
复制代码

4.3、检察新创建的用户
  1. #id zhangsan验证用户是否正确创建,使用grep+awk截取/etc/passwd上关于zhangsan的注释信息
  2. ansible web_test -m shell -a 'id zhangsan ; grep ^zhangsan: /etc/passwd | awk -F ":" '\''{print $5}'\'''
复制代码

4.4、删除新创建的用户
  1. #删除用户zhangsan
  2. ansible web_test -m user -a "name=zhangsan state=absent remove=yes"
复制代码

5、group模块

用于管理Linux系统中的用户组。
这个模块答应你添加或删除用户组,并且可以设置组ID(GID)。
5.1、选项及描述
  1. ansible-doc -s group
复制代码
选项描述gid用于设置用户组的GID(组ID)。local强制使用平台提供的本地命令替代品(如lgroupadd代替groupadd),实用于需要操作本地组的会合认证环境。此选项要求目标主机上存在这些命令,否则会导致致命错误。name(必需)指定组的名称。non_unique答应将组ID更改为非唯一值。需要与gid一起使用。不支持macOS或BusyBox发行版。state指定用户组在远程主机上应有的状态,可以是present(存在)或absent(不存在)。system如果设置为yes,表示创建的用户组是系统组。5.2、创建或更新组
  1. #在web_test组的所有主机上创建一个系统组web_test,组id为1010
  2. ansible web_test -m group -a "name=web_test gid=1010 system=yes"
  3. #通过/etc/group查看系统组web_test信息
复制代码

5.3、删除组
  1. #删除web_test组所有主机上的系统组web_test
  2. ansible web_test -m group -a "name=web_test gid=1010 state=absent"
复制代码

6、copy模块

用于将本地文件或目录复制到远程主机上
支持文件、目录、权限、用户组功能
6.1、选项及描述
  1. ansible-doc -s copy
复制代码
选项描述backup在覆盖之前,将源文件备份,备份文件包含时间信息。content用于替代“src”,可以直接设定指定文件的值dest必选项。要将源文件复制到的远程主机的绝对路径directory_mode递归设定目录的权限,默以为系统默认权限force当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默以为"yes"follow支持link文件拷贝others所有file模块里的选项都可以在这里使用src被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"6.2、给定内容生成文件,并修改权限信息
  1. #将copy内容为copy test复制到node3主机的/root/copy.txt并设置权限666
  2. ansible node3 -m copy -a 'content="copy test" dest=/root/copy.txt mode=666'
复制代码

6.3、修改文件内容,选择覆盖备份
  1. #修改node3主机上copy.txt文件内容,并选择备份
  2. ansible node3 -m copy -a 'content="copy test_1\n" backup=yes dest=/root/copy.txt mode=666'
复制代码

7、fetch模块

Ansible 的 fetch 模块用于从远程节点抓取文件并存储到Ansible控制器(实验Ansible任务的机器)上的指定目录
7.1、选项及描述
  1. ansible-doc -s fetch
复制代码
选项描述dest必选项,用来存放文件的目录src必选项,在远程拉取的文件,并且必须是一个file,不能是目录flat当设置为yes时,纵然src是一个目录,也会将所有内容扁平化存储到指定的dest目录下,而不是保留目录结构。( 默认no)validate_checksum当设置为yes时,在下载完成后校验文件的校验和,确保文件完备无误。这可以用来防止因网络题目导致的文件损坏。(默认no)fail_on_missing当设置为yes时,如果远程文件不存在,则标记任务失败,否则只是简单地跳过该文件。(默认no)size限制要抓取的文件大小,可以使用后缀如k、M、G来指定单位(千字节、兆字节、吉字节)。如果远程文件超过指定大小,抓取操作将不会实验。timeout设置超时时间(秒),用于等候文件传输完成。默认情况下,Ansible使用其内部的连接超时设置。force纵然本地文件已经存在,也强制重新抓取。如果设置为no,则只有当远程文件比本地文件新或不同才实验抓取。(默认yes)unarchive如果src是指向一个归档文件(如.zip或.tar.gz),并且设置了此选项为yes,Ansible将在抓取后尝试解压该归档文件。(默认no)list_files当设置为yes时,模块将只列出远程目录下的文件而不现实抓取它们,可用于预览目标。(默认no)7.2、从远程主机抓取文件
  1. #从mysql_test组的主机中抓取aliyun.sh文件到本机的/tmp/data目录下
  2. ansible mysql_test -m fetch -a "src=/root/aliyun.sh dest=/tmp/data"
  3. #通过检查/tmp/data下的目录结构可知文件已完整获取
  4. ansible manager -m shell -a "tree -L 5 /tmp/data"
复制代码

7.3、限制抓取文件的大小、添加文件存在检测
  1. #从mysql_test组的主机中抓取install.sh文件,限制最大抓取大小20kb,传输中校验文件完整性,添加文件存在检测(不存在任务失败)
  2. ansible mysql_test -m fetch -a "src=/root/install.sh dest=/tmp/data/ verify_checksum=yes fail_on_missing=yes size=20k"
复制代码

8、file模块

file模块主要用于对文件的创建、删除、修改、权限、属性
8.1、选项及描述
  1. ansible-doc -s file
复制代码
选项描述path必选项,界说文件/目录的路径mode界说文件/目录的权限force需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会创建的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yesgroup界说文件/目录的属组,后面可以加上mode:界说文件/目录的权限owner界说文件/目录的属主。后面必须跟上path:界说文件/目录的路径recurse递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况dest被链接到的路径,只应用于state=link的情况src被链接的源文件路径,只应用于state=link的情况state状态,有以下选项:directory、file、link、hard、touch、absent8.2、在指定路径下创建目录
  1. #在mysql_test组所有主机在/tmp/路径下创建权限都是只读、属主属组都是root的file1目录
  2. ansible mysql_test -m file -a "path=/tmp/file1 mode=444 owner=root group=root state=directory"
  3. #查看创建好的目录
  4. ansible mysql_test -m shell -a "ls -l /tmp/ | grep file1"
复制代码

8.3、创建软链接文件
  1. #给mysql_test组的所有主机创建软链接文件test1指向/root/aliyun.sh
  2. ansible mysql_test -m file -a "path=/tmp/test1 src=/root/aliyun.sh state=link"
复制代码

8.4、创建硬链接文件
  1. #给mysql_test组的所有主机创建硬链接文件test1指向/root/aliyun.sh
  2. ansible mysql_test -m file -a "path=/tmp/test2 src=/root/aliyun.sh state=hard"
复制代码

8.5、删除文件
  1. #删除mysql_test组中所有主机/tmp/目录下test1
  2. ansible mysql_test -m file -a "path=/tmp/test1 state=absent"
复制代码

9、yum模块

主要用于在基于 RPM 的 Linux 系统上管理软件包。
它答应用户安装、更新、卸载软件包,并可设置额外的选项以控制操作的具体行为。
9.1、选项及描述
  1. ansible-doc -s yum
复制代码
选项描述name必选项,所安装的包的名称state安装-> present ; 安装最新版本的-> latest  ;absent-> 卸载包update_cache强制更新yum的缓存conf_file指定远程yum安装时所依赖的设置文件(安装本地已有的包)。disable_pgp_check是否克制GPG checking,只用于presentor latest。disablerepo临时克制使用yum库。 只用于安装或更新时。enablerepo临时使用的yum库。只用于安装或更新时。skip_borken跳过异常软件节点autoremove当设置为yes且状态为absent时,自动移除不再被任何已安装包依赖的包。9.2、安装httpd服务
  1. #给web_test组的所有主机安装httpd服务
  2. ansible web_test -m yum -a "name=httpd state=present"
  3. #远程启动httpd服务
  4. ansible web_test -m shell -a "systemctl start httpd"
  5. #远程查看http服务进程
  6. ansible web_test -m shell -a "ps aux | grep httpd"
  7. #远程停止httpd服务
  8. ansible web_test -m shell -a "systemctl stop httpd"
  9. #远程卸载httpd服务
  10. ansible web_test -m yum -a "name=httpd state=absent"
复制代码
安装
检察进程
卸载
9.3、更新所有的软件包
  1. #给所有主机更新所有的软件包
  2. ansible all-servers -m yum -a "name=* state=latest"
复制代码

10、cron模块

用于添加、删除、更新操作系统的Crontab筹划任务
10.1、选项及描述
  1. ansible-doc -s cron
复制代码
选项描述backup如果设置,会在修改crontab前创建备份。备份文件的位置通过backup_file变量返回。cron_file如果指定,将使用此文件而非用户个人的crontab。如果是相对路径,则相对于/etc/cron.d/。绝对路径通常为/etc/crontab。为了使用cron_file参数,必须同时指定user。day任务应运行的月份中的日期 (1-31, *, */2, 等)。disabled如果任务应在crontab中被禁用(注释掉)。仅当state=present时有效。env如果设置,管理crontab的环境变量。新变量会被添加到crontab的顶部。name和value参数分别为环境变量的名称和值。hour任务应运行的小时 (0-23, *, */2, 等)。insertafter与state=present和env一起使用。如果指定,环境变量将在指定环境变量声明之后插入。insertbefore与state=present和env一起使用。如果指定,环境变量将在指定环境变量声明之前插入。job要实验的命令,或者如果设置了env,则是环境变量的值。命令不应包含换行符。当state=present时必需。minute任务应运行的分钟 (0-59, *, */2, 等)。month任务应运行的年份中的月份 (1-12, *, */2, 等)。namecrontab条目标描述,或者如果设置了env,则是环境变量的名称。当state=absent时必需。留意,如果不设置name,且state=present,则总是会创建新的crontab条目,不管已有条目如何。此参数在未来的版本中将始终是必需的。special_time特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)state确保任务或环境变量存在或不存在的状态。user应修改其crontab的具体用户。未设置时,默以为使用root。weekday任务应运行的星期几 (0-6 表示周日-周六,*, 等)。10.2、添加筹划任务
  1. #给mysql_test组中的所有主机添加一个以root用户每天三点执行/root/aliyun.sh脚本的计划任务
  2. ansible mysql_test -m cron -a "name='Daily Task' minute=0 hour=3 job='/root/aliyun.sh &> /dev/null' user=root"
复制代码

10.3、删除指定筹划任务
  1. #删除名为Daily Task的计划任务(没有明确的计划任务名称写完整的计划任务也可以删除)
  2. ansible mysql_test -m cron -a "name='Daily Task' state=absent"
复制代码

11、service模块

Ansible的service模块用于管理系统服务(如启动、停止、重启服务等)。
这个模块与特定的系统服务管理工具(如systemd、sysvinit、upstart等)兼容,可以或许跨不同的Linux发行版和系统管理框架工作
11.1、选项及描述
  1. ansible-doc -s service
复制代码
选项描述arguments额外的命令行参数,提供给服务管理命令。enabled服务是否应该在系统启动时自动启动。至少需要指定state或enabled中的一个。name(必需)服务的名称。pattern如果服务不响应状态查询命令,可以指定一个子字符串作为查找依据,该子字符串应能在ps命令的输出中找到,作为服务状态的替代判断。如果找到该字符串,服务将被以为已启动。runlevel仅针对OpenRC初始化脚本(如Gentoo)使用。指定该服务属于哪个运行级别。sleep当服务处于restarted状态时,停止与启动命令之间暂停的秒数。有助于解决那些在发出停止信号后立即退出的不良行为初始化脚本题目。并非所有服务管理器都支持此设置,例如使用systemd时,此设置会被忽略。state有四种状态,分别为:started--->启动服务, stopped--->停止服务, restarted--->重启服务, reloaded--->重载设置use服务模块通常通过自动检测使用系统特定的模块,此设置可以强制使用特定模块。默认情况下,它使用ansible_service_mgr究竟的值,并且在找不到匹配项时回退到旧的service模块。11.2、远程开启/关闭防火墙
  1. #给web_test组中的所有主机重启firewalld服务
  2. ansible web_test -m service -a "name=firewalld state=restarted"
  3. #查看web_test组中所有主机的firewalld服务运行状态
  4. ansible web_test -m shell -a "systemctl status firewalld"
  5. #给web_test组中的所有主机关闭firewalld服务
  6. ansible web_test -m service -a "name=firewalld state=stopped"
复制代码
开启firewalld服务
检察firewalld服务状态
关闭firewalld服务
12、script模块

Ansible的script模块答应你在远程主机上实验位于Ansible控制节点上的本地脚本
12.1、选项及描述
  1. ansible-doc -s script
复制代码
选项描述chdir在远程节点上实验脚本之前切换到的目录路径。cmd要在远程节点上运行的本地脚本的路径,后面可以跟上可选的参数。留意,这个选项与free_form二选一使用。creates指定远程节点上的一个文件名,如果该文件已存在,则此步骤将实验,可用于防止重复实验脚本。decrypt控制是否自动解密使用Vault加密的源文件。executable用于调用脚本的可实验文件的名称或路径,例如如果脚本是Python脚本,可以设置为/usr/bin/python。free_form直接提供本地脚本文件的路径以及可选的参数,与cmd选项作用相似但格式不同,两者选其一使用。removes指定远程节点上的一个文件名,如果该文件不存在,则此步骤将实验,可以作为实验脚本的另一个条件。12.2、编辑并部署脚本

1、控制节点本地编辑脚本并添加实验权限
  1. vim /tmp/df.sh
  2. #!/bin/bash
  3. date >> /tmp/data/df.log
  4. df -lh >> /tmp/data/df.log
  5. [root@server ~]# chmod +x /tmp/df.sh
复制代码

2、通过script模块部署到远程主机实验
  1. #给web_test组的所有主机执行控制节点上的df.sh脚本文件
  2. ansible web_test -m script -a "/tmp/df.sh”
复制代码

13、setup模块

Ansible的setup模块用于收集远程主机的信息,并将这些信息以facts的形式返回给Ansible控制节点。
这些facts可以包括系统变量(如操作系统类型、架构、网络设置、已安装软件包等),并且在Playbook实验期间可以被其他任务使用。
13.1、选项及描述
  1. ansible-doc -s setup
复制代码
选项描述fact_path用于存放本地Ansible究竟(*.fact文件)的路径。此目录下的文件如果可实验,将被实验,其效果会被添加到ansible_local究竟中;如果文件不可实验,则会被读取。实用于从2.1版本开始。文件/效果格式可以是JSON或INI格式。默认的fact_path可以在ansible.cfg中为自动调用setup作为gather_facts一部分时指定。Windows环境下有特定选项,请检察注释。filter如果提供,仅返回匹配此shell风格(fnmatch通配符)的变量。这答应筛选出特定的facts进行检察或使用。gather_subset如果提供,限制收集的额外究竟子集。大概的值包括:all(全部)、min(最小聚集)、hardware(硬件信息)、network(网络信息)、virtual(假造化信息)、ohai(类似Chef Ohai的扩展信息)、facter(使用Facter收集的信息)。可以指定值的列表来界说更大的子集。值前可加!来排除特定子集的收集,例如:!hardware,!network,!virtual,!ohai,!facter。如果指定!all,则只收集最小聚集。要避免收集最小聚集,可以指定!all,!min。要仅收集特定究竟,使用!all,!min并指定特定的究竟子集。如果只想隐藏某些收集到的究竟,使用filter参数。gather_timeout设置单个究竟收集的默认超时时间(以秒为单位)。这有助于控制究竟收集过程,避免因个别慢速收集导致整个任务超时。13.2、检察内存信息
  1. #查看mysql_test组所有主机的内存信息
  2. ansible mysql_test -m setup -a "filter='*mem*'"
复制代码

通过free -m命令检察内存大小是否划一
  1. #通过free -m命令查看mysql_test组主机的内存信息
  2. ansible mysql_test -m shell -a "free -m"
复制代码

13.3、生存信息
  1. #将筛选的信息保存到控制节点的/tmp/data目录下
  2. ansible web -m setup -a 'filter="*mem*"' --tree /tmp/data
复制代码

14、synchronize模块

Ansible的synchronize模块提供了使用rsync进行文件和目录同步的功能。
rsync是一个快速且高效的文件传输工具,支持增量更新,特别得当在远程主机之间同步大量文件或保持文件夹内容的划一性。
14.1、选项及描述
  1. ansible-doc synchronize
复制代码
选项描述archive镜像rsync的归档标记,启用递归、链接、权限、时间戳、所有者、组标记及-D。默认开启。checksum基于校验和而非修改时间和大小来跳过同步,留意“archive”选项默认仍启用,"checksum"选项不会禁用它。默认关闭。从1.6版本起可用。compress在传输过程中压缩文件数据。大多数情况下应保持启用状态,除非引起题目。默认开启。从1.7版本起可用。copy_links将符号链接作为它们指向的对象(被链接项)复制,而不是复制符号链接自己。默认关闭。delete删除目标路径中不存在于源路径的文件(在传输之后,不是之前)。此选项要求recursive=yes。表现得像rsync的--delete-excluded选项,忽略被排除的文件。默认关闭。dest同步的目标田主机路径,将从源路径同步而来。路径可以是绝对或相对的。此选项是必须的。dest_port目标主机SSH端口。在Ansible 2.0之前,ansible_ssh_port库存变量优先于这个值。此参数默以为ansible_ssh_port或ansible_port的值、remote_port设置设置的值,或如果没有设置前者,则使用SSH客户端设置的值。从1.5版本起可用。dirs仅传输目录而不递归进入。默认关闭。existing_only跳过在接收端创建新文件。默认关闭。从1.5版本起可用。group保留组信息。默认值取决于archive选项。link_dest添加一个硬链接目标,在rsync期间与之关联。默以为无。从2.5版本起可用。links作为符号链接复制符号链接。默认值取决于archive选项。mode指定同步的方向。推模式下,本田主机或署理是源;拉模式下,上下文中的远程主机是源。(可选值:pull, push)默以为push。owner保留所有者(仅超级用户)。默认值取决于archive选项。partial告诉rsync保留部分文件,这应该会使后续传输文件剩余部分快得多。默认关闭。从2.0版本起可用。perms保留权限信息。默认值取决于archive选项。private_key为基于SSH的rsync连接指定私钥(如~/.ssh/id_rsa)。默以为无。从1.6版本起可用。recursive递归进入目录。默认值取决于archive选项。rsync_opts通过转达数组来指定额外的rsync选项。留意,rsync_opts中的空字符串终极会传输当前工作目录。默以为无。从1.6版本起可用。rsync_path指定在远程主机上运行的rsync命令。参见rsync手册页上的--rsync-path。要指定在本田主机上运行的rsync命令,你需要设置任务变量ansible_rsync_path。默以为无。rsync_timeout为rsync命令指定一个超时时间(秒)。默以为0。set_remote_user为远程路径添加user@。如果你有自界说的ssh设置来为与库存用户不匹配的主机界说远程用户,应将此参数设为no。默以为True。src源主机上的路径,将同步到目标地。路径可以是绝对或相对的。此选项是必须的。times保留修改时间。默认值取决于archive选项。use_ssh_args使用ansible.cfg中指定的ssh_args。默认关闭。从2.0版本起可用。verify_host验证目标主秘密钥。默认关闭。从2.0版本起可用。14.2、将源目录同步至目标目录(增量同步)
  1. #既然是基于rsync那么所有主机安装rsync
  2. ansible all-servers -m shell -a "yum install -y rsync"
  3. #将本地的/tmp/目录同步到node1组的host1主机上
  4. ansible node1 -m synchronize -a "src=/tmp/ dest=/tmp/"
  5. #查看node1组的host1主机的/tmp/目录结构
  6. ansible node1 -m shell -a "tree -L 5 /tmp/"
复制代码
所有主机安装rsync
同步本地/tmp/到host1主机上
检察目录结构
14.3、将源目录同步至目标目录(完全同步)
  1. #删除目标路径中不存在于源路径的文件(在传输之后)
  2. ansible node1 -m synchronize -a "src=/tmp/ dest=/tmp/ delete=yes"
复制代码
五、Ansible playbook

1、简介

Ansible Playbook 是Ansible用于界说和实验自动化任务的设置、部署和编排的主要方式。它是一种使用YAML语言编写的脚本文件,答应用户以简洁、可读性强的方式描述一系列步骤,这些步骤可以跨多台主机实验,以实现系统的设置管理和应用步伐部署。
playbook是由一个或者多个play组成的列表,可以让这些列表按事先编排的机制实验;所谓task是调用ansible的具体模块,在模块参数中可以使用变量。模块实验是幂等性的,意味着多次实验效果相同。使用yaml语言编写playbook,后缀名一般为.yml
2、playbook的YAML格式


  • 文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。
  • 在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
  • YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
  • 同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
  • play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增长一个空格。
  • 缩进:使用空格缩进(而非Tab),通常使用2个空格
2.1、示例:
  1. ---
  2. - name: update web servers
  3.   hosts: node1
  4.   remote_user: root
  5.   tasks:
  6.   - name: ensure apache is at the latest version
  7.     yum:
  8.       name: httpd
  9.       state: latest
  10.   - name: write the apache config file
  11.     template:
  12.       src: /srv/httpd.j2
  13.       dest: /etc/httpd.conf
  14.   - name: ensure that htppd is started
  15.     service:
  16.       name: httpd
  17.       state: started
  18. - name: update db servers
  19.   hosts: node1
  20.   remote_user: root
  21.   tasks:
  22.   - name: ensure mariadb is at the latest version
  23.     yum:
  24.       name: mariadb-server
  25.       state: latest
  26.   - name: ensure that mariadb is started
  27.     service:
  28.       name: mariadb
  29.       state: started
复制代码
2.2、解析

Play 1: 更新Web服务器

  • Play标题:"update web servers",表明本Play的目标是更新Web服务器设置。
  • hosts:node1,指定该Play作用于名为node1的主机。
  • remote_user:root,指定实验任务的远程用户为root。
  • tasks

    • task 1: 确保Apache是最新的版本。使用yum模块安装httpd包至最新版。
    • task 2: 写入Apache设置文件。使用template模块将模板文件/srv/httpd.j2渲染后复制到/etc/httpd.conf,答应动态设置生成。
    • task 3: 确保Apache服务已启动。使用service模块设置httpd服务的状态为started,如果服务未运行则启动。

Play 2: 更新数据库服务器

  • Play标题:"update db servers",目标是更新数据库服务器设置。
  • hosts:同样为node1,指定该Play作用于名为node1的主机。
  • remote_user:root,指定实验任务的远程用户为root。
  • tasks

    • task 1: 确保MariaDB是最新的版本。使用yum模块安装mariadb-server至最新版。
    • task 2: 确保MariaDB服务已启动。使用service模块设置mariadb服务的状态为started。

3、playbook的实验与语法检查
  1. #执行playbook
  2. ansible-playbook playbook.yml
  3. #语法检查
  4. ansible-playbook --syntax-check playbook.yml
复制代码
4、playbook的焦点元素


  • Hosts(主机组):界说了Playbook将要操作的目标机器聚集。可以是单个主机名、IP地点,也可以是主机组名。
  • Tasks(任务列表):构成Play的主要部分,界说了在目标主机上实验的具体操作序列。每个任务通常关联一个特定的Ansible模块及参数。
  • Variables(变量):用于在Playbook中转达和管理设置信息,支持多种设置方式(如直接赋值、变量文件、环境变量、脚色默认变量等),增长了Playbook的机动性和可重用性。
  • Templates(模板):使用Jinja2模板引擎动态生成设置文件。答应根据变量插入动态内容,实用于需要根据不同环境定制设置的情况。
  • Handlers(处理步伐):特殊类型的任务,仅当被其他任务通过notify属性明确告知时才会实验。常用于服务重启等需要在特定条件满足时进行的操作。
5、根本组件及格式


  • remote_user:指定实验Ansible任务的远程用户名。
  • sudo_user:界说需要临时提升权限实验任务时的目标用户。
  • Tasks格式
    1. tasks:
    2.   - name: 简短任务描述
    3.     module: 模块名称
    4.     arguments: 参数列表
    5.     notify: 通知的处理程序名称(可选)
    复制代码
  • Handlers格式
    1. handlers:
    2.   - name: 处理程序描述
    3.     module: 模块名称
    4.     arguments: 参数列表
    复制代码

    • Handlers触发条件

      • 当某任务状态变为changed时,可以触发一个或多个预先界说好的处理步伐。
      • 使用tags为任务和处理步伐打标签,可以在实验Playbook时通过--tags或-t选项选择性地实验带有特定标签的任务。


  • 模块与模块参数:Ansible通过各种模块实验具体操作,模块后跟随的是该模块接受的参数。对于shell和command这类直接实验系统命令的模块,参数直接是命令字符串,而不是键值对形式。
6、安装nginx并修改设置文件

6.1、准备文件存放目录
  1. [root@server ~]# mkdir -p /root/ansible/{conf,bin}
复制代码
6.2、编写yaml文件
  1. [root@server ~]# cd ansible/bin/
  2. [root@server bin]# cat nginx.yml
  3. ---
  4. - name: Update web servers
  5.   hosts: node1
  6.   remote_user: root
  7.   tasks:
  8.   - name: Install epel
  9.     yum:
  10.       name: epel-release.noarch
  11.       state: latest
  12.   - name: Install nginx
  13.     yum:
  14.       name: nginx
  15.       state: present
  16.   - name: Copy nginx configure file
  17.     copy:
  18.       src: /root/ansible/conf/nginx.conf
  19.       dest: /etc/nginx/nginx.conf
  20.       backup: yes
  21.   - name: Start nginx
  22.     service:
  23.       name: nginx
  24.       state: restarted
  25.   - name: Create index.html
  26.     shell: echo "hello playbook_nginx" > /usr/share/nginx/html/index.html
复制代码
6.3、编写conf文件
  1. [root@server conf]# cat site.conf
  2. events {
  3.     worker_connections  1024;
  4. }
  5. http {
  6.     server {
  7.         listen 8080;
  8.         server_name 192.168.112.20:8080;
  9.         location / {
  10.             index index.html;
  11.         }
  12.     }
  13. }
复制代码
6.4、检查语法错误,实验playbook
  1. #语法检查
  2. ansible-playbook nginx.yml --syntax-check
  3. #执行playbook
  4. ansible-playbook nginx.yml
复制代码

6.5、验证nginx启动状态
  1. #ps aux|grep nginx显示nginx的进程,curl -s 查看实际的响应体内容
  2. ansible node2 -m shell -a "ps aux | grep nginx ; curl -s 192.168.112.30:8080"
复制代码

7、安装nginx,并添加handlers和notify

7.1、修改对应的nginx.yml和nginx.conf文件

nginx2.yml
  1. ---
  2. - name: Update web servers
  3.   hosts: node2
  4.   remote_user: root
  5.   tasks:
  6.   - name: Install epel
  7.     yum:
  8.       name: epel-release.noarch
  9.       state: latest
  10.   - name: Install nginx
  11.     yum:
  12.       name: nginx
  13.       state: present
  14.   - name: Copy nginx configure file
  15.     copy:
  16.       src: /root/ansible/conf/nginx2.conf
  17.       dest: /etc/nginx/nginx2.conf
  18.       backup: yes
  19.     notify: reload                #当nginx.conf发生改变时,通知给相应的handlers
  20.     tags: reloadnginx                #打标签
  21.   - name: Start nginx
  22.     service:
  23.       name: nginx
  24.       state: restarted
  25.     tags: startnginx                #打标签
  26.   - name: Create index.html
  27.     shell: echo "hello playbook_nginx_2" > /usr/share/nginx/html/index.html
  28.   handlers:                #注意,前面没有-,是两个空格
  29.     - name: reload
  30.       service:
  31.         name: nginx
  32.         state: restarted
复制代码
nginx2.conf
  1. [root@server conf]# cat nginx2.conf
  2. events {
  3.     worker_connections  1024;
  4. }
  5. http {
  6.     server {
  7.         listen 8080;
  8.         server_name 192.168.112.30:8080;
  9.         location / {
  10.             index index.html;
  11.         }
  12.     }
  13. }
复制代码
7.2、验证nginx进程信息
  1. #验证端口和响应内容
  2. ansible node2 -m shell -a "ss -tunlp | grep nginx ; curl -s 192.168.112.30:8080"
复制代码

7.3、测试标签
  1. #先关闭node3上的nginx服务以便测试
  2. ansible node3 -m shell -a "systemctl stop nginx"
  3. #再运行剧本并引用标签startnginx
  4. ansible-playbook nginx2.yml -t startnginx
复制代码

7.4、测试notify

7.4.1、notify的触发条件是设置文件被改变
  1. #修改监听的端口号
  2. [root@server conf]# cat nginx2.conf
  3. events {
  4.     worker_connections  1024;
  5. }
  6. http {
  7.     server {
  8.         listen 8848;
  9.         server_name 192.168.112.30:8080;
  10.         location / {
  11.             index index.html;
  12.         }
  13.     }
  14. }
复制代码

7.4.2、重新实验脚本
  1. #语法检查
  2. ansible-playbook nginx2.yml --syntax-check
  3. #再运行剧本并引用标签reloadnginx
  4. ansible-playbook nginx2.yml -t reloadnginx
复制代码

7.4.3、重新检察端口号
  1. ansible node2 -m shell -a "ss -tnulp | grep nginx"
复制代码

端口号变为8848
8、变量(variables)

在Ansible脚本中,vars 是用来界说变量的一个关键字,它答应你为任务、play或整个脚本设定变量值。
这些变量可以在后续的任务中被引用,以提高脚本的机动性和重用性。
8.1、界说变量的方式

1. Facts(Facts变量)


  • 描述:Facts是Ansible自动收集的目标主机信息,如系统类型、网络设置等。它们不是直接界说的变量,而是通过实验setup模块获取的。只管不能直接界说Facts,但它们可以在脚本中像其他变量一样使用。
  • 使用方式
    1. - name: Display hostname using a fact
    2.   debug:
    3.     msg: "The hostname is {{ ansible_hostname }}"
    复制代码
  • 检察所有可以使用的变量:
    1. ansible node1 -m setup > variables
    复制代码
2. 用户自界说变量


  • 直接在Playbook中界说

    • 可以在play或tasks级别界说变量。
      1. - hosts: web_test
      2.   vars:
      3.     my_var: "Hello, World!"
      4.   tasks:
      5.   - name: Use playbook-defined variable
      6.     debug:
      7.       msg: "{{ my_var }}"
      复制代码

  • 通过命令行参数(-e/--extra-vars)传入

    • 在运行Ansible命令时动态添加变量。
      1. ansible-playbook my_playbook.yml -e "my_var=ValueFromCommandLine"
      复制代码

3. 通过Roles转达变量


  • 简介:Roles是Ansible组织和复用任务的一种方式。变量可以通过脚色的defaults, vars, environment目录下的文件来界说,或者在脚色的tasks/main.yml等文件中直接界说。

    • 例子:

      • 在roles/my_role/defaults/main.yml中界说:
        1. my_role_variable: default_value
        复制代码
      • 然后在使用该脚色的playbook中,该变量自动可用,也可被更高优先级的变量覆盖。


4. Host Inventory(主机清单)中界说变量


  • 向不同主机转达不同变量
    1. [webservers]
    2. host1.example.com my_var=value1
    3. host2.example.com my_var=value2
    复制代码
  • 向组中的所有主机转达相同变量
    1. [webservers:vars]
    2. group_variable=value_for_all_hosts_in_group
    复制代码
8.2、优先级


  • 通过命令行指定变量优先级最高
  • /etc/ansible/hosts界说变量(针对单个主机界说,针对主机组进行界说)
  • playbook中界说的变量
8.3、案例:使用变量安装keepalived

1、编写脚本
  1. #先复制一份
  2. [root@server bin]# cp nginx2.yml keepalived.yml
  3. #再通过vim的替换将nginx替换为变量并优化一下src地址
  4. [root@server bin]# cat keepalived.yml
  5. ---
  6. - name: Update web servers
  7.   hosts: node2
  8.   remote_user: root
  9.   tasks:
  10.   - name: Install epel
  11.     yum:
  12.       name: epel-release.noarch
  13.       state: latest
  14.   - name: Install {{ rpmname }}
  15.     yum:
  16.       name: "{{ rpmname }}"
  17.       state: present
  18.   - name: Copy {{ rpmname }} configure file
  19.     copy:
  20.       src: /root/ansible/conf/{{ rpmname }}.conf
  21.       dest: /etc/{{ rpmname }}/{{ rpmname }}.conf
  22.       backup: yes
  23.     notify: reload
  24.     tags: reload{{ rpmname }}
  25.   - name: Start {{ rpmname }}
  26.     service:
  27.       name: "{{ rpmname }}"
  28.       state: restarted
  29.     tags: start{{ rpmname }}
  30.   handlers:
  31.     - name: reload
  32.       service:
  33.         name: "{{ rpmname }}"
  34.         state: restarted
复制代码
全局替换并添加确认动作
输入y确认替换
替换好的脚本
2、拷贝设置文件

我们想要在被监管的机器上安装什么服务的话,就直接在我们的server端上把该服务的设置文件拷贝到我们界说脚本的src目录下。这样我们的脚本才能正常运行。
  1. cp /etc/keepalived/keepalived.conf /root/ansible/conf/keepalived.conf
复制代码
3、运行脚本,变量由命令行传入
  1. #语法检查
  2. ansible-playbook keepalived.yml --syntax-check
  3. #执行剧本-e 接变量
  4. ansible-playbook keepalived.yml -e rpmname=keepalived
复制代码

4、或者直接再脚本里界说变量

我们可以直接在脚本中把变量界说好,这样就不需要在通过命令行传入了。
以后想要安装不同的服务,直接在脚本里把变量修改一下即可。
  1. [root@server bin]# vim keepalived.yml
  2. ---
  3. - name: Update web servers
  4.   hosts: node2
  5.   remote_user: root
  6.   vars:
  7.     - rpmname: keepalived
  8.   tasks:
  9.   - name: Install epel
  10.     yum:
  11.       name: epel-release.noarch
  12.       state: latest
  13.   - name: Install {{ rpmname }}
  14.     yum:
  15.       name: "{{ rpmname }}"
  16.       state: present
  17.   - name: Copy {{ rpmname }} configure file
  18.     copy:
  19.       src: /root/ansible/conf/{{ rpmname }}.conf
  20.       dest: /etc/{{ rpmname }}/{{ rpmname }}.conf
  21.       backup: yes
  22.     notify: reload
  23.     tags: reload{{ rpmname }}
  24.   - name: Start {{ rpmname }}
  25.     service:
  26.       name: "{{ rpmname }}"
  27.       state: restarted
  28.     tags: start{{ rpmname }}
  29.   handlers:
  30.     - name: reload
  31.       service:
  32.         name: "{{ rpmname }}"
  33.         state: restarted
复制代码
5、运行界说过变量的脚本
  1. #语法检查
  2. ansible-playbook keepalived.yml --syntax-check
  3. #执行剧本
  4. ansible-playbook keepalived.yml
复制代码

9、模板(templates)

9.1、简介

Templates主要用于自动生成和管理服务器上的设置文件,如nginx的设置、数据库设置等。这有助于实现根本设施的设置标准化和自动化。


  • 文本文件,内部嵌套有模板语言的脚本
  • jinja2是由python编写的,在使用模板文件时jinja2是很好的解决方案
  • 功能:将模板文件中的变量转换成对应的本田主机的确定值\
9.2、根本数据类型和操作符

<ul>字符串:在Jinja2模板中,无论是单引号还是双引号,都可以用来界说字符串。例如,{{ "Hello, World!" }} 或 {{ 'Hello, World!' }}。
数字:Jinja2直接支持整数和浮点数的使用,无需特别的标记,如 {{ 42 }} 或 {{ 3.14 }}。
列表(List)元组(Tuple):虽然Jinja2原生支持列表(使用方括号[]),但元组的直接表示不如Python中常见,因为模板更倾向于动态输出而不是静态结构。列表示例:{% for item in [1, 2, 3] %}...{% endfor %}。
字典(Dictionary):与Python类似,使用花括号{}界说,键值对之间用冒号:分隔。例如,{{ {"key": "value", "another_key": 42} }}。
布尔型(Booleans):在Jinja2中,可以直接使用true和false(全部小写),用于条件判断。
算术运算:Jinja2支持所有根本的算术运算符,包括+, -, *, /, //, %, **。例如,{{ 5 + 3 }} 或 {{ 10 // 2 }}。
比力操作:与Python相同,包括==, !=, >, >=,  /var/www/html/index.html[/code]15.4、实验脚本
  1. [root@server1 ~]# egrep -v "^$|^#" /etc/ansible/hosts
  2. [all-servers]
  3. server1
  4. server2
  5. server3
  6. server4
  7. [all_ip]
  8. 192.168.112.10
  9. 192.168.112.20
  10. 192.168.112.30
  11. 192.168.112.40
复制代码

15.5、验证
  1. hostnamectl set-hostname server1
  2. hostnamectl set-hostname server2
  3. hostnamectl set-hostname server3
  4. hostnamectl set-hostname server4
复制代码

16、案例:使用脚色安装java+nginx+halo

16.1、准备脚色
  1. [root@server1 ~]# vim hosts.j2
  2. 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. {% for host in groups.all_ip %}
  5. {{hostvars[host].ansible_ens33.ipv4.address}} {{hostvars[host].ansible_hostname}}
  6. {% endfor %}
复制代码

16.2、编写site.yml


  • pre_tasks为运行play之前实验的任务
  • post_tasks为运行play之后实验的任务
  1. [root@server1 ~]# vim hosts.yml
  2. ---
  3. - name: Config hosts file
  4.   hosts: all_ip
  5.   remote_user: root
  6.   tasks:
  7.   - name: copy hosts.j2 to group servers
  8.     template:
  9.       src: hosts.j2
  10.       dest: /etc/hosts
复制代码
16.3、编写nginx脚色

nginx/tasks/main.yml
  1. ansible-playbook hosts.yml --syntax-check
  2. ansible-playbook hosts.yml
复制代码
meta/main.yml为role的依赖关系,要先运行这里面的内容才会运行自己的nginx这个role。
  1. ansible all-servers -m shell -a "tail -4 /etc/hosts"
复制代码
nginx/templates/halo.conf
  1. tasks:
  2. - name: install conf file to centos7
  3.   template: src=files/nginx.conf.c7.j2
  4.   when: ansible_distribution_major_version == "7"
  5. - name: install conf file to centos6
  6.   template: src=files/nginx.conf.c6.j2
  7.   when: ansible_distribution_major_version == "6"
复制代码
16.4、编写java脚色

为了安装java
  1. #基于字符串列表
  2. tasks:
  3. ‐ name: create rsyncd file
  4.   copy: src={{ item }} dest=/tmp/{{ item }}
  5.   with_items:
  6.     ‐ a
  7.     ‐ b
  8.     ‐ c
  9.     ‐ d
  10. *with_itmes 嵌套子变量*
  11. #基于字典列表
  12. ‐ hosts: eagleslab
  13.   remote_user: root
  14.   tasks:
  15.   ‐ name: add several users
  16.     user: name={{ item.name }} state=present groups={{ item.groups }}
  17.     with_items:
  18.       ‐ { name: 'testuser1' , groups: 'wheel'}
  19.       ‐ { name: 'testuser2' , groups: 'root' }
复制代码
16.5、编写halo脚色
  1. [root@server1 ~]# vim user_manage.yml
  2. ---
  3. - name: Manage user
  4.   hosts: all-servers
  5.   remote_user: root
  6.   tasks:
  7.   - name: ensure group xsb/jsb/cwb exists
  8.     group:
  9.       name={{ item.group }}
  10.     with_items:
  11.       - { group: 'xsb' }
  12.       - { group: 'cwb' }
  13.       - { group: 'jsb' }
  14.   - name: create users zhangsan/lisi/wangwu/maliu/zhaoqi
  15.     user:
  16.       name={{ item.name }}
  17.       group={{ item.group }}
  18.       shell={{ item.shell }}
  19.       comment={{ item.comment }}
  20.       home={{ item.home }}
  21.     with_items:
  22.       - { name: 'zhangsan', group: 'xsb',home: '/home/xsb/zhangsan',shell: '/bin/bash',comment: '销售'}
  23.       - { name: 'lisi', group: 'xsb',home: '/home/xsb/zhangsan',shell: '/bin/bash',comment: '销售'}
  24.       - { name: 'wangwu', group: 'jsb',home: '/home/jsb/wangwu',shell: '/bin/sh',comment: 'java工程师'}
  25.       - { name: 'maliu', group: 'jsb',home: '/home/jsb/maliu',shell: '/bin/sh',comment: 'linux工程师'}
  26.       - { name: 'zhaoqi', group: 'cwb',home: '/home/cwb/zhaoqi',shell: '/bin/sh',comment: '会计'}
复制代码
修改变量文件halo/vars/main.yml
  1. #语法检查
  2. ansible-playbook user_manage.yml --syntax-check
  3. #执行剧本
  4. ansible-playbook user_manage.yml
复制代码
下载servers文件并编辑
  1. ansible all-servers -m shell -a "id zhangsan ; id lisi ; id wangwu ; id maliu ; id zhaoqi"
复制代码
16.6、实验脚本
  1. - name: install some packages
  2.   yum: name={{ item }} state=present
  3.   with_items:
  4.     - nginx
  5.     - memcached
  6.     - php-fpm
  7. - name: add some groups
  8.   group: name={{ item }} state=present
  9.   with_items:
  10.     - group11
  11.     - group12
  12.     - group13
  13. - name: add some users
  14.   user: name={{ item.name }} group={{ item.group }} state=present
  15.   with_items:
  16.     - { name: 'user11', group: 'group11' }
  17.     - { name: 'user12', group: 'group12' }
  18.     - { name: 'user13', group: 'group13' }
复制代码

16.7、验证

通过IP+端口访问
192.168.112.10:8090

至此ansible的学习就告一段落啦

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表