ansible-入门学习
ansible 概览

Ansible concepts
- Control node
- Managed nodes
- Playbooks
- Plays
- Roles
- Tasks
- Plays
- Modules
- Plugins
- Collections
第一个 ansible 程序
假如在 A 机器上使用 ansible 安装东西 ,需要将 A 机器的 SSH 公钥分发到 B、C、D 机器上 。
两台机器, 分别是 k8s-master (192.168.1.200) , k8s-worker (192.168.1.200)
step 1
k8s-worker 执行
sudo yum install ansible
ssh-keygen -t rsa -b 4096
ssh-copy-id root@192.168.1.200
mkdir ansible_quickstart && cd ansible_quickstart
inventory 的例子 :
[root@k8s-worker ansible_quickstart]# touch inventory.ini
[root@k8s-worker ansible_quickstart]# vim inventory.ini
[root@k8s-worker ansible_quickstart]# ansible-inventory -i inventory.ini --list
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"myhosts",
"ungrouped"
]
},
"myhosts": {
"hosts": [
"192.168.1.200"
]
}
}
[root@k8s-worker ansible_quickstart]# ansible myhosts -m ping -i inventory.ini
192.168.1.200 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
playbook 的例子 ,playbook.yaml :
- name: My first play
hosts: myhosts
tasks:
- name: Ping my hosts
ansible.builtin.ping:
- name: Print message
ansible.builtin.debug:
msg: Hello world
[root@k8s-worker ansible_quickstart]# vim playbook.yaml
[root@k8s-worker ansible_quickstart]# ansible-playbook -i inventory.ini playbook.yaml
PLAY [My first play] **********************************************************************
TASK [Gathering Facts] ********************************************************************
ok: [192.168.1.200]
TASK [Ping my hosts] **********************************************************************
ok: [192.168.1.200]
TASK [Print message] **********************************************************************
ok: [192.168.1.200] => {
"msg": "Hello world"
}
PLAY RECAP ********************************************************************************
192.168.1.200 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
inventory
inventory n. 存货清单; 财产目录,财产目录的编制; 存货总值; 清查
ansible 最简单的功能是多台批量机器同步执行相同的操作 ,例如安装某个软件 ,那么“多台机器--目标机器”就是定义在 inventory 中
playbooks 剧本
简单点说就是需要做啥事 。
plays-[role/tasks/handler]
- role 作用:将相关功能封装为可重用的单元
- handler : 类似于 notify 回调
- tasks : 任务
这几个看一个例子就很好理解了 。
webapp-deployment/
├── playbook.yml # 主Playbook
├── hosts # 主机清单
├── roles/
│ └── webapp/
│ ├── tasks/
│ │ ├── main.yml
│ │ └── setup_nginx.yml
│ ├── handlers/
│ │ └── main.yml
│ ├── templates/
│ │ └── nginx.conf.j2
│ └── files/
│ └── webapp.jar
└── site.yml
- Play - 执行环境定义
作用:定义在哪些主机上执行,使用什么变量等
# playbook.yml
---
- name: 部署Web应用到生产服务器
hosts: webservers # Play作用的目标主机组
become: yes # 使用sudo权限
vars:
app_version: "1.0.0"
app_port: 8080
# 引用Role
roles:
- role: webapp # 这里调用webapp role
# 也可以直接包含Tasks
tasks:
- name: 验证部署
uri:
url: "http://localhost:{{ app_port }}/health"
return_content: yes
register: health_check
# 触发Handlers
handlers:
- name: 发送部署通知
slack:
token: "{{ slack_token }}"
msg: "Web应用 {{ app_version }} 已部署完成"
listen: "部署完成"
- Role - 模块化组织
作用:将相关功能封装为可重用的单元
# roles/webapp/tasks/main.yml
---
- name: 安装Java
apt:
name: openjdk-11-jdk
state: present
- name: 安装Nginx
include_tasks: setup_nginx.yml
- name: 部署应用文件
copy:
src: webapp.jar
dest: /opt/webapp/
mode: '0755'
- name: 创建应用配置文件
template:
src: app_config.j2
dest: /etc/webapp/config.properties
notify: 重启应用服务 # 触发Handler
# roles/webapp/tasks/setup_nginx.yml
---
- name: 安装Nginx
apt:
name: nginx
state: latest
- name: 配置Nginx反向代理
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-available/webapp
notify: 重载Nginx配置 # 触发Handler
- Tasks - 具体执行的操作
作用:定义要执行的具体操作步骤
# 在Playbook中直接定义的Tasks示例
---
- name: 前置检查
hosts: webservers
tasks:
# 单个Task示例
- name: 检查磁盘空间
shell: df -h /
register: disk_usage
- name: 显示磁盘使用情况
debug:
msg: "可用空间: {{ disk_usage.stdout_lines[1].split()[3] }}"
# 循环执行Task
- name: 安装多个包
apt:
name: "{{ item }}"
state: present
loop:
- curl
- wget
- unzip
# 条件执行Task
- name: 清理临时文件
file:
path: /tmp/old_logs/
state: absent
when: cleanup_old_logs | default(false)
- Handlers - 响应式操作
作用:在Task发生变更时才执行,通常用于服务重启
# roles/webapp/handlers/main.yml
---
- name: 重启应用服务
systemd:
name: webapp
state: restarted
daemon_reload: yes
- name: 重载Nginx配置
systemd:
name: nginx
state: reloaded # 使用reload而不是restart,避免中断连接
- name: 重启系统
reboot:
msg: "系统需要重启以应用内核更新"
reboot_timeout: 300
listen: "系统重启"
完整执行流程示例
# site.yml
---
- name: 准备服务器环境
hosts: webservers
tasks:
- name: 更新系统
apt:
update_cache: yes
upgrade: dist
notify: 系统重启
handlers:
- name: 系统重启
reboot:
msg: "完成系统更新后重启"
- name: 部署Web应用
hosts: webservers
roles:
- role: webapp
tasks:
- name: 启动应用
systemd:
name: webapp
state: started
notify: 检查应用状态
handlers:
- name: 检查应用状态
wait_for:
port: 8080
delay: 10
timeout: 60
# site.yml 通常作为入口文件
ansible-playbook -i hosts site.yml
Modules
模块 ,描述与其他软件的集成 ,可以直接调用 ,有哪些模块呢 ?

这里举一个gcloud 的例子
- name: create a disk
google.cloud.gcp_compute_disk:
name: disk-image
zone: us-central1-a
project: "{{ gcp_project }}"
auth_kind: "{{ gcp_cred_kind }}"
service_account_file: "{{ gcp_cred_file }}"
state: present
register: disk
- name: create a image
google.cloud.gcp_compute_image:
name: test_object
source_disk: "{{ disk }}"
project: test_project
auth_kind: serviceaccount
service_account_file: "/tmp/auth.pem"
state: present
Plugins
插件 ,ansible 利用这些插件做很多事情

这里以 filter 插件做一个例子 。
text

浙公网安备 33010602011771号