系列文章
Ansible 介绍和架构
Ansible 安装和入门
配置控制机器和受控机器
Inventory文件介绍
Ansible核心工具介绍
Ansible常用模块介绍与演示
Playbook 的基本概念
playbook 命令格式
- 格式 :
ansible-playbook <filename.yml> ... [options]
- 常见选项
-C --check
#只检测可能会发生的改变,但不真正执行操作--list-hosts
#列出运行任务的主机--list-tags
#列出tag--list-tasks
#列出task--limit 主机列表
#只针对主机列表中的主机执行-v -vv -vvv
#显示过程
- 示例
ansible-playbook file.yml --check #只检测
ansible-playbook file.yml
ansible-playbook file.yml --limit websrvs
playbook 简单示例
创建 MySQL 用户和组
示例:
创建mysql_user.yml
---
- hosts: dbsrvs
remote_user: root
tasks:
- {name: create group, group: name=mysql system=yes gid=306}
- name: create user
user: name=mysql shell=/sbin/nologin system=yes group=mysql uid=306 home=/data/mysql create_home=no
-
- hosts: dbsrvs
:表示Play 将在属于 dbsrvs 组的主机上执行 -
remote_user: root
:指定了 Ansible 将以 root 用户身份执行任务。这是因为创建用户和组通常需要 root 权限 -
- {name: create group, group: name=mysql system=yes gid=306}
- 这种写法称为单行任务或紧凑写法,它允许在一个单独的行内定义一个任务。这种写法比较简洁,适合于那些只需要一个模块及其参数的任务
- 这个任务是使用 group 模块来创建一个名为 mysql 的组,并设置它是系统组且具有 GID 306
-
后面是第二个任务,使用了多行任务或标准写法。这也是我们常见的一种写法。这个任务是使用 user 模块来创建一个名为 mysql 的用户,并指定用户的各种属性
安装 nginx
示例:
创建install_nginx.yml
---
- name: Install and Configure Nginx
hosts: websrvs
remote_user: root
tasks:
- name: Add Nginx Group
group:
name: nginx
state: present
- name: Add Nginx User
user:
name: nginx
state: present
group: nginx
- name: Install Nginx
package:
name: nginx
state: present
- name: Copy Web Page
copy:
src: files/index.html
dest: /usr/share/nginx/html/index.html
- name: Start Nginx Service
service:
name: nginx
state: started
enabled: yes
hosts: websrvs
: 指定了 Play 将在名为 websrvs 的主机组上执行。remote_user: root
: 指定了 Ansible 将以 root 用户身份执行任务。- 这里有5个task。分别是创建Nginx 组、创建Nginx 用户、安装Nginx 、复制文件到远程主机、启动Nginx 。分别使用了group、user、package、copy和service模块。
安装和卸载 httpd
示例:
创建install_httpd.yml
---
#install httpd
- hosts: websrvs
remote_user: root
gather_facts: no
tasks:
- name: Install httpd
yum: name=httpd state=present
- name: Install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
- name: web html
copy: src=files/index.html dest=/var/www/html/
- name: start service
service: name=httpd state=started enabled=yes
gather_facts: no
:表示禁用了事实收集功能。事实收集是指 Ansible 在执行 Play 之前收集有关目标主机的信息。在这个场景下,我们不需要收集事实信息,因此可以加快 Playbook 的执行速度
创建remove_httpd.yml
#remove_httpd.yml
---
- hosts: websrvs
remote_user: root
tasks:
- name: remove httpd package
yum: name=httpd state=absent
- name: remove apache user
user: name=apache state=absent
- name: remove config file
file: name=/etc/httpd state=absent
- name: remove web html
file: name=/var/www/html/index.html state=absent
安装 MySQL 5.6.46
示例:
假设我们已有mysql-5.6.46-linux-glibc2.12压缩包。并且已在控制机上创建并编写好my.cnf
文件。
创建install_mysql.yml
---
- name: Install MySQL 5.6.46
hosts: dbsrvs
remote_user: root
gather_facts: no
tasks:
- name: Install Required Packages
package:
name:
- libaio
- perl-Data-Dumper
- perl-Getopt-Long
- name: Create MySQL Group
group:
name: mysql
gid: 306
- name: Create MySQL User
user:
name: mysql
uid: 306
group: mysql
shell: /sbin/nologin
system: yes
create_home: no
home: /data/mysql
- name: Unarchive MySQL Package
unarchive:
src: /data/ansible/files/mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
dest: /usr/local/
owner: root
group: root
- name: Create Symbolic Link for MySQL
file:
src: /usr/local/mysql-5.6.46-linux-glibc2.12-x86_64
dest: /usr/local/mysql
state: link
- name: Initialize MySQL Data Directory
shell: chdir=/usr/local/mysql/ ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
tags: data
- name: Copy MySQL Configuration
copy:
src: /data/ansible/files/my.cnf
dest: /etc/my.cnf
- name: Copy MySQL Service Script
shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- name: Enable MySQL Service
shell: /etc/init.d/mysqld start; chkconfig --add mysqld; chkconfig mysqld on
tags: service
- name: Set PATH Variable
copy:
content: 'PATH=/usr/local/mysql/bin:$PATH'
dest: /etc/profile.d/mysql.sh
- name: Run MySQL Secure Installation Script
script: /data/ansible/files/secure_mysql.sh
tags: script
tags
tags 是一种非常有用的特性,它可以让我们对任务进行标记,从而在运行 Playbook 时能够选择性地执行某些任务或跳过某些任务。
比如:
- 选择性执行:
- 可以通过指定 --tags 参数来选择只运行带有特定标签的任务。
- 如果想只运行与数据目录初始化相关的任务,可以使用
--tags data
- 跳过任务:
- 可以使用
--skip-tags
参数来跳过带有特定标签的任务。 - 如果想跳过所有与服务相关的任务,你可以使用
--skip-tags service
。
- 可以使用
- 任务分组:
- 标签可以帮助我们将相似的任务分组在一起,方便管理和维护。
- 例如,我们可以将所有与数据目录相关的任务标记为
data
,将所有与服务相关的任务标记为service
。
- 调试:
- 当我们需要调试 Playbook 的一部分时,可以通过
--tags
参数仅运行这些任务,从而节省执行时间。
- 当我们需要调试 Playbook 的一部分时,可以通过
在上面那个 Playbook 中,有几个任务被标记了标签:
Initialize MySQL Data Directory
:- 标签:
data
- 这意味着我们可以仅运行与数据目录初始化相关的任务。
- 标签:
Enable MySQL Service
:- 标签:
service
- 这意味着我们可以仅运行与服务启动相关的任务。
- 标签:
Run MySQL Secure Installation Script
:- 标签:
script
- 这意味着我们可以仅运行与安全脚本相关的任务。
- 标签:
假设你想只执行与数据目录初始化相关的任务,你可以使用以下命令:
ansible-playbook install_mysql.yml --tags data
如果你想跳过所有与服务相关的任务,你可以使用以下命令:
ansible-playbook install_mysql.yml --skip-tags service