自动化工具 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容