Ansible企业级实战

Ansible企业级实战

  • [一、Playbook 的组成](#一、Playbook 的组成)
    • 1、栗子
      • [(1) 语法检测](#(1) 语法检测)
      • [(2) 预测试](#(2) 预测试)
      • [(3) 列出主机](#(3) 列出主机)
      • [(4) 列出任务](#(4) 列出任务)
      • [(5) 列出标签](#(5) 列出标签)
      • [(6) 执行](#(6) 执行)
      • [(7) 验证](#(7) 验证)
    • [2、任务列表和 action 介绍](#2、任务列表和 action 介绍)
    • [3、Handlers 介绍](#3、Handlers 介绍)
    • 4、Templates
  • 五、Roles
    • [1.什么是 Roles](#1.什么是 Roles)
    • [2、案例 -- 利用 Roles 部署 MySQL](#2、案例 -- 利用 Roles 部署 MySQL)
    • 3、运行并测试

一、Playbook 的组成

Playbook 是由一个或多个"play" 组成的列表,主要功能在于通过将 task 定义好的角色归并为一组进行统一管理,也就是通过 Task 调用 Ansible 的模板将多个 "play" 组织在一个 Playbook 中运行。

1、栗子

bash 复制代码
vim aaa.yml
bash 复制代码
---
- hosts: web
  remote_user: root
  tasks:
    - name: create user
      user:
        name: lisi
        password: "{{ 'aptech'|password_hash('sha512') }}"
        state: present
      tags:
        - aaa
...

(1) 语法检测

bash 复制代码
ansible-playbook --syntax-check aaa.yml

(2) 预测试

bash 复制代码
ansible-playbook -C aaa.yml

(3) 列出主机

bash 复制代码
ansible-playbook --list-hosts aaa.yml

(4) 列出任务

bash 复制代码
ansible-playbook --list-tasks aaa.yml

(5) 列出标签

bash 复制代码
ansible-playbook --list-tags aaa.yml

(6) 执行

bash 复制代码
ansible-playbook aaa.yml

(7) 验证

bash 复制代码
ansible web -m shell -a 'cat /etc/passwd'

2、任务列表和 action 介绍

"Play" 的主体是任务列表(Tasks list)。任务列表中的任务按照次序逐个在 hosts 中指定的所有主机上执行,在顺序执行这些任务时,如果发生错误会将所有已执行任务回滚。因此,需要在更正 Playbook 中的错误后重新执行这些任务。

Task 的任务是按照指定的参数去执行模块。每个 task 使用 name 输出 Playbook 的运行结果,一般输出内容为描述该任务执行的步骤。如果没有提供将输出 action 的运行结果。

定义 task 的格式可以用"action:module options" 或"module:options" 都可,其中后者可以实现向后兼容。如果 action 的内容过多,可在行首使用空白字符进行换行。

bash 复制代码
vim aaa.yml
bash 复制代码
---
- hosts: web
  remote_user: root
  tasks:
    - name: create user
      user:
        name: lisi
        password: "{{ 'aptech'|password_hash('sha512') }}"
        state: present
      tags:
        - aaa
 
- hosts: db
  remote_user: root
  tasks:
    - name: copy file
      copy: src=/etc/passwd dest=/opt
      tags:
      - bbb
 
 
...

如果多次去执行修改的 Playbook 时,涉及到一些没有变化的代码,可以使用 tages 让用户选择跳过没有变化代码,只运行 Playbook 中发生变化的部分代码。可以 在 Playbook 中 为 某 个 或 某 些任务定义 "标签",在执行此 Playbook 时通过 ansible - playbook 命令的 -- tags 选项能实现仅运行指定的 tasks 而非所有的 tasks。

bash 复制代码
ansible-playbook aaa.yml --tags "bbb"

3、Handlers 介绍

Handlers 用于当关注的资源发生变化时所采取的操作。在 notify 中列出的操作便称为 handler,也就是 notify 中需要调用 handler 中定义的操作。而 notify 这个动作用于在每个 "play" 的最后被触发,仅在所有的变化发生完成后一次性地执行指定操作。

(1) 安装apache并修改监听端口

bash 复制代码
dnf -y install httpd
mkdir conf
cp /etc/httpd/conf/httpd.conf  conf/
cd conf/
sed -i 's/Listen 80/Listen 8080/g' /root/conf/httpd.conf

(2) 同步配置文件并验证

同步

bash 复制代码
vim apache.yml
bash 复制代码
- hosts: web
  remote_user: root
  tasks:
  - name: install apache
    yum: name=httpd state=latest
  - name: copy file
    copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: start httpd
    service: enabled=true name=httpd state=started

验证

bash 复制代码
ansible web -m shell -a 'netstat -anpt | grep httpd'

(3) 设置handlers

bash 复制代码
sed -i 's/Listen 8080/Listen 8888/g' /root/conf/httpd.conf
ansible-playbook bbb.yml
ansible web -m shell -a 'netstat -anpt | grep httpd'

4、Templates

Jinja 是基于 Python 的模板引擎。Template 类似 Jinja 的另一个重要组件,可以看作是一个编译过的模板文件。用来产生目标文本,传递 Python 的变量给模板去替换模板中的标记。

(1) 创建模板文件

bash 复制代码
mkdir templates
cp conf/httpd.conf templates/httpd.conf.j2
sed -i 's/Listen 8888/Listen {{ http_port }}/g' /root/templates/httpd.conf.j2
sed -i 's/#ServerName www.example.com:80/ServerName {{ ansible_fqdn }}/g' /root/templates/httpd.conf.j2

(2) 为远程主机添加变量

bash 复制代码
sed -i '2s/$/ http_port=9999/' /etc/ansible/hosts
sed -i '5s/$/ http_port=10000/' /etc/ansible/hosts

(3) 编写playbook

bash 复制代码
vim ccc.yml
bash 复制代码
- hosts: all
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
  - name: install httpd
    yum: name={{ package }} state=latest
  - naem: chage conf_file
    template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  - name: start httpd
    service: enabled=true name={{ service }} state=started
 
 
  handlers:
  - name: restart httpd
    service: name={{ service }} state=restarted

(4) 运行

bash 复制代码
ansible-playbook ccc.yml

(5) 验证

bash 复制代码
ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf|grep ^Listen'
ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf|grep ^ServerName'

五、Roles

目录结构

1.什么是 Roles

Ansible 为了层次化、结构化地组织 Playbook,使用了角色(roles),可以根据层次结构自动装载变量文件、tasks 以及 handlers 等。只需要在 Playbook 中使用 include 指令便可使用 roles。简单来讲,roles 就是分别将变量、文件、任务、模块及处理器设置于单独的目录中,便捷地使用它们。

2、案例 -- 利用 Roles 部署 MySQL

bash 复制代码
mkdir mysql && cd mysql
 
mkdir vars && cd vars && touch main.yml && cd ..
cat <<EOF> /root/mysql/vars/main.yml
mysql_port: 3306
mysql_user: root
EOF
 
mkdir tasks && cd tasks && touch main.yml && cd ..
 
cat <<EOF>/root/mysql/tasks/main.yml
- name: install mysql
  yum: 
    name: mysql-server
    state: present
- name: start mysql
  service:
    name: mysqld
    state: started
    enabled: yes
- name: mysql config
  template:
    src: my.cnf.j2
    dest: /etc/my.cnf
  notify: restart mysql
EOF
 
mkdir handlers && cd handlers && touch main.yml && cd ..
cat <<EOF>/root/mysql/handlers/main.yml
- name: restart mysql
  service:
    name: mysqld
    state: restarted
EOF
 
mkdir templates && cd templates && touch my.cnf.j2 && cd ..
cat<<EOF>/root/mysql/templates/my.cnf.j2
[mysqld]
port = {{ mysql_port }}
user = {{ mysql_user }}
EOF
 
cd
cat <<EOF> ddd.yml
- hosts: db
  roles:
    - mysql
EOF

文件说明

bash 复制代码
mkdir vars && cd vars && touch main.yml && cd ..  # 创建vars目录及主变量文件
# 写入MySQL端口和用户变量到vars/main.yml
cat <<EOF> /root/mysql/vars/main.yml
mysql_port: 3306  # MySQL服务端口
mysql_user: root  # MySQL运行用户
EOF
 
mkdir tasks && cd tasks && touch main.yml && cd ..  # 创建tasks目录及主任务文件
# 写入MySQL部署任务到tasks/main.yml
cat <<EOF>/root/mysql/tasks/main.yml
- name: install mysql  # 安装MySQL服务器
  yum: 
    name: mysql-server
    state: present
- name: start mysql  # 启动MySQL服务并设置开机自启
  service:
    name: mysqld
    state: started
    enabled: yes
- name: mysql config  # 配置MySQL,使用模板文件
  template:
    src: my.cnf.j2  # 模板源文件
    dest: /etc/my.cnf  # 目标配置文件
  notify: restart mysql  # 配置变更时通知重启MySQL
EOF
 
mkdir handlers && cd handlers && touch main.yml && cd ..  # 创建handlers目录及文件
# 写入MySQL重启处理器到handlers/main.yml
cat <<EOF>/root/mysql/handlers/main.yml
- name: restart mysql  # 重启MySQL服务的处理器
  service:
    name: mysqld
    state: restarted
EOF
 
mkdir templates && cd templates && touch my.cnf.j2 && cd ..  # 创建templates目录及模板文件
# 写入MySQL配置模板到my.cnf.j2(使用变量)
cat<<EOF>/root/mysql/templates/my.cnf.j2
[mysqld]
port = {{ mysql_port }}  # 引用变量
user = {{ mysql_user }}  # 引用变量
EOF
 
cd
cat <<EOF> ddd.yml  # 创建主执行剧本
- hosts: db  # 对db组的主机执行
  roles:
    - mysql  # 应用mysql角色
EOF

3、运行并测试

bash 复制代码
ansible-playbook ddd.yml
ansible db -m shell -a 'netstat -anpt | grep mysqld'