美文网首页沙大斌产品
自动化工具 Ansible 管理集群

自动化工具 Ansible 管理集群

作者: BeeBee生信 | 来源:发表于2022-09-11 17:21 被阅读0次

    生物信息团队一般都有个集群,集群的管理无论是安装移除软件、修改配置或者更新等等,不能人手动一个一个节点操作,第一浪费时间第二怕不一致。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 管理集群

        本文链接:https://www.haomeiwen.com/subject/dzqfortx.html