ansible 快速上手(Debian 9)
2020-12-27 tech linux ansible 6 mins 2 图 2193 字
ansible 是个运维利器,用于自动化运维。如果你在工作中需要管理多个机器,或者做PaaS/IaaS相关的快速原型开发,那么ansible是个非常有用的工具,可以帮助你快速完成目标。
我在最近工作中使用了 ansible,这篇文章做个简单记录备忘。
1. 背景和基本概念
ansible 集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
特点:
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
概念:
-
inventory ,即主机列表文件hosts,我们可通过它对定义每个节点的代号、连接信息和分组。
-
ansible.cfg, ansible的配置文件,默认位于 /etc/ansible。
-
ad-hoc, ansible 提供的一种命令方式,用于解决简单任务。
-
playbooks,ansible 提供的另一种命令方式,适合于复杂应用的部署。下面是一个例子:
--- - hosts: webservers vars: http_port: 80 max_clients: 200 remote_user: root tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest - name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name=httpd state=started handlers: - name: restart apache service: name=httpd state=restarted
-
Tasks, playbook的核心,定义顺序执行的动作。
每一个 play 包含了一个 task 列表(任务列表)。一个 task 在其所对应的所有主机上(通过 host pattern 匹配的所有主机)执行完毕之后,下一个 task 才会执行。
每一个task必须有一个名称name,这样在运行playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
-
action。每个 action 调用一个 ansbile module。 语法:
module: module_parameter=module_value
-
Modules,也被称为 “task plugins” 或 “library plugins”,也可以仅仅通过
ansible
命令来运行它们。下面是几个例子,-m后面接调用module的名字,-a后面接调用module的参数:ansible webservers -m service -a "name=httpd state=started" ansible webservers -m ping ansible webservers -m command -a "/sbin/reboot -t now"
bash 无论在命令行上执行,还是bash脚本中,都需要调用cd、ls、copy、yum等命令;module就是Ansible的“命令”。
-
roles
2. 安装
我使用的是 Debian 9,基于python-pip进行安装。CentOS系和ubuntu的安装差别不是很大。
apt-get install -y python-pip
pip install ansible
安装完成后简单测试如下:
ansible localhost -m command -a 'echo Hello World.'
localhost | SUCCESS | rc=0 >>
Hello World.
单节点使用完成了,下面是我多节点的配置。在/etc/ansible目录下创建两个文件如下:
- 配置文件ansible.cfg
- 节点文件hosts
我使用了vagrant 在本地运行了4个虚机,已经默认做好了免密登陆。正常节点之间也需要做好密钥免密登陆的配置。上述两个文件内容如下:
ansible.cfg 配置文件设置了host文件、默认的远程登录用户和不检查host key 的设置。
hosts文件设置了节点的别名和相关连接信息,并做了两个分组,local和k8s1。
运行一个测试命令,完成。
ansible all -m command -a 'echo Hello World.'