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需要对上述文件中的含义了如指掌;