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'
