Day02 ansible
一.学习ansible模块
1.1模块的简介
Ansible 模块是 Ansible 提供的可重复使用的脚本,用于执行各种任务,如管理文件、安装软件包、配置服务、管理用户等。
Ansible 模块可以使用各种编程语言编写,如 Python、Bash 等。Ansible 内置了大量的模块,可以满足常见的自动化需求,例如:
-
操作文件:file、template、lineinfile 等模块可以用于创建、删除、修改文件,修改文件权限、所有权和内容等。
-
管理软件包:apt、yum、dnf、pacman、brew 等模块可以用于安装、升级、卸载软件包。
-
管理服务:systemd、service 等模块可以用于管理服务,如启动、停止、重启、重载等操作。
-
运行命令:command、shell、raw 等模块可以用于在目标主机上执行命令,如运行 shell 脚本、复制文件、打包等操作。
-
配置用户和权限:user、group、sudo 等模块可以用于创建、删除、修改用户和组,配置 sudo 权限等。
帮助信息查看:
# ansible-doc -l # 查看所有模块信息 # ansible-doc module_name # 查看模块帮助信息
除了内置的模块外,Ansible 还提供了丰富的插件和扩展机制,可以编写自己的模块,以满足特定的自动化需求。
1.2模块的使用
1)ad-hoc —— 临时的,在ansible中是指需要快速执行,并且不需要保存的命令。说白了就是执行 简单的命令——一条命令。对于复杂的命令则为 playbook (剧本)
语法: ansible <pattern> -m <module_name> -a <arguments>
pattern: inventory文件里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
: - 冒号,多个组,组名之间用冒号隔开
*web* - 组名或主机名中含web的
webservers[0] - webservers组中的第一台主机, -1表示最后一台主机, 支持切片(正):[1:2]表示组中的第二台和第三台
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数
-i file_name: 指定inventory文件, 默认为/etc/ansible/hosts
-k : 询问密码.如果没有传密钥到被管理端,必须要接此选项
2)在 playbook 中使用模块
首先,在 playbook 中需要指定要在哪些主机上执行任务,这可以通过 inventory 文件来定义。然后,在 playbook 中定义任务和相关的模块和参数
例如:
---
- name: Install Apache
hosts: web
become: yes
tasks:
- name: Install Apache package
apt:
name: apache2
state: present
- name: Start Apache service
service:
name: apache2
state: started
该 playbook 包含一个名为 Install Apache 的任务,该任务会在主机组 web 中的所有主机上执行。该任务使用 apt 模块安装 Apache 软件包,并使用 service 模块启动 Apache 服务。
二.学习playbook
2.1 Playbook简介
Playbook 是 ansible 用于配置,部署,和管理被控节点的剧本,通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态 playbook 就像 Ansible 控制器给被控节点列出的的一系列 to-do-list ,而被控节点必须要完成, 也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演 在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情 可以使用 Playbooks 来描述你想在远程主机执行的策略或者执行的一组步骤过程等 如果说 Ansible 模块是工作中的工具的话,那么 playbooks 就是方案
2.2Playbook 组成
Target section - 定义将要执行 playbook 的远程主机组 ,主机组的定义通常在 Ansible inventory 文件中进行,也可以在 Playbook 中定义主机组,例如:
- hosts: webservers
Variable section - 定义 playbook 运行时需要使用的变量 。变量可以在 Playbook 的任务和模块中使用,也可以在 inventory 文件中定义。例如:
vars:
http_port: 80
Task section - 定义将要在远程主机上执行的任务列表 。每个任务都是 Ansible 执行的一组操作。任务由一些列属性构成,如名称、主机、变量、模块、参数等。例如:
- name: Install Apache
apt:
name: apache2
state: present
Handler section - 定义 task 执行完成以后需要调用的任务 。这个部分通常用于在多个 task 执行完成后执行某个操作,例如重启服务或通知其他系统。Handlers 可以在 Playbook 中定义,也可以在角色或任务文件中定义。例如:
- name: Restart Apache
service:
name: apache2
state: restarted
2.3YAML语法简介
playbook由YAML语言编写。
YAML(全称为 “YAML Ain’t Markup Language”)是一种用来表示数据序列化的格式。它采用了类似于缩进的语法,旨在提供一种易于阅读和编写的数据格式。
以下是一些 YAML 的基本语法:
1.使用缩进来表示数据结构。
2.使用冒号来分隔键和值。
3.使用“-”符号表示列表或数组。
4.在值后面可以添加注释,注释以“#”符号开头。
5.文件的第一行应该以 “—” (三个连字符)开始,表明YAML文件的开始。
name: John Smith
age: 30
address:
street: Main St.
city: Anytown
state: NY
zip: '12345'
在这个示例中,每个键值对使用冒号来分隔,缩进用于表示数据结构。address 键的值是一个嵌套结构,使用缩进表示。
注意,在 YAML 中,字符串可以使用单引号或双引号括起来。如果字符串包含特殊字符,比如冒号或空格等,可以使用引号将其括起来,或者使用单引号。
2.4语法检测
语法检测: # ansible-playbook --syntax-check /path/to/playbook.yaml
测试运行 : # ansible-playbook -C /path/to/playbook.yaml
运行: # ansible-playbook /path/to/playbook.yaml
2.5playbook的颜色
绿色代表执行成功,系统保持原样
黄色代表系统状态发生改变
红色代表执行失败,显示错误输出
三.使用Playbook批量安装编译nginx
3.1安装编译 Nginx 所需的依赖项
- name: Install dependencies for compiling Nginx
yum:
state: present
name:
- build-essential
- libpcre3
- libpcre3-dev
- libssl-dev
- zlib1g-dev
3.2下载并解压缩 Nginx 的源代码
- name: Download Nginx source code
get_url:
url: "http://nginx.org/download/nginx-1.21.3.tar.gz"
dest: "/tmp/nginx.tar.gz"
- name: Extract Nginx source code
unarchive:
src: "/tmp/nginx.tar.gz"
dest: "/tmp"
remote_src: true
extra_opts: "--strip-components=1"
3.3配置 Nginx,指定安装路径、配置文件路径、PID 文件路径以及启用 HTTP SSL 模块等选项
- name: Configure Nginx
shell:
cmd: "./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/var/run/nginx.pid --with-pcre --with-http_ssl_module
chdir: "/tmp/nginx-1.21.3"
3.4编译 Nginx
- name: Compile Nginx
shell:
cmd: make
chdir: "/tmp/nginx-1.21.3"
3.5安装 Nginx
- name: Compile Nginx
shell:
cmd: make install
chdir: "/tmp/nginx-1.21.3"
3.6启动nginx并设置为自启动
- name: Start Nginx service
systemd:
name: nginx
state: started
enabled: yes