自动化工具 Ansible 管理集群

生物信息团队一般都有个集群,集群的管理无论是安装移除软件、修改配置或者更新等等,不能人手动一个一个节点操作,第一浪费时间第二怕不一致。Ansible 是这样一款辅助我们管理的工具,通过它我们在控制节点批量操作和管理。

Ansible 结构如下图,需要一个控制节点和若干被管理节点,在控制节点安装 Ansible 服务,根据管理清单(Inventory)对管理节点进行自动化管理。


Ansible 结构

安装
Ansible 可通过 pip 安装,也可以系统管理工具安装,这里选择系统安装。在 ubuntu 运行下列命令,在老版本 "software-properties-common" 可能叫 "python-software-properties" 如果出错更改试一下。

$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible

管理清单
默认管理清单是 /etc/ansible/hosts 文件也可以用 -i 参数指定其它配置文件,甚至同时用多个。可以将主机分组,往后 Ansible 可对分组进行操作,如下 2 个属于 webservers 组。Ansible 默认有 2 个组 all 和 ungrouped, 前者包含所有主机,后者是不被任何组(除 all)包含的主机。

[webservers]
foo.example.com
bar.example.com

主机名允许数字范围批量指定。

[webservers]
www[01:50].example.com

清单参数跟主机同一行用 key=value 格式,不同参数用空格分隔,如果 value 本身有空格,可以用引号区分。分组也可以定义参数,在该组所有节点生效,下面定义了 atlanta 整组的参数。

[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com

在控制节点用 ssh-agent 服务从而避免重复输入 ssh 密码。先将控制节点公钥拷贝到被管理节点,然后

# 启动 ssh-agent 服务
eval `ssh-agent`
# 添加到 ssh-agent
ssh-add ~/.ssh/id_rsa

本地主机不用 ssh 连接,设置连接为 "local".

localhost ansible_connection=local ansible_python_interpreter="/usr/bin/env python"

查看已有清单配置用 ansible-inventory --list 命令。

playbook
playbooks 让 ansible 的管理用简单的方式实现可重复和可服用,也可以把它当作历史记录。
playbooks 要求 YAML 格式文本,里面包含多个 "play" ,每个 "play" 又可以包含多个任务(tasks),"play" 和任务都是从上到下执行。

---
- name: Update web servers
  hosts: webservers
  remote_user: root

  tasks:
  - name: Ensure apache is at the latest version
    ansible.builtin.yum:
      name: httpd
      state: latest
  - name: Write the apache config file
    ansible.builtin.template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

- name: Update db servers
  hosts: databases
  remote_user: root

  tasks:
  - name: Ensure postgresql is at the latest version
    ansible.builtin.yum:
      name: postgresql
      state: latest
  - name: Ensure that postgresql is started
    ansible.builtin.service:
      name: postgresql
      state: started

编辑好后 ansible-playbook 执行,并返回每一任务执行的状态。

ansible-playbook -v -K r_tidyverse.yml

其中 -v 输出详细执行记录,可以看到命令在远程机器执行时的标准输出和标准错误,-K 是手动输入 become 密码。

become
如果要用 sudo 执行命令需要设置 "become",如在 playbook 写入:

become: yes
become_method: sudo

become 可以设置在 play 层面,也可以在 task 层面。
become_method 可选值有 [ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | machinectl ]
其他的 become 参数还有:

  • ansible_become_user | 默认为 root 可设置其他,要求 remote_user 有切换过去的权限
  • ansible_become_password | 切换账户的密码,不建议明文写在配置文件里,可以不写,然后在执行 playbook 时用 --ask-become-pass 参数然后手动输入

modules
模块列表在 All modules — Ansible Documentation 查看。
Ansible 模块直接在远程机器执行一些命令,可以命令行直接执行,也可以写入 playbooks.

ansible webservers -m service -a "name=httpd state=started"
ansible webservers -m ping
ansible webservers -m command -a "/sbin/reboot -t now"
# in playbook
- name: reboot the servers
  command: /sbin/reboot -t now

apt 模块
apt 模块执行包管理命令 apt. 一般装包之前运行 apt update 命令:

- name: upgrade apt
  apt:
    update_cache: yes

设置包的 state 为 present/absent 来安装或移除包,latest 是更新到最新版。

- name: install package
  apt:
    name: wget
    state: present

command 模块
command 模块执行 shell 命令,但是它不通过 shell 所以像 $HOME或一些操作符 >, <, |, ;, & 等等都不能生效,需要的话用 shell 模块。
可以将命令放 command 后,也可以放在 cmd 参数后

# command 
- name: test command
  command: echo BeeBee
  
# cmd
- name: test cmd
  command:
    cmd: echo BeeBee

想在指定目录执行命令用 chdir 参数,chdir 会在命令运行前生效

- name: test cmd
  command:
    cmd: ls 
    chdir: /home/beebee

file 模块
file 模块对文件执行各种操作,删除、新建、链接、修改属性等等,file 不方便用通配符那些,跟 find 模块一起用能实现批量操作,比如删除

- name: find old downloads
  find:
    paths: /home/beebee
    patterns: modules-5.1.*
    file_type: any
  register: xpath
- name: remove old downloads
  file:
    path: "{{ item.path }}"
    state: absent
  with_items: "{{ xpath.files }}"

参考资料
Ansible Documentation — Ansible Documentation

你可能感兴趣的:(自动化工具 Ansible 管理集群)