生物信息团队一般都有个集群,集群的管理无论是安装移除软件、修改配置或者更新等等,不能人手动一个一个节点操作,第一浪费时间第二怕不一致。Ansible 是这样一款辅助我们管理的工具,通过它我们在控制节点批量操作和管理。
Ansible 结构如下图,需要一个控制节点和若干被管理节点,在控制节点安装 Ansible 服务,根据管理清单(Inventory)对管理节点进行自动化管理。
安装
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