创建和使用角色
角色功能(roles)则是Ansible服务自1.2版本开始引入的新特性,用于层次性、结构化的组织剧本。角色功能通过分别把变量、文件、任务、模块及处理器配置放在各个独立的目录中,然后对其进行便捷加载的一种机制。简单来说,角色功能是把常用的一些功能“类模块化”,然后用的时候加载即可。
Ansible服务的角色功能也有些类似于编程中的封装技术,将具体的功能封装起来,用户不仅可以方便的调用它,甚至不用完全理解其中原理,也可以使用。
角色的好处就在于其组织成了一个简洁的、可重复调用的抽象对象,让用户把注意力放到Playbook上,统筹各个关键性任务,需要时才深入了解细节。
角色的获取三种方法:加载系统内置的;外部环境获取的及自行创建的。
加载系统内置角色
使用内置的角色不需要联网即可实现。用户只需要配置好软件仓库的配置文件,然后安装包含系统角色的软件包rhel-system-roles,即可在系统中找到它们了,及能够使用Playbook剧本文件进行调用。
# dnf install -y rhel-system-roles
# ansible-galaxy list (安装完后进行查看系统自带的角色)
ansible系统角色描述
以rhel-system-roles.timesync角色为例,它用于设置系统时间和NTP服务,让主机能同步准确的时间信息。NTP服务器是用于计算机时间同步的一种协议,提供高精度的时间校准服务,帮助计算机校对系统时钟。
可以复制playbook剧本模板文件/usr/share/doc/rhel-system-roles/来修改使用。
# cp /usr/share/doc/rhel-system-rles/timesync/example-timesync-playbook.yml timesync.yml
在复制的剧本模板文件中,删掉多余的代码,将NTP服务器的地址填写到timesync_ntp_servers变量的hostname字段中即可。稍后timesync角色就会自动为用户配置参数信息了。(变量参数hostname: NTP服务器主机名; iburst: 启用快速同步)
从外部获取角色
Ansible Galaxy是Ansible的官方服务,用于共享角色和功能代码,用户可以自由的在网站上共享和下载Ansible角色,是管理和使用角色的不二之选。
Ansible Galaxy 官网首页:https://galaxy.ansible.com
可以通过页面的搜索进行相关角色的搜索,如:nginx,根据Installation进行联网安装。
# ansible-galaxy install nginxinc.nginx
# ansible-galaxy list (查看安装后角色信息)
一些不是官网的就需要手动编写一个YAML文件,指明网址链接和角色名称,在用“-r”参数进行加载。如,网址www.linuxporbe.com上的一个叫做nginx_core的角色软件包,是用于对nginx网站进行保护的插件功能,编写的yml配置文件如下。
然后用ansible-galaxy命令的“-r”参数加载这个文件即可
# ansible-galaxy install -r nginx.yml
# ansible-galaxy list
创建新的角色
下面会创建一个名为apache的新角色信息,它能够帮助我们自动安装,运行httpd网站服务,设置防火墙允许规则及根据每个主机生成独立的index.html首页文件,让用户调用后就能享受一条龙的部署网站服务。
根据主配置文件的68行 定义的角色保存路径,如果用户新建的角色信息不在规定目录内,使用ansible-galaxy list 是无法找到的。因此需要手动填写新角色目录的路径,或是进入到系统规定目录/etc/ansible/roles中再进行创建,避免角色信息分散不好管理,还是建议在默认目录下进行创建。
创建新角色用”init”参数,且建立成功后会在当前目录下生成一个新的目录。(角色和目录名一样)
# cd /etc/ansible/roles
# ansible-galaxy init apache
Ansible角色目录结构及含义
把正确的信息放入到正确的目录中,调用角色时才能有正确的效果。
第一步:编写定义角色任务的tasks/main.yml。
该文件不用定义执行的主机组列表,后面编写playbook剧本进行调用,应先对apache角色做的事情有个明确的思路,调用角色后yml文件会按照从上至下顺序自动执行
1:安装httpd网站服务
2:运行httpd网站服务,并加入到开机启动项中
3:配置防火墙放行httpd网站协议
4:根据每台主机的变量值,生成不同的主页文件
第二步:用service模块启动httpd网站服务程序,并加入到启动项中。
初次使用模块前用ansible-doc看下帮助和实例信息。如,ansible-doc service
第三步:配置防火墙放行允许策略,让其他主机可以正常访问。
同样看下firewalld模块帮助及实例, ansible-doc firewalld
第四步:让每个主机显示的内容不同。
一般模块都是查一个写一个,不过这样比较费事。让每个主机运行httpd网站都有不同的内容,这样需要用到template模块及Jinja2技术。
template模块是一个用于复制文件模板的模块,能把文件从Ansible服务器复制到受管主机上,“src”参数用于定义本地文件的路径,“dest”参数用于定义复制到受管主机的文件路径,而owner、group、mode参数可选择性的设置文件归属及权限信息。
Jinja2技术不会在原始文件中直接写入文件内容,而是一系列的变量名称,在使用template模块进行复制的过程中,由Ansible服务负责在受管主机上收集这些变量名称所对应的值,最后再逐一填写到目标文件中,能够让每台主机的文件都根据自身系统情况来独立生成。
例如:“Welcome to 主机名 on 主机地址”。中间的变量名称(主机名及主机地址)对应的值保存在哪里?可用setup模块进行查询,这个模块是自动收集主机上的变量信息。
用-a参数追加filter指令可对收集的信息进行二次过滤。
语法格式:ansible all -m setup -a ‘filter=”关键词”’,其中*是通配符。
主机名称搜索为fqdn(Fully Qualified Domain Name即完全限定主机名),也常常作为主机名的完全表达形式,比/etc/hostname文件中定义的主机名更加严谨和准确。
# ansible-doc setup
# ansible all -m setup -a ‘filter=”*fqdn*”’ (ansible_fqdn变量)
# ansible all -m setup -a ‘filter=”*ip*”’ (通过ip进行检索,ansible_all_ipv4_addresses变量)
确定了所对应的具体变量名称后,需要到角色所对应的templates目录内新建一个与上面templates模块参数相同的文件名称(index.html.j2)。Jinja2调用变量时,格式为在变量名称的两侧各加两个大括号。
最后:写一个用于调用apache角色的yml文件及执行它。
实例:模块应用
创建和使用逻辑卷
实验:创建一个批量自动管理LVM逻辑卷设备的playbook,大大提高硬盘设备的管理效率,减少手动创建带来的错误。
在每个受管主机上都创建一个名称data的逻辑卷设备,大小150M,归属于researche卷组。如果创建成功,则进一步用ext4文件系统进行格式化操作,若创建失败,则给用户一条报错提醒,以便排查原因。
用Ansible剧本方式比用Shell脚本优势打很多,主要有两点。
其一:Ansible模块化操作更标准,执行过程中无错,便会依据远程主机的系统版本及配置自动做出判断和操作,不用担心受系统变化而导致命令失效的问题。
其二:Ansible服务在执行剧本文件时会进行判断,如该文件或该设备被创建过,或是某个动作(play)已经被执行过,则绝对不会再重复的执行,而使用Shell脚本有可能导致设备被重复格式化,导致数据丢失。
思路:让playbook剧本文件依次创建PV物理卷、VG卷组及LV逻辑卷。先用lvg模块让设备支持逻辑卷技术,并创建一个名为research的卷组。
# ansible-doc lvg (卷组,查看下lvg如何使用)
(其中“vg”参数用于定义卷组的名称,“pvs”参数用于指定硬盘设备名称,而“pesize”参数用于确定最终卷组的容量大小,可以用PE个数亦可用容量值进行指定)
ansible-doc lvol (逻辑卷,同样查看下lvol如何使用)
(其中“vg”参数用于指定卷组名称,“lv”参数用于指定逻辑卷名称,而“size”参数用于指定最终逻辑卷设备的容量大小,不加单位默认为M。)
# ansible-doc filesystem (格式化)
(参数“fstype”用于指定文件系统的格式化类型,“dev”参数用于指定要格式化的设备文件路径)
如果按照前面的下来,LVM逻辑卷设备就自动创建好了,但是只有我们实验的prod组主机里面添加了新硬盘设备,其余主机则没有。要实现则用IF–ELSE–条件语句方式进行。
首先的将 三个模块命令用 block 操作符作为一个整体,(即对三个模块执行结果作为一个整体判断),然后用rescue操作符进行救援,只有 block 模块执行失败了才调用rescue 救援模块。其中 debug 模块的msg 参数作用是如果 block 中的模块执行失败则输出一个信息提示。
最后,运行剧本,查看下逻辑卷。
# ansible-playbook lv.yml
# lvdisplay
判断主机组名
前面的实验能单的生成不同的网站首页,却无法对某个主机进行针对性的操作。其实每个客户端都有一个“inventory_hostname”的变量,用于定义每个节点主机所对应的Ansible服务主机组名称,即/etc/ansible/hosts文件中所对应的分站信息,例:dev、test、prod、balancers。
“inventory_hostname”变量是Ansible服务中的特殊变量,无法用setup模块直接进行查询。
“ansible all -m setup -a ‘filter=”关键词”’”命令会失效不起作用。特殊变量需要在执行playbook剧本文件时的[Gathering Facts]阶段进行搜索,直接查询不行,只能在剧本文件中进行调用。
获得存储主机组名称的变量名称,需求如下:
若主机节点在dev分组中,则修改/etc/issue文件内容为”Development”;
若主机节点在test分组中,则修改/etc/issue文件内容为”Test”;
若主机节点在prod分组中,则修改/etc/issue文件内容为”Production”;
第一步:Ansible服务常用模块名称copy
第二步:运行然后去不同主机查看
# ansible-playbook issue.yml
# cat /etc/issue (登录到不同主机去看)
管理密码库文件
Ansible服务自1.5版本后,“Vault”功能不仅实现对密码、剧本等敏感信息进行加密甚至可以加密变量名和变量值。
使用ansible-vault命令可以实现对内容的新建(create)、加密(encrypt)、解密(decrypt)、修改口令(rekey)及查看(view)等等功能。
第一步:如,创建一个名为locker.yml的配置文件,其中保存有两个变量值
第二步:用ansible-vault命令对文件进行加密,不要每次输入密码,所以还新建一个用于保存密码值的文本文件,让ansible-vault进行自动调用。密码文件授权为600,仅管理员可读可写。
然后在ansible服务的主配置文件中进行调用,在第140行”vault_password_file”参数后指定密码值保存的文件路径。
第三步:设置好密码文件路径,ansible服务会自动加载。加密刚刚创建的locker.yml,只用“encrypt”参数即可。
加密过后文件将使用AES256格式进行加密。
# ansible-vault encrypt locker.yml
# cat locker.yml
如需不用原始密码,手动对文件进行“rekey”修改密码操作,同时结合“–ask-vault-pass”参数修改。否则ansible服务会因接受不到用户输入的旧密码值,而拒绝新的密码变更请求。
# ansible-vault rekey --ask-vault-pass locker.yml
(输入旧密码、输入新密码、确认密码)
第四步:想查看和修改加密文件中的内容。需要用ansible-vault命令的”edit”参数进行修改,随后用”view”参数即可查看到修改的内容。
# ansible-vault view locker.yml
(输入密码后查看)