Skip to content

3. 快速开始

说明

通过对一个项目剖析,了解其基本轮廓!

以下是主机服务器部署prometheus采集器node-exporter的一个案例剖析!
过程如下:
版本检查判断是否安装
设置版本
下载并解压到tmp
二进制文件移动到指定路径并启动
创建用户
配置自启动服务
重载服务
判断服务是否启动
判断接口返回是否正常响应

github案例地址

参考文档一剖析

目录结构

# tree 
.
├── defaults
│   └── main.yml
├── handlers
│   └── main.yml
├── LICENSE
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── converge.yml
│       └── molecule.yml
├── README.md
├── tasks
│   ├── config-version.yaml
│   └── main.yml
└── templates
    └── node_exporter.service.j2

主任务

# cat tasks/main.yml 
---
- name: Check current node_exporter version.
  command: "{{ node_exporter_bin_path }} --version"     //变量定义在defaults/main.yml文件中
  failed_when: false        //failed_when关键字的作用是在条件成立时,将对应任务的执行状态设置为失败
  changed_when: false       //changed_when关键字的作用是在条件成立时,将对应任务的执行状态设置为changed
  register: node_exporter_version_check     //返回值注册到node_exporter_version_check,true=0,False!=0,这里的意思是,如过已经安装则返回0,未安装则返回非0

- name: Configure latest version
  include_tasks: config-version.yaml    //包括一个文件,其中包含要在当前剧本中执行的任务列表
  when: >
    node_exporter_version is match("latest")
    or node_exporter_version is not defined

- name: Download and unarchive node_exporter into temporary location.
  unarchive:
    src: "{{ node_exporter_download_url }}"
    dest: /tmp
    remote_src: true
    mode: 0755
  when: >
    node_exporter_version_check.stdout is not defined
    or node_exporter_version not in node_exporter_version_check.stdout
  register: node_exporter_download_check

- name: Move node_exporter binary into place.
  copy:
    src: "/tmp/node_exporter-{{ node_exporter_version }}.linux-{{ node_exporter_arch }}/node_exporter"
    dest: "{{ node_exporter_bin_path }}"
    mode: 0755
    remote_src: true
  notify: restart node_exporter
  when: >
    node_exporter_download_check is changed
    or node_exporter_version_check.stdout | length == 0

- name: Create node_exporter user.
  user:
    name: node_exporter
    shell: /sbin/nologin
    state: present

- name: Copy the node_exporter systemd unit file.
  template:
    src: node_exporter.service.j2       //模版文件
    dest: /etc/systemd/system/node_exporter.service
    mode: 0644
  register: node_exporter_service

- name: Reload systemd daemon if unit file is changed.
  systemd:
    daemon_reload: true
  notify: restart node_exporter
  when: node_exporter_service is changed

- name: Ensure node_exporter is running and enabled at boot.
  service:
    name: node_exporter
    state: "{{ node_exporter_state }}"
    enabled: "{{ node_exporter_enabled }}"

- name: Verify node_exporter is responding to requests.
  uri:
    url: "http://{% if node_exporter_host !='' %}{{ node_exporter_host }}{% else %}localhost{% endif %}:{{ node_exporter_port }}/"
    return_content: true
  register: metrics_output
  failed_when: "'Metrics' not in metrics_output.content"
# cat templates/node_exporter.service.j2 
[Unit]
Description=NodeExporter

[Service]
TimeoutStartSec=0
User=node_exporter
ExecStart={{ node_exporter_bin_path }} --web.listen-address={{ node_exporter_host }}:{{ node_exporter_port }} {{ node_exporter_options }}

[Install]
WantedBy=multi-user.target
# cat defaults/main.yml 
---
# Use the latest node_exporter release
node_exporter_version: 'latest'

# Alternatively, set a specific version
# See available releases: https://github.com/prometheus/node_exporter/releases/
# node_exporter_version: '0.18.1'

node_exporter_arch: 'amd64'
node_exporter_download_url: https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_version }}/node_exporter-{{ node_exporter_version }}.linux-{{ node_exporter_arch }}.tar.gz

node_exporter_bin_path: /usr/local/bin/node_exporter

# Set node_exporter_host to localhost if you wish to expose node_exporter on localhost only.
node_exporter_host: ''
node_exporter_port: 9101
node_exporter_options: ''

node_exporter_state: started
node_exporter_enabled: true
# cat handlers/main.yml 
---
- name: restart node_exporter
  service:
    name: node_exporter
    state: restarted
# cat tasks/config-version.yaml 
---
- name: Determine latest GitHub release (local)
  delegate_to: localhost
  become: false
  uri:
    url: "https://api.github.com/repos/prometheus/node_exporter/releases/latest"
    body_format: json
  register: _github_release
  until: _github_release.status == 200
  run_once: true
  retries: 5

- name: Set node_exporter_version
  set_fact:
    node_exporter_version: "{{ _github_release.json.tag_name
      | regex_replace('^v?([0-9\\.]+)$', '\\1') }}"

- name: Set node_exporter_download_url
  set_fact:
    node_exporter_download_url: "https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_version }}/node_exporter-{{ node_exporter_version }}.linux-{{ node_exporter_arch }}.tar.gz"
其中,涉及到变量、文件存放;
流程编排;
模块;
条件判断;
因此,要想熟练应用ansible需要对上述文件中的含义了如指掌;