AnsibleGo 语言学习专栏 首页投稿(暂停使用,暂停投稿)

『Ansible 上手指南:2』

2018-03-10  本文已影响70人  谢小路
Ansible 上手指南 2.png

读一本书最好的时机是什么时候?是你刚买的时候,趁着新鲜劲,先了解这本书,继而马上阅读完这本书。如果错过了最好的时机阅读一本书,那什么时候是合适的时机,是你需要这方面的资料或者知识的时候。

最近我一直在研究 Ansible 自动化运维工具。入手请参考 Ansible 上手指南。主要是为了实现自己在远程主机进行相关操作的任务,以此为切入点进行学习。

在实现了自己的任务后,我准备继续研究下 Ansible 的其他用法。下面就是我的个人总结。


体会:


下面的总结主要以例子为主:

大纲:

Ansible 是使用Python 编写,基于模块化的工作方式,真正处理动作都是这些模块。Ansible 提供整体的框架。

1、安装

pip install ansible

或者根据Linux 的版本进行

apt-get install ansible

管理主机要求是Linux, 节点主机需要带 Python 及相应的库。

一般是管理主机和节点主机都是Linux。

2、基本使用

命令行方式运行:

命令行方式适合操作简单的动作。

ansible all -m ping

playbook 运行:

playbook 适合复杂的处理动作。

ansible-playbook example.yml

查看支持的模块:

ansible-doc -l

查看某模块用法及支持的参数:

ansible-doc -s ping

3、配置文件

安装完成之后,默认目录下有两个文件:

/etc/ansible/hosts
/etc/ansible/ansible.cfg

hosts 文件定义节点主机的IP 及以下配置信息。

ansible.cfg 文件定义全局配置文件,配置项很多, 一般默认就可以完成你的日常任务了。

但是除默认的生成的 ansible.cfg 文件之外,你可以在自己的项目中创建这样一个同名ansible.cfg 文件。

ansible 读取配置文件的顺序是:

怎么理解这个读取配置文件的信息呢?

举个例子:

# 当前项目结构

ansible:
---playbooks
---example
---leanr-ansible/example.yml
---ansible.cfg

你在这个目录下执行:ansible 命令

4、常用模块

操作动作举例

这里为举例只明白这些模块的使用场景,故意执行多步操作。

快阅读时代,估计没人想认真看这些动作。画个流程图吧。


示意图

把每一步动作认为是一个任务 task.

第一步:先检查是否存在对应的文件,是则拷贝

模块:stat, copy, debug, file


- name: is /home/ubuntu/zartclient exists
  stat:
    path: /home/ubuntu/zartclient
  register: result
  
- name: show result 
  debug:
    msg: "{{result}}"
    
- name: create dest path in remote
  file:
    path: "{{ dest-path }}"
    state: direstory
  with_items:
    - "/home/ubuntu/zartclient"
  when: not result.stat.exists

- name: copy file to remote
  copy:
    src: "{{item.src}}"
    dest: "{{item.dest}}"
  with_items:
    - { src: "/home/ubuntu/zartclient/zartcli" dest: "/home/ubuntu/zartclient"}
    - { src: "/home/ubuntu/zartclient/zartcli.ini" dest: "/home/ubuntu/zartclient"}

- name: copy zartcli into /usr/bin
  copy:
    src: "{{item.src}}"
    dest: "{{item.dest}}"
  with_items:
    - { src: "/home/ubuntu/zartclient/zartcli", dest: "/usr/bin"}

可以看出,处理相应的动作,有相应的模块,模块带参数,完成任务。

第二步:先查询是否存在文件,存在则执行下载命令

第一步拷贝的文件是一个客户端,主要是对文件的上传、下载、查询等。

模块:shell 、 command


- name: is /home/ubuntu/download exists
  stat:
    path: "{{item}}"
  with_items:
    - "/home/ubunt/download"
  register: result
 
- name: create /home/ubuntu/download
  file:
    path: "{{item}}"
    state: direstroy
  with_items:
    - "home/ubuntu/download"
  when: not result.stat.exists

- name: query op-cli
  command: "{{tools}} -o={{operate}} -i={{tenants}} -m={{type}} -n={{name}} \
           -v={{version}}"
  vars:
      tools: zartcli
      operate: query
      tenants: admin
      type: bin
      name: op-cli
      version: v0.0.3
  register: result
 
- name: download op-cli
  command: "{{tools}} -o={{operate}} -i={{tenants}} -m={{type}} -n={{name}} \
           -v={{version}} -p={{path}}"
    vars:
      tools: zartcli
      operate: query
      tenants: admin
      type: bin
      name: op-cli
      version: v0.0.3
      path: /home/ubuntu/download


第三步:解压下载的文件

第二步下载的文件内是一个 tar 包,需要将其解压至指定目录

模块:unarchive, file


- name: create /paasdata/data
  file:
    path: "/paasdata/data"
    state: direstory
    

- name: untar file
  unarchive:
    src: "{{src-path}}"
    dest: "{{dest-path}}"
    remote_src: yes
  vars:
    src-path: "/home/ubuntu/download/admin_op_cli_v0.0.3/op-cli.tar.gz"
    dest-path: "/paasdata/data"
    


第四步:拷贝文件

- name: create /etc/opcli
  file:
    path: "/etc/opcli"
    state: directory


- name: copy /paadata/data/conf||op-cli
  copy:
    src: "{{item.src}}"
    dest: "{{item.dest}}"
  with_items:
    - { src: "/paasdata/data/conf/common.yml" dest: "/etc/opcli/conf"}
    - { src: "/paasdata/data/op-cli" dest: "/usr/bin"}

第五步:执行查询命令

- name: op-cli task list || op-cli node list
  command: "{{item[0]}} {{item[1]}} list"
  with_nested:
    - [ "op-cli" ]
    - ["task", "node", "nodepool"]

上文相当于:op-cli task list, op-cli node list, op-cli nodepool list

上文借用一些循环,把之前规划的 八 个动作改成了 五个动作, 即 五 个动作内的每一个又包含几个动作。

新手容易把上面的所有的动作都处理在一个文件内:但是其实存在更好的处理方法。

# main.yml
---
- hosts: 10.62.60.21
  romote_user: root
  tasks:

    - name: one # 第一步
    
    - name: two # 第二步
    
    - name: three # 第三步
    
    - name: four # 第四步
    
    - name: five # 第五步
    
    - name: six # 第六步
    
    ...


5、 include_tasks

假如你希望写的task 能够进行复用,就相当于编程领域里的抽象出函数一样。ansible 提供这样的机制。即将上文一个很大的文件拆分成独立的文件。使用 include_tasks 方法将文件导入。

比如:上文的五步动作分别单独写文件

playbook 入口: mail.yml

则main.yml 如下:

---
- hosts: 10.62.60.21
  root_usr: root
  tasks:

    - include_tasks: zartclient.yml
    
    - include_tasks: download.yml
    
    - include_tasks: untarfile.yml
    
    - include_tasks: copyfile.yml
    
    - include_tasks: executecommand.yml
    

即将各个处理动作独立出去。随时复用。

6、roles

看上去 include_tasks 方式就是对ansible-playbook 的一种比较好的组织方式了。

ansible 提供了一种更好的组织方式:roles

Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles。 这样的组织方式使得复用更为简便。每个相对独立的处理动作独立出来,可以适用于更复杂的场景。

一个role 的文件大概包括这些:

注意文件夹下可以有多个后缀名为yml的文件,但一定要有main.yml 文件

上文的处理动作,使用 roles 重新组织如下:

目录:

├─ansible
│  ├─playbook
│  └─roles
│      ├─download-bin
│      │  ├─tasks
│      │  └─vars
│      └─op-cli
│          ├─meta
│          ├─tasks
│          └─vars


这里以上文的处理动作:下载文件独立成一个 download-bin role 为例,讲述如何编写 role.

tasks/deploy.yml


- name: download bin by zartcli
  command: "{{zartcli_cli_path}}/zartcli -o=download -i={{tenant_id}} -m={{bin_type}} \
           -n={{bin_name}} -v={{bin_version}} -p={{download_path}}"
           

tasks/main.yml

---
- include_tasks: download.yml
  vars:
    zartcli_cli_path: "{{zartcli_clipath}}"
    tenant_id: "{{tenantid}}"
    bin_name: "{{binname}}"
    bin_version: "{{binversion}}"
    download_path: "{{downloadpath}}"
    bin_type: "{{bintype}}"

vars/main.yml

---
zartcli_clipath: "/home/cloud/zartclient"
tenantid: "admin"
binname: "op-cli"
binversion: "v0.0.3"
downloadpath: "/home/cloud/zartclidownload"
bintype: "bin"

task/main.yml 是这个role 的入口。导入download.yml,下载所需要的变量全部置放在 var/main.yml 文件中。

别的role 需要复用这个模块:

op-cli/meta/main.yml

dependencies:
  - role: download-bin

这样 op-cli role 也有download 动作。

roles 适用于组织较为复杂的项目,将各个模块独立处理,又可以相互复用。使用 include_tasks 存在模块的复用性变低、变量需要重复定义等缺点。

上文 op-cli role 复用download-bin,无需再次定义变量。

再一个值得注意的是:一般playbook 的执行顺序和task 的定义顺序一致。

使用 roles 后,playbook 中 roles 先执行,再按tasks 的定义顺序执行。

如果需要最先执行某个task , 或者最后执行某个task, 可以使用pre_taskspost_tasks

再一个使用roles 需要配置 ansible.cfg

roles_path = 目录
# 即roles 所在的文件目录

7、参考文献


这些原理性的东西,用文字不是很好讲,以后遇到文字难以表达出来,我录个视频实际操作下。这样读者可能更好理解。

上一篇 下一篇

猜你喜欢

热点阅读