Ansible playbook简介
Ansible playbook是一种用于描述和自动化IT基础设施配置和管理的工具。它使用YAML格式
来定义一系列任务和配置项,并利用Ansible的执行引擎自动执行这些任务。
Playbook包含一个或多个play,每个play定义了一组任务,这些任务将在目标主机上执行。每个任务可以是一个模块(例如复制文件、安装软件等),也可以是一个自定义的脚本。
Playbook还可以定义变量、条件语句、循环和其他控制结构,以实现更复杂的配置和管理逻辑。可以使用Ansible的模块来管理主机的各种资源,如文件、用户、服务等。
通过使用Ansible playbook,可以实现自动化的部署、配置和管理,提高系统的可靠性和可维护性,并减少人工干预的工作量。它还可以根据需要进行扩展和定制,以满足不同环境和需求的要求。
playbook结构
Playbook结构是一个Ansible playbook文件的组织结构。一个Ansible playbook是一个用来描述一组关联主机上执行任务的文件。
Playbook结构通常包括以下几个部分:
-
主机组或主机名:指定要在哪些主机上执行任务。可以使用主机组名或逗号分隔的主机名列表。
-
变量定义:定义用于在任务中引用的变量。可以是全局变量或主机特定变量。
-
任务列表:列出需要在主机上执行的任务。每个任务都包含一个名称和一个或多个操作。
-
模块和参数:使用Ansible模块来执行任务。每个任务都会调用一个模块,并为模块传递必要的参数。
-
条件语句:根据条件,有选择地执行任务。条件语句可以基于主机变量或事先定义的变量。
-
循环:重复执行一个任务集。循环可以用来处理多个主机或不同的变量组合。
-
错误处理:处理任务执行过程中可能出现的错误。可以定义失败任务的处理方式。
-
注释:包含有关Playbook的注释,以便于其他人理解和维护。
整个Playbook结构通常以YAML格式编写,具有易读性和可维护性。通过定义主机、变量、任务和条件,Playbook可以用来自动化配置、部署和管理远程主机。
Ansible playbook语法
Ansible playbook是用于编写自动化任务的脚本文件,其中包含了一系列的任务和配置信息。以下是Ansible playbook的基本语法:
- 文件头部:在文件的头部指定一些基本的信息,如Ansible版本、作者等。
yaml
---
- hosts: <目标主机>
gather_facts: <是否收集主机信息,默认为True>
...
- 变量定义:可以定义一些变量,用于在任务中引用。
yaml
vars:
var_name: var_value
...
- 任务定义:定义一系列的任务,每个任务包含一个名称和一系列操作步骤。
yaml
tasks:
- name: <任务名称>
<操作步骤>
...
- 动作(Action):在任务中执行的操作步骤,可以是Ansible模块、命令、脚本等。
yaml
- name: <任务名称>
<操作步骤>
...
- 模块(Module):Ansible提供了大量的模块,用于执行各种操作。模块可以通过参数传递不同的配置信息。
yaml
- name: <任务名称>
<模块名称>:
<参数>
...
- 条件判断:可以使用条件判断来根据不同的情况执行不同的操作。
yaml
- name: <任务名称>
<操作步骤>
when: <条件>
...
- 循环(Loop):可以使用循环来重复执行一系列的任务。
yaml
- name: <任务名称>
<操作步骤>
loop: <循环列表>
...
- 注释:可以在脚本中添加注释以提高可读性。
yaml
# 这是一个注释
要启动一个Ansible playbook任务,可以使用ansible-playbook
命令。该命令将使用指定的playbook文件来执行自动化任务。以下是启动任务的基本语法:
bash
ansible-playbook <playbook_file>
其中,<playbook_file>
是要执行的playbook文件的路径。可以使用绝对路径或相对路径。
要配置一个role,可以按照以下步骤进行:
-
创建一个名为
roles
的目录,作为roles的根目录。该目录应该与playbook文件在同一级。 -
在
roles
目录下创建一个新的角色目录,在此处设置角色的名称。例如,可以创建一个名为webserver
的目录:roles/ └── webserver/
-
在角色目录中,创建以下目录和文件结构:
roles/ └── webserver/ ├── tasks/ │ └── main.yml ├── handlers/ │ └── main.yml ├── vars/ │ └── main.yml ├── files/ └── templates/
tasks
目录:包含角色的主要任务文件,通常名为main.yml
。handlers
目录:包含角色的处理程序文件,用于处理特定事件的触发。vars
目录:包含角色的变量文件,用于定义角色的变量。files
目录:包含角色需要使用的文件。templates
目录:包含角色需要使用的模板文件。
-
在
main.yml
文件中,定义该角色的任务。可以使用Ansible模块和任务语句来描述任务的操作。例如:yaml- name: Install Apache apt: name: apache2 state: present - name: Start Apache service: name: apache2 state: started enabled: yes
这是一个简单的示例,其中安装了Apache包并启动了Apache服务。
-
在playbook文件中,使用角色的名称来调用它。例如:
yaml- name: My Playbook hosts: all roles: - webserver
在此示例中,我们调用了名为
webserver
的角色,该角色将在所有主机上执行。
这样,就可以在playbook中使用roles来组织和管理任务。每次执行playbook时,都会调用相应的角色,并执行其定义的任务。
1、使用ansible playbook远程部署docker、httpd、nginx、mysql
和#2在一起
2、编写一个安装并且运行httpd的playbook,该playbook可以在执行命令时指定被控端主机,要求每台机上的httpd首页内容为该主机的主机名、IP地址、子网掩码、网关信息
yaml
---
- hosts: gr1
remote_user: root
tasks:
- name: add yum repo
copy:
src: ./docker-ce.repo
dest: /etc/yum.repos.d/docker-ce.repo
become: true
- name: yumlist reflash
yum:
name: yum-utils
update_cache: yes
- name: install docker
yum:
name:
- docker-ce-cli-20.10.18
- docker-ce-20.10.18
- containerd.io
state: present
- name: install nginx
yum:
name: nginx
state: present
- name: install mysql
yum:
name: mysql
state: present
- name: change docker daemon.json
copy:
content: |
{
"insecure-registries": ["192.168.99.130:5000"],
"registry-mirrors": ["https://docker.1panel.live"]
}
dest: /etc/docker/daemon.json
become: true
- name: start docker
service:
name: docker
state: started
- hosts: gr1
remote_user: root
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: index write
copy:
content: 'Hostname "{{ ansible_fqdn }}" and IP "{{ansible_ens33.ipv4.address }}" and mask "{{ansible_ens33.ipv4.netmask }}" and gateway "{{ansible_default_ipv4.gateway }}"'
dest: /var/www/html/index.html
become: true
- name: restart httpd
service:
name: httpd
state: restarted
3、使用ansible远程部署docker nginx容器
bash
yum install -y python3
pip3 install docker
yaml
---
- hosts: gr1
remote_user: root
tasks:
- name: docker run nginx
docker_container:
name: nginx
image: nginx:latest
state: started
ports:
- "81:80"
volumes:
- /var/www/html:/usr/share/nginx/html
或者
bash
ansible gr1 -m shell -a "docker run -d -p 81:80 nginx"