一、ansible工具介绍
Ansible 是一种基于python的开源自动化工具,主要用于配置管理、应用部署和任务自动化,集合了puppet、chef、func、fabric、cfengine等众多运维工具的优点,它通过简单的 YAML 文件(称为 Playbooks)来定义自动化流程,能够以无代理的方式与远程主机进行通信。
Ansible 的主要特点:
- 无代理:不需要在被管理节点上安装任何代理软件。
- 易于学习:使用 YAML 格式编写 Playbooks,语法简单易懂。
- 模块化:提供了大量内置模块,可以方便地进行各种操作。
- 并发执行:能够同时对多个主机执行任务,提高效率。
二、ansible核心命令
ad-hoc模式基本语法为:ansible <host-pattern>主机或主机组,默认为/etc/ansible/hosts [-m module_name]指定模块 [-a args]指定参数
检查所有远程主机是否可以访问:ansible all -m ping
检查某个ip主机是否可以访问:ansible x.x.x.x -m ping
远程对单个主机进行指令输入ls:ansible x.x.x.x -m shell -a "ls"
远程对单个主机停用ssh服务:ansible x.x.x.x -m service -a "name=sshd state=stopped"(开启是state=started)
远程对单个主机安装ansible:ansible x.x.x.x -m yum -a "name=ansible state=installed"(其他状态有absent,latest,present,removed等)
远程对单个主机内创建用户:ansible x.x.x.x -m user -a "name=caixukun password=lanqiu"
远程对单个主机内复制文件:ansible x.x.x.x -m copy -a "src=xxx dest=xxx"
远程对单个主机内文件管理:ansible x.x.x.x -m file -a "path=/etc/1.txt mode=0777"(新建文件是state=touch)
远程对单个主机内文件传输到本地:ansible x.x.x.x -m fetch -a "src=/etc/2.txt dest=/etc/2.txt"
远程对单个主机内文件在末行添加内容:ansible x.x.x.x -m lineinfile -a "path=/etc/2.txt line='hhh' "
三、ansible剧本模式
Ansible 的剧本(Playbook)模式是自动化运维的核心工具。剧本使用 YAML 格式来定义,包含了多个“剧本块(Plays)”,每个剧本块可以对不同主机组执行指定任务,从而精确地控制不同主机在不同情景下的行为。
Ansible Playbook 是由以下部分组成的:
- 主机(Hosts):定义要执行任务的主机或主机组。
- 任务(Tasks):每个任务定义了执行的操作,如安装软件、修改文件等。
- 模块(Modules):Ansible 通过模块来完成任务,比如 yum、apt、copy、file等。
- 变量(Variables):可以定义可变参数,提高剧本的灵活性。
- 处理器(Handlers):在满足条件时触发执行(例如在安装软件后重新启动服务)。
- 条件判断(Conditionals):根据特定条件来执行或跳过任务。
- 循环(Loops):重复执行任务。
添加-C参数,可以模拟剧本的执行,但是不会产生实际改变:ansible-playbook -C install_rsync.yaml
---
- name: 配置 Web 服务器
  hosts: webservers
  become: yes  # 需要 sudo 权限
  vars:
    http_port: 80
  tasks:
    - name: 安装 Nginx
      apt:
        name: nginx
        state: present
      when: ansible_os_family == "Debian"
    - name: 启动并启用 Nginx 服务
      service:
        name: nginx
        state: started
        enabled: yes
    - name: 创建自定义首页
      copy:
        content: "Welcome to my website!"
        dest: /var/www/html/index.html
    - name: 确保防火墙允许 HTTP 流量
      ufw:
        rule: allow
        port: "{{ http_port }}"
        proto: tcp
  handlers:
    - name: 重启 Nginx
      service:
        name: nginx
        state: restarted
以上代码是一个简单的ansible剧本,各个字段的解释如下:
- hosts: webservers:此剧本将应用于- webservers主机组中的所有主机。
- become: yes:指定需要 sudo 权限来执行任务。
- vars:定义了一个变量- http_port,设置 HTTP 的端口号。
- tasks:包含一系列要执行的任务,如安装 Nginx、启动服务、复制自定义的首页文件、配置防火墙等。
- handlers:定义了一个处理器,当某些任务(如配置变化)触发时,重启 Nginx 服务。
四、实际操作指令
- 
编写剧本: 假设剧本文件名是 webservers.yml,将上面的内容保存到该文件中。
- 
运行剧本: 运行剧本时,使用 ansible-playbook命令,执行命令如下:ansible-playbook webservers.yml
- 
指定主机文件: 如果你有一个 inventory文件,列出了主机名和组,可以用-i参数指定:ansible-playbook -i /path/to/inventory webservers.yml
- 
查看剧本的执行计划(--check 模式): 在实际执行之前,你可以先用 --check参数来预览执行的结果,而不真正修改任何内容:ansible-playbook webservers.yml --check
- 
加密敏感信息(使用 Ansible Vault): 如果你的剧本中包含敏感信息(如密码),可以加密特定的变量文件: ansible-vault encrypt vars.yml然后使用 --ask-vault-pass在运行时输入解密密码:ansible-playbook webservers.yml --ask-vault-pass
小贴士:
- Idempotency:Ansible 的剧本是幂等的,也就是说你可以多次运行剧本而不担心重复操作。如果某个任务已经完成,Ansible 会跳过该任务。
- Error Handling:你可以通过 ignore_errors: yes忽略某个任务的错误,或通过failed_when自定义失败条件。
通过这种剧本模式,Ansible 实现了复杂自动化流程的灵活管理,适用于从简单任务到复杂应用环境的配置和部署。