笔者现在一直在跟着《Ansible自动化运维 技术与最佳实践》这本书一直在做ansible的学习,秉着不从入门到弃坑的原则,在这里用博客记录下我在书中做实验遇到的一些问题和想法,同时会把笔者在这个过程中遇到新知识概念和解决的问题也一起分享。自认为技术渣渣,秉着opensource的精神,欢迎大家指出写的不好的地方开喷。
笔者在这里部署了三个节点。
1.AnsibleControl(192.168.116.128)主要安装Ansible组件并且向其他两个节点下发命令
2.web(192.168.116.129)主要实验使用playbook来部署nginx。
3.devstack(192.168.116.130)在这里用devstack部署了一套云环境,然后使用ansible来管理云环境。
建立了一个inventory,其中包含了一个web组和一个devstack组,这两个组都属于ansible这个大组中。
ansible命令都是并发执行,我们可以针对目标主机执行任何命令。默认的并发数目由ansible.cfg中的forks值来控制。当然,也可以在运行ansible命令的时候通过-f指定并发数。如果遇到执行任务时间很长的情况,也可以使用ansible的异步执行功能。
在新版ansible中使用-P 0无法直接显示出这个时间ID,但是在对端远程的节点上.ansible_async中是存在jod_id的,也可以通过async_status模块查看异步任务的状态和结果:
ansible ansible -m copy -a 'src=/root/ansible_inventory/web dest=/root/web owner=root group=root mode=644 backup=yes' -o
再来验证文件下发功能:
ansible ansible -m shell -a 'md5sum /root/web' -f 5 -o
ansible web -m yum -a 'name=httpd state=latest' -f 5 -o
验证是否安装完成
# ansible web -m shell -a 'rpm -qa httpd' -f 5 -o
开启服务
ansible web -m shell -a 'systemctl start httpd' -f
首先通过openssl命令来生成一个密码,因为ansible user的password参数需要接受加密后的值,如下所示:
# echo ansible | openssl passwd -1 -stdin
# echo ansible | openssl passwd -1 -stdin
$1$LIWIAhG5$BqDqObL0aBZJUNAB381.x0
# ansible ansible -m user -a 'name=ansible password="$1$LIWIAhG5$BqDqObL0aBZJUNAB381.x0"' -f 5 -o
常用的一些参数:
-i 指定inventory列表
-a 加入module参数
-B 每间隔几秒异步运行指令
-P轮询访问结果,一般与-B结合使用
-o 将结果压缩为一行输出
-l 列出可使用的模块
-s列出某个模块支持的动作
facts组件是ansible用于采集被管理及其设备信息的一个功能,我们可以使用setup模块查及其所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
使用filter来指定想要筛选的特定值,来查看我们所需要的值。
ansible web -m setup -a 'filter=ansible_all_ipv4_addresses'
fact组件默认已经收集了很多的设备基础信息,这些信息可以在做配置管理的时候进行引用。fact信息直接当做playbook变量信息进行引用。通过定制facts以便收集我们想要的信息,同时可以通过facter和ohai来拓展facts信息。使用facter拓展facts信息。facter是pupper里面负责收集主机静态信息的组件,ansible的facts功能也一样。ansible的facts组件也会判断被控制机器上是否安装有facter和ruby-json包,如果存在的话,ansible的facts也会采集facter信息。使用ansible查看目标主机是否安装facter包。
像这样就是没有返回结果。尝试安装ruby-json和facter发现不能安装。修改为国内的163源也是无法安装
查询发现ruby-json是属于ruby的一个插件而facter是puppet的一个插件,安装puppet解决先决条件ruby。ruby的话直接使用Centos自带的源或者163的源能够直接安装这个问题不大
#yum install ruby
如何在CentOS上安装facter:
需要首先下载EPEL repo源。
Centos 6 - 32bit
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
CentOS 6 - 64bit
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
CentOS5 - 32 bit
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
CentOS5 - 64bit
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
CentOS7 -64 bit
rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
#ansible web -m facter
所有facter信息在ansible_facts下以facter_开头,这些信息的引用方式跟ansible自带facts组件收集的信息引用方式一致。
使用ohai扩展facts信息:
ohai是chef配置管理工具中检测节点属性的工具ansible的facts。当然需要被管理机器上安装ohai包。如果安装上了ohai组件则执行setup的时候也会包含一些ohai的信息。
ansible在1.2版本以后就支持了role。在实际工作中有很多不同业务需要编写很多playbook,如果时间一久,对这些playbook文件很难进行维护,这个时候我们就可以采用role的方式管理playbook。其实role只是对我们日常使用的playbook的目录结构进行一些规范,与日常的playbook没有什么区别。
如果我们定义一个role,然后在写playbook的时候静态文件跟jinja2模板文件直接用相对路径就行,ansible会自动去相应的目录下寻找相应文件。另外,role不会关心哪些设备使用它,它只是关于一个功能的集合,只需要编写一个playbook去引用即可。
ansible的galaxy是ansible官方一个分享role的功能平台,它的网址是https://galaxy.ansible.com/list#/roles?page=1&page_size=10。可以把你编写的role通过ansible-galaxy上传到galaxy网站供其他人下载和使用。也可以通过ansible-galaxy命令很简单地实现role的分享和安装,当然ansible也支持直接从github上下载role。在我们使用ansible-galaxy命令下载role的时候需要了解role的运行平台和ansible依赖版本以及相关依赖。日常工作中我们使用ansible-galaxy install就可以,默认会安装到/etc/ansible/roles/目录下,其引用跟我们自己写的role的方式一样。