ansible-入门学习

ansible 概览

img

Ansible concepts

  • Control node
  • Managed nodes
  • Playbooks
    • Plays
      • Roles
      • Tasks
  • 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
  1. 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: "部署完成"
  1. 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
  1. 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)
  1. 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

模块 ,描述与其他软件的集成 ,可以直接调用 ,有哪些模块呢 ?

img
这里举一个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 利用这些插件做很多事情
img
这里以 filter 插件做一个例子 。
text

参考资料

posted @ 2026-03-26 13:35  float123  阅读(3)  评论(0)    收藏  举报