Ansible企业级实战
Ansible企业级实战
- 一、Playbook 的组成
- 1、栗子
- (1) 语法检测
- (2) 预测试
- (3) 列出主机
- (4) 列出任务
- (5) 列出标签
- (6) 执行
- (7) 验证
- 2、任务列表和 action 介绍
- 3、Handlers 介绍
- 4、Templates
- 五、Roles
- 1.什么是 Roles
- 2、案例 -- 利用 Roles 部署 MySQL
- 3、运行并测试
一、Playbook 的组成
Playbook 是由一个或多个”play” 组成的列表,主要功能在于通过将 task 定义好的角色归并为一组进行统一管理,也就是通过 Task 调用 Ansible 的模板将多个 “play” 组织在一个 Playbook 中运行。
1、栗子
vim aaa.yml
---
- hosts: webremote_user: roottasks:- name: create useruser:name: lisipassword: "{{ 'aptech'|password_hash('sha512') }}"state: presenttags:- aaa
...
(1) 语法检测
ansible-playbook --syntax-check aaa.yml
(2) 预测试
ansible-playbook -C aaa.yml
(3) 列出主机
ansible-playbook --list-hosts aaa.yml
(4) 列出任务
ansible-playbook --list-tasks aaa.yml
(5) 列出标签
ansible-playbook --list-tags aaa.yml
(6) 执行
ansible-playbook aaa.yml
(7) 验证
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 的内容过多,可在行首使用空白字符进行换行。
vim aaa.yml
---
- hosts: webremote_user: roottasks:- name: create useruser:name: lisipassword: "{{ 'aptech'|password_hash('sha512') }}"state: presenttags:- aaa- hosts: dbremote_user: roottasks:- name: copy filecopy: src=/etc/passwd dest=/opttags:- bbb...
如果多次去执行修改的 Playbook 时,涉及到一些没有变化的代码,可以使用 tages 让用户选择跳过没有变化代码,只运行 Playbook 中发生变化的部分代码。可以 在 Playbook 中 为 某 个 或 某 些任务定义 “标签”,在执行此 Playbook 时通过 ansible - playbook 命令的 – tags 选项能实现仅运行指定的 tasks 而非所有的 tasks。
ansible-playbook aaa.yml --tags "bbb"
3、Handlers 介绍
Handlers 用于当关注的资源发生变化时所采取的操作。在 notify 中列出的操作便称为 handler,也就是 notify 中需要调用 handler 中定义的操作。而 notify 这个动作用于在每个 “play” 的最后被触发,仅在所有的变化发生完成后一次性地执行指定操作。
(1) 安装apache并修改监听端口
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) 同步配置文件并验证
同步
vim apache.yml
- hosts: webremote_user: roottasks:- name: install apacheyum: name=httpd state=latest- name: copy filecopy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpdservice: enabled=true name=httpd state=started
验证
ansible web -m shell -a 'netstat -anpt | grep httpd'
(3) 设置handlers
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) 创建模板文件
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) 为远程主机添加变量
sed -i '2s/$/ http_port=9999/' /etc/ansible/hosts
sed -i '5s/$/ http_port=10000/' /etc/ansible/hosts
(3) 编写playbook
vim ccc.yml
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpdyum: name={{ package }} state=latest- naem: chage conf_filetemplate: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpdservice: enabled=true name={{ service }} state=startedhandlers:- name: restart httpdservice: name={{ service }} state=restarted
(4) 运行
ansible-playbook ccc.yml
(5) 验证
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
mkdir mysql && cd mysqlmkdir vars && cd vars && touch main.yml && cd ..
cat <<EOF> /root/mysql/vars/main.yml
mysql_port: 3306
mysql_user: root
EOFmkdir tasks && cd tasks && touch main.yml && cd ..cat <<EOF>/root/mysql/tasks/main.yml
- name: install mysqlyum: name: mysql-serverstate: present
- name: start mysqlservice:name: mysqldstate: startedenabled: yes
- name: mysql configtemplate:src: my.cnf.j2dest: /etc/my.cnfnotify: restart mysql
EOFmkdir handlers && cd handlers && touch main.yml && cd ..
cat <<EOF>/root/mysql/handlers/main.yml
- name: restart mysqlservice:name: mysqldstate: restarted
EOFmkdir templates && cd templates && touch my.cnf.j2 && cd ..
cat<<EOF>/root/mysql/templates/my.cnf.j2
[mysqld]
port = {{ mysql_port }}
user = {{ mysql_user }}
EOFcd
cat <<EOF> ddd.yml
- hosts: dbroles:- mysql
EOF
文件说明
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运行用户
EOFmkdir 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-serverstate: present
- name: start mysql # 启动MySQL服务并设置开机自启service:name: mysqldstate: startedenabled: yes
- name: mysql config # 配置MySQL,使用模板文件template:src: my.cnf.j2 # 模板源文件dest: /etc/my.cnf # 目标配置文件notify: restart mysql # 配置变更时通知重启MySQL
EOFmkdir 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: mysqldstate: restarted
EOFmkdir 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 }} # 引用变量
EOFcd
cat <<EOF> ddd.yml # 创建主执行剧本
- hosts: db # 对db组的主机执行roles:- mysql # 应用mysql角色
EOF
3、运行并测试
ansible-playbook ddd.yml
ansible db -m shell -a 'netstat -anpt | grep mysqld'