其实ansible还剩下使用角色和ansible内容集合来简化playbook、对ansible进行故障排除和自动执行Linux管理任务三部分。
至于如何对ansible进行故障排除,只有在生产中碰到了故障才用得上,并且即使碰上的还是需要具体问题具体分析,但是可以该部分内容可以提供解决思路。
简化playbook
[1]描述ansible角色结构
ansible角色的功能由目录结构来定义,目录名为角色名。defaults目录的main.yml包含变量,优先级别低,vars目录下的main.yml定义变量,优先级高于defaults,但注意不要重复定义变量。
files的main.yml包含角色任务引用的静态文件,templates则包含引用的jinja2模板。task目录下的main.yml文件定义task任务,而handler目录下的main.yml文件则用于定义handler处理程序。meta目录用于角色说明,作者信息等,tests目录下的test.yml文件用于测试角色功能。
[2]导入或包含角色
使用ansible.builtin.import_role静态导入,变量公开会给play的所有的任务,即使task位于import之前。如果ansible.builtin.include_role动态包含,则不会开放任何变量,即使task位于之后。同样条件和循环能够用于import_role里面的每一个任务,而只用用于include_role的当前任务。
我们还可以使用roles列表加载角色,这种方式会在任何task之前运行,不建议roles和tasks同时使用。不过可以使用pre_task和post_tasks来将特定任务放在角色之前或者之后来执行。如果pre_tasks中的task通知了handler,那么handler处理程序也会优于role之前使用。与此相反的是,post_tasks的handler的执行则是最后执行。
[3]创建和使用角色
可以使用ansible-galaxy init rolename来初始化角色,具有完整的角色目录结构,可以删除某些目录,如果不需要使用的话。推荐持续更新readme.md文件和meta目录,并通过tests目录集成测试角色的功能。
虽然ansible的角色本意就是为了更好的复用,但要避免一个角色承担多个任务,而是编写多个角色,让角色侧重于特定的用途与功能。角色可以依赖其他角色依赖,但尽量避免该做法。ansible-galaxy install -r 用来下载角色,-p可选项以指定下载的路径,也可以在ansible.cfg中配置。
ansible-galaxy info rolename可以查看角色的信息,其实就是从meta信息中找。ansible-galaxy list可以列出角色(可以使用-p指定路径),还有使用ansible-galaxy remove rolename可以快速删除角色。
[4]模块和系统角色
collections可以作为项目目录,里面可以安装额外的内容集合。如果要下载requirements.yml集合可以用 ansible-galaxy collection install -r requirements.yml,默认源是官方galaxy。
在项目使用模块的时候,会先从`ANSIBLE_COLLECTIONS_PATH` 环境变量路径中查找集合,其次才是项目目录中的collections目录,然后是家目录中的collections,最后才是`/usr/share/ansible/collections/`目录。
Ansible系统角色(System Roles)是官方维护的标准化角色集合,专门用于管理Linux系统级服务和配置。ansible通过定义task,实现对应的功能来提供针对RHET系统服务的角色,并且提供的系统角色尽量会屏蔽不同系统的差异。
Ansible故障排除
[1]对playbook进行故障排除
ansible-navigator run -v查看playbook运行时候的信息,有四个等级,等级越高越详细。还可以使用ansible.builtin.debug模块来查看对应的变量的值来排除故障,使用--syntax-check则可以检查playbook本身的语法。
ansible-navigator运行playbook的时候,默认会生成artifact工件,命名为playbook名称+artifact+时间,以json格式保存。可以通过ansible-navigator replay重放工件,使用-m stdout是输出到终端,否则以交互式查看。
[2]对受管主机进行故障排除
有可能是因为没有配置好ssh免密导致受管主机故障,也有可能是在受管主机上没有足够的权限来执行命令,还有可能是提权的时候没有输入密码等种种问题,或者在受管主机上没有python环境。当然,如果使用域名的话,注意本地DNS是否能够解析该域名。
可以使用--check来检测受管主机上的问题,用来显示会在受管主机上的进行的更改,但不执行它们。如果要在检查模式--check也运行,那么就将task的check_mode 设置为yes。当然,我们可以用一些模块来检测受管主机的状态,或者使用ansible临时命令。
自动执行Linux管理任务
[1]管理软件
使用ansible.builtin.package模块可以检测受管主机的包管理器并选择合适的来执行。推荐使用pakcage模块,因为这更符合ansible的理念。我们还可以通过收集的事实来查看受管主机已安装的软件包,通过ansible.builtin.package_facts模块来收集相关的事实。
[2]管理用户和身份验证
使用ansible.builtin.user模块可以给受管主机添加或者删除用户,通过shell指定默认shell,group指定主组,groups指定附加组,state描述状态等。ansible.builtin.group模块则是用于添加或者删除组,通过name指定名称,gid指定组ID。
还可以执行ssh远程登录相关的信息,如ansible.builtin.known_hosts模块,可用于将ssh_knonw_hosts文件复制给其他受管主机,这样在第一次ssh连接(连接该文件里面的主机)的时候就不会验证是否需要确定md5指纹了。
还有ansible.posix.authorized_key模块,可以用来在受管主机上添加ssh密钥(本地),这样ssh密钥对应的主机ssh连接该受管主机的时候就不需要使用密码了。还可以使用ansible.builtin.lineinfile模块来修改sudo文件,赋予用户sudo权限。
[3]管理调度和系统服务
使用ansible.posix.at模块可以在受管主机上调度一次性任务,ansible.builtin.cron模块则是调度周期性任务。在cron模块会在/etc/cron.d目录下创建任务文件,可以通过cron_file指定任务文件名,但如果只指定了用户,没有指定文件名则是在该用户的crontab文件中设置。
`ansible.builtin.systemd`是一个专门的、具体的模块,只用于与 `systemd`初始化系统交互。它直接调用 `systemctl`命令。`ansible.builtin.service`则是一个通用的、抽象的模块,它试图为各种初始化系统提供一个统一的接口。它会自动检测目标系统使用的初始化系统,然后调用相应的底层命令,可能是 `systemctl`, `service`, `rc-service`等。
[4]管理存储和网络配置
使用ansible.posix.mount模块可以操作受管主机挂载文件系统,当然,更多的是使用storage系统角色来完成任务。不过该系统角色只能管理未分区的设备,通过storage_volumes可以指定设备挂载的方式,使用storage_pools则可用于创建卷组。
同样ansible提供network系统角色来完成网络的管理,通过改变指定变量的值能够让系统角色完成不同的功能。我们还可以通过ansible.posix.firewalld模块来操作受管主机的防火墙,还有ansible.builtin.hostname来指定新的主机名。