文章目录
1. playbook简介
- Playbooks 与 adhoc 相比,是一种完全不同的运用 ansible 的方式,是非常之强大的.
- 简单来说,playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.
- Playbooks 可用于声明配置,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.
- 我们使用 adhoc 时,主要是使用 /usr/bin/ansible 程序执行任务.而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范
2. playbook要求
2.1 语法结构
每一个 YAML 文件都是从一个列表开始. 列表中的每一项都是一个键值对, 通常它们被称为一个 “哈希” 或 “字典”. 所以, 我们需要知道如何在 YAML 中编写列表和字典
- 文件的第一行应该以 - - -这三个连续字符开始(无空格),代表了YAML文件的开始
- 在一行中,# 后面的内容代表注释,python,ruby,shell都是如此
- YAML中的列表元素以- 开头(一个横杠和一个空格),后面为元素内容
- 在同一个列表中的元素应该保持相同缩进,否则会当作错误处理
- 一个字典是由一个简单的键值对key: value表示,中间以 : 分割(冒号后面必须是一个空格)
- 文件名称后缀为.yml或.yaml
一个列表应有相同的缩进:
- list
- list
一个字典由简单的键值组成:
key: value
key: value
字典也可以用缩进表示:
---
{
key: value,key: value,key: value,}
2.2 核心参数
- hosts:主机组
- tasks:任务列表
- vars:变量,如下有几种设置方式
- template:jinja2模板语法
- tags:标签
- handlers:由一定条件触发,用notify调用
---
- hosts: webservers
remote_user: root #远程用户
sudo: yes
sudo_user: postgres
tasks:
- name: test connection
模块名:
remote_user: yourname #也可以在任务中单独设置远程用户
notify: 触发任务名称
tags:
- 标签1
- 标签2
handlers:
- name: 任务名
模块:
- name: 任务名
模块:
3. ansible-playbook命令参数
ansible-playbook:执行自动化任务.yml文件
执行格式:
ansible-playbook [options] XXX.yml
|
|
---|---|
|
检查.yml的语法 |
|
预测试,不会改变目标主机的任何设置 |
|
列出任务列表 |
|
列出主机列表 |
|
列出标签 |
|
执行指定任务 |
|
除了指定的任务不执行,执行其他任务 |
|
从指定任务开始执行 |
#检测语法
ansible-playbook --syntax-check playbook.yml
#列出主机
ansible-playbook --list-hosts playbook.yml
#列出任务
ansible-playbook --list-tasks playbook.yml
#执行
ansible-playbook playbook.yml
#从指定任务开始执行
ansible-playbook --start-at-task "任务名" playbook.yml
#从指定标签开始##tags定义标签名##
ansible-playbook -t 标签名 playbook.yml
4. ansible加密工具
ansible-vault:文件加密工具
ansible-vault [option] XXX.yml
|
|
---|---|
|
创建 |
|
加密 |
|
解密 |
|
查看 |
|
编辑加密文件 |
|
修改口令 |
#加密
ansible-vault encrypt userlist.yml
#查看加密文件
ansible-vault view userlist.yml
#解密
ansible-vault decrypt userlist.yml
#执行加密文件
ansible-playbook --ask-vault-pass user.yml
5. playbook示例
5.1 示例1:简单Apache服务
#webserver.yml
---
- hosts: test
tasks:
- name: 安装 apache
dnf:
name: httpd
state: present
- name: 开启 apache
service:
name: httpd
state: started
enabled: yes
- name: 开启防火墙
service:
name: firewalld
state: started
enabled: yes
- name: 防火墙规则添加Apache
firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
- name: 创建index.html
copy:
src: index.html
dest: /var/www/html/index.html
5.2 示例2:用playbook测试示例1的Apache实验
#test1.yml
---
- hosts: localhost
become: no
tasks:
- name: 测试Apache
uri:
url: http://172.25.17.2
return_content: yes
#test2.yml
---
- hosts: localhost
become: no
tasks:
- name: 测试Apache,返回直
uri:
url: http://172.25.17.2
return_content: yes
status_code: 200
##test3.yml
---
- hosts: localhost
become: no
tasks:
- name: 测试Apache,返回直
uri:
url: http://172.25.17.2
return_content: yes
status_code: 200
register: result
- debug:
var: result
#test4.yml
---
- hosts: localhost
become: no
tasks:
- name: 测试Apache,返回直
uri:
url: http://172.25.17.2
return_content: yes
status_code: 200
register: result
- debug:
msg: "tesk ok! zy!"
5.3 示例3:简单数据库服务
#database.yml
---
- hosts: prod
tasks:
- name: 安装mariadb及python3-PyMySQL.noarch
dnf:
name:
- mariadb-server
- python3-PyMySQL.noarch
state: present
- name: 开启mariadb
service:
name: mariadb
state: started
enabled: yes
- name: 允许通过数据库端口3306
firewalld:
service: mysql
permanent: yes
immediate: yes
state: enabled
#在设置root登陆用户密码后,
#每次修改数据库操作均需 先登陆 再操作
- name: 设置登陆用户root,密码为westos
mysql_user:
name: root
password: westos
login_unix_socket: /var/lib/mysql/mysql.sock
- name: 清除虚拟用户
mysql_user:
login_user: root
login_password: westos
name: ''
host: localhost
state: absent
- name: 创建数据库westos_db
mysql_db:
login_user: root
login_password: westos
name: westos_db
state: present
- name: 创建数据库用户zy,密码zy123
mysql_user:
login_user: root
login_password: westos
name: zy
password: zy123
priv: 'westos_db.*:ALL'
state: present
4.4 示例4:自动化修改Apache端口号
- 复制Apache主配置文件httpd.conf到/mnt/ansible下,为copy模块的src源
- 通过修改此文件的端口号达到修改目标主机端口号
(也可在jinja2模板中设置变量达到修改端口号目的,省去每次进入文件中区寻找端口号配置修改的麻烦,具体操作见ansible之变量篇)
#Apache.yml
---
- hosts: test
tasks:
- name: 安装 apache
dnf:
name: httpd
state: present
- name: 配置Apache
copy:
src: httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify: restart apache
- name: 开启 apache
service:
name: httpd
state: started
enabled: yes
- name: 开启 firewalld
service:
name: firewalld
state: started
enabled: yes
- name: 通过 http
firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
- name: 创建index.html
copy:
src: index.html
dest: /var/www/html/index.html
handlers:
- name: 重启apache
service:
name: httpd
state: restarted