网站建设论文范文国外做meta分析的网站
2026/4/16 19:06:53 网站建设 项目流程
网站建设论文范文,国外做meta分析的网站,杭州品牌网站,搜索引擎优化排名关键字广告Ansible PlaybookAnsible Playbook#xff08;剧本#xff09;是 Ansible 核心配置文件#xff0c;采用 YAML 格式编写#xff0c;用于定义一系列有序的自动化任务集合#xff0c;描述 “要在哪些远程主机上执行哪些操作”。YAML 基本规则YAML 是一种易读的序列化格式剧本是 Ansible 核心配置文件采用 YAML 格式编写用于定义一系列有序的自动化任务集合描述 “要在哪些远程主机上执行哪些操作”。YAML 基本规则YAML 是一种易读的序列化格式是 Playbook 的核心语法核心规则如下缩进规则仅允许空格缩进禁止 Tab通常 2 个半角空格为 1 级缩进层级代表逻辑层级全角空格是中文输入法下的肉眼看和半角空格一样但解析器不认必须替换为半角空格英文输入法下的空格。大小写敏感变量名、模块名、键名如hosts/Hosts均区分大小写注释规则单行注释用##后内容会被忽略无原生多行注释可每行加#字符串规则字符串可加引号单 / 双或不加含特殊字符:、$、空格时必须加引号如name: web-server:8080核心标识元素以-开头短横线 空格如- nginx键值对用key: value冒号后必须加空格如name: nginxplaybook文件命名文件名后缀无强制要求只要内容是 YAML 即可执行.yaml或.yml结尾前者更规范后者是简写均常用Playbook 常用 YAML 结构PlaybookYAML文件├─ Play 1一个部署单元以 - 开头│ ├─ 基础配置hosts、remote_user、gather_facts│ ├─ 变量vars│ ├─ 任务tasks→ 每个任务由「模块参数」组成│ ├─ 模块参数│ └─ 模块参数├─ Play 2另一个部署单元│ └─ ...同Play 1的结构└─ ...Playbook 以 “Play” 为基本单元常见结构分为 2 类1. 单 Play 结构极简版- hosts: webservers # 目标主机组 remote_user: root # 远程执行用户 tasks: # 任务列表 - name: 安装 Nginx yum: name: nginx state: present - name: 启动 Nginx service: name: nginx state: started2. 多 Play 结构多主机组执行不同任务- hosts: webservers vars: web_name: nginx tasks: - name: 安装 Nginx yum: name: {{ nginx }} state: present - hosts: dbservers tasks: - name: 安装 MySQL yum: name: mysql-server state: present3. 带变量 / 处理器的嵌套结构以下以「部署 MySQL 服务」为例重新编写带变量 / 处理器的嵌套结构 Playbook保持核心逻辑一致但场景更贴近实际运维同时补充关键注释便于理解# 针对所有被管理主机部署MySQL服务 - hosts: all # 1. 定义Play级变量可复用修改时仅需改此处 vars: mysql_pkg: mariadb-server # CentOS默认MySQL兼容包 mysql_port: 3306 mysql_conf_path: /etc/my.cnf.d/mysql-server.cnf mysql_service: mariadb # 2. 定义处理器仅被notify触发用于配置变更后重启服务 handlers: - name: 重启MySQL服务并设置开机自启 ansible.builtin.service: name: {{ mysql_service }} # 引用变量 state: restarted # 重启服务 enabled: true # 开机自启 # 3. 定义核心任务列表 tasks: # 任务1安装MySQL软件包引用变量 - name: 安装 {{ mysql_pkg }} 软件包 ansible.builtin.yum: name: {{ mysql_pkg }} state: present # 确保安装幂等已装则不操作 # 任务2启动MySQL服务首次部署先启动 - name: 启动 {{ mysql_service }} 服务 ansible.builtin.service: name: {{ mysql_service }} state: started # 任务3复制自定义MySQL配置文件修改配置后触发处理器 - name: 复制自定义MySQL配置文件指定端口{{ mysql_port }} ansible.builtin.copy: src: ./mysql-server.cnf # 本地配置文件路径 dest: {{ mysql_conf_path }} # 远程目标路径引用变量 mode: 0644 # 配置文件权限 owner: root # 属主 group: root # 属组 # 仅当配置文件发生变更时触发处理器重启MySQL notify: 重启MySQL服务并设置开机自启ansible-playbook用法选项简写核心说明--check-C模拟执行干跑仅展示要执行的操作不实际修改目标主机系统--inventory 路径-i指定自定义 Inventory主机清单文件默认路径/etc/ansible/hosts--user 用户名-u指定远程执行任务的用户如root、ansible--become-b提权执行等效sudo普通用户执行系统操作如装软件时必备--become-user 用户无指定提权后的目标用户默认root如--become-usernginx--verbose-v详细输出执行日志-v基础详情-vvv最详细排错专用-vv中等--ask-pass-k交互式提示输入远程主机 SSH 密码避免明文写在 Inventory 中--ask-become-pass-K交互式提示输入提权密码如sudo密码--limit 主机/组无限制仅执行指定主机 / 主机组的任务如--limit 192.168.1.100Playbook 执行流程解读任务1: [host1, host2, host3, ... hostN] ← 同时执行 等待任务1所有主机成功,然后开始执行任务任务2 任务2: [host1, host2, host3, ... hostN] ← 同时执行 问题如果太多主机并发等待的时间会过长所以就有了--limit 主机/组 # 仅在host1和host2上执行Playbook减少并发数快速验证 ansible-playbook task.yml -i /hosts --limit host1,host2 # 仅在host1和host2上执行Playbook减少并发数快速验证 ansible-playbook task.yml -i /hosts --limit host1,host2 # 若Inventory中有子组可直接限制组此处仍用web_servers的子集示例 # 先在Inventory中添加子组 # [web_servers_subset] # host1 # host3 # 然后执行 ansible-playbook task.yml -i /hosts --limit web_servers_subset#作用检查 YAML 语法、Playbook 结构如字段缺失、缩进错误不执行任务输出报错位置和原因 ansible-playbook -C -v playbook.yml无 Role的playbook# site-simple.yml --- - hosts: webservers vars: pkg_nginx: nginx nginx_port: 80 handlers: - name: 重启Nginx service: name: nginx state: restarted tasks: - name: 安装{{ pkg_nginx }} yum: name: {{ pkg_nginx }} state: present - name: 复制配置文件 copy: src: ./nginx.conf dest: /etc/nginx/nginx.conf notify: 重启Nginx - name: 启动Nginx service: name: nginx state: started含Role的playbook/ansible/ ├── roles/ │ ├── web/ # web角色目录变量仅属于web角色 │ │ ├── vars/ │ │ │ └── main.yml # web角色的变量文件Ansible自动识别 │ │ └── tasks/ │ │ └── main.yml # web角色的任务文件 │ └── security/ # security角色目录变量仅属于security角色 │ ├── vars/ │ │ └── main.yml # security角色的变量文件Ansible自动识别 │ └── tasks/ │ └── main.yml # security角色的任务文件 └── site.yml # 主Playbook mkdir -p /ansible/roles/web/vars mkdir -p /ansible/roles/web/tasks mkdir -p /ansible/roles/security/vars mkdir -p /ansible/roles/security/tasks mkdir -p /ansible/roles/security/{vars,tasks}1. 清单文件# 仅定义webservers主机组学生替换为自己的受控节点IP [newserver] 192.168.223.151 192.168.223.1522. web 角色 - 变量roles/web/vars/main.yml# web角色仅保留核心变量减少记忆成本 nginx_pkg: nginx # Nginx软件包名 nginx_service: nginx # Nginx服务名3.web 角色 - 任务roles/web/tasks/main.yml# web角色核心任务安装启动Nginx无复杂配置聚焦角色逻辑 --- - name: 安装Nginx软件包 ansible.builtin.yum: name: {{ nginx_pkg }} state: present # 确保安装幂等多次执行不重复安装 - name: 启动并开机自启Nginx服务 ansible.builtin.service: name: {{ nginx_service }} state: started enabled: true4. security 角色 - 任务roles/security/tasks/main.yml# security角色核心任务防火墙放行80端口 SELinux宽松模式 - name: 放行防火墙80端口http服务 ansible.builtin.firewalld: service: http # 直接用预设的http服务对应80端口比写port更简单 permanent: true # 永久生效 immediate: true # 立即生效无需重启防火墙 state: enabled - name: 设置SELinux为宽松模式临时生效避免重启 ansible.builtin.selinux: policy: targeted state: permissive # 宽松模式不阻止操作仅记录日志5. 主 Playbooksite.yml# 主Playbook仅做2件事指定目标主机 引入两个角色 --- - hosts: webservers # 关联清单中的webservers主机组 remote_user: root # 远程执行用户 gather_facts: true # 自动收集Factsfirewalld/selinux模块依赖 # 按顺序引入角色先做安全配置再部署Web逻辑合理 # 提前写好仓库挂载好或者增加一个cnagku角色 roles: - security # 引入security角色执行防火墙SELinux配置 - web # 引入web角色执行Nginx部署四、执行与验证ansible-playbook -i /hosts /ansible/site.yml扩展把某个角色需要的变量单独放到文件里那ansible-playboot如何识别哪个变量文件是哪个角色的当在 Playbook 的roles中直接以 “字符串形式” 引用角色如- web时Ansible 会默认将该角色名称作为目录名去roles/目录下查找同名目录如roles/web/这是最规范、最常用的方式无需额外配置。案例1:远程批量安装 nginx修改端口号并使配置生效注意每个 Task 只能调用 1 个模块description参数用于描述 yum 源的用途比如 “CentOS BaseOS Repository”是yum_repository模块的强制参数没有它 Ansible 会判定参数不完整直接终止任务并抛出Parameter description is required错误。yum_repository指定的file名称比如x和/etc/yum.repos.d/目录下已存在的.repo文件如x.repo重名时Ansible 的处理逻辑非常友好 ——不会直接覆盖整个文件而是 “精准修改 / 追加”完全不用担心原有配置丢失--- - name: 给web服务器部署nginx # Play的名字方便看日志 hosts: webservers # 这个Play要操作的主机对应你的Hosts列表 tasks: # 这个Play里的Task列表 - name: 挂载光盘 mount: path: /mnt src: /dev/sr0 state: mounted fstype: iso9660 # 光盘专属文件系统类型必须加 - name: 配置仓库base yum_repository: file: x name: base description: base state: present enabled: yes gpgcheck: no baseurl: /mnt/BaseOS - name: 配置仓库app yum_repository: file: x name: app description: app state: present enabled: yes gpgcheck: no baseurl: /mnt/AppStream - name: 安装nginx yum: name: nginx state: present - name: 修改nginx配置文件 lineinfile: path: /etc/nginx/nginx.conf # 主流端口配置文件路径 regexp: ^\\s*listen\\s\\d;?$ # 匹配以listen开头、后跟数字的行如listen 80; line: listen 8080; # 替换为监听8080端口缩进和原文件保持一致 backup: yes # 修改前自动备份原文件建议开启方便回滚 state: present - name: 修改Nginx默认欢迎页面为welcome test copy: content: welcome test # 页面要显示的内容 dest: /usr/share/nginx/html/index.html # Nginx默认首页路径 backup: yes # 备份原首页文件生成index.html.bak.xxxxxx mode: 0644 # 设置文件权限确保Nginx能读取必需 - name: 启动nginx service: name: nginx state: started实验2纯剧本方式部署 LNMPDiscuz扁平任务结构[rootrhce ~]# cat discuz.yml --- - name: 纯剧本部署 LNMP Discuz 论坛适配文件名不固定 hosts: 192.168.223.151 gather_facts: no become: yes vars: # 基础配置 mount_src: /dev/sr0 mount_path: /mnt mount_fstype: iso9660 web_root: /var/www/html/discuz nginx_conf_path: /etc/nginx/conf.d/discuz.conf discuz_url: https://gitee.com/Discuz/DiscuzX/attach_files/2335009/download # 数据库配置 db_root_pwd: Redhat123! # 学生可自行修改目标密码 db_user: root db_host: localhost tasks: ########################################################################### # 步骤 0挂载光盘原生幂等 ########################################################################### - name: 挂载光盘到/mnt目录 mount: src: {{ mount_src }} path: {{ mount_path }} fstype: {{ mount_fstype }} state: mounted ########################################################################### # 步骤 1安装基础软件原生幂等 ########################################################################### - name: 安装LNMP及基础依赖包 package: name: - unzip - nginx - php - php-fpm - php-mysqlnd - mariadb-server - python3-PyMySQL state: present ########################################################################### # 步骤 2启动基础服务原生幂等 ########################################################################### - name: 启动并开机自启Nginx服务 systemd: name: nginx state: started enabled: yes - name: 启动并开机自启PHP-FPM服务 systemd: name: php-fpm state: started enabled: yes - name: 启动并开机自启MariaDB服务 systemd: name: mariadb state: started enabled: yes ########################################################################### # 步骤 3创建网站根目录原生幂等 ########################################################################### - name: 创建Discuz网站根目录并设置权限 file: path: {{ web_root }} state: directory owner: nginx group: nginx mode: 0755 ########################################################################### # 步骤 4下载解压Discuz核心适配文件名不固定全靠find动态处理 ########################################################################### # 第一步检查是否已有任意Discuz开头的压缩包不限制具体名称 - name: 检查{{ web_root }}是否有Discuz开头的压缩包 find: path: {{ web_root }} patterns: Discuz*.zip # 匹配所有Discuz开头的zip包 file_type: file register: existing_discuz_zip # 第二步仅当无任何Discuz压缩包时才下载避免重复下载/401 - name: 下载Discuz压缩包文件名不固定下载到目录即可 get_url: url: {{ discuz_url }} dest: {{ web_root }}/ # 指向目录让文件按URL默认名保存 validate_certs: no timeout: 60 when: existing_discuz_zip.files | length 0 # 无任何Discuz包时才下载 # 第三步再次find所有Discuz压缩包适配下载后的随机名称 - name: 动态查找{{ web_root }}下所有Discuz开头的压缩包 find: path: {{ web_root }} patterns: Discuz*.zip file_type: file register: discuz_zip_files # 第四步检查是否已解压通过Discuz核心目录判断与文件名无关 - name: 检查Discuz是否已解压通过upload目录判断 stat: path: {{ web_root }}/upload register: discuz_unzip_stat # 第五步解压仅找到压缩包且未解压时执行适配任意Discuz开头的包 - name: 解压动态匹配到的Discuz压缩包 unarchive: src: {{ discuz_zip_files.files[0].path | default() }} # 取第一个匹配的包兜底赋空 dest: {{ web_root }} remote_src: yes when: - discuz_zip_files.files | length 0 # 至少找到1个Discuz包 - not discuz_unzip_stat.stat.exists # 未解压过 ignore_errors: yes # 兜底压缩包损坏/格式问题不中断流程 #当 {{ web_root }}/upload 目录不存在时discuz_unzip_stat.stat.exists 为 False经 not 取反后为 True条件满足解压任务会执行 #当 {{ web_root }}/upload 目录已存在时discuz_unzip_stat.stat.exists 为 True经 not 取反后为 False条件不满足解压任务会跳过。 ########################################################################### # 步骤 5配置Nginx虚拟主机原生幂等 ########################################################################### - name: 写入Discuz的Nginx配置文件 copy: content: | server { listen 80; root {{ web_root }}/upload; include /etc/nginx/default.d/php.conf; } dest: {{ nginx_conf_path }} backup: yes register: nginx_conf changed_when: nginx_conf.changed - name: 重新加载Nginx配置仅配置变更时执行 systemd: name: nginx state: reloaded when: nginx_conf.changed ########################################################################### # 步骤 6配置防火墙和SELinux原生幂等 ########################################################################### - name: 永久开放80端口 firewalld: port: 80/tcp permanent: yes state: enabled immediate: yes - name: 临时关闭SELinux command: setenforce 0 ignore_errors: yes changed_when: no ########################################################################### # 步骤 7修改Discuz权限幂等仅目录存在时执行 ########################################################################### - name: 检查Discuz upload目录是否存在 stat: path: {{ web_root }}/upload register: discuz_upload_stat - name: 修改Discuz data目录权限为777 file: path: {{ web_root }}/upload/data mode: 0777 recurse: yes state: directory when: discuz_upload_stat.stat.exists - name: 修改Discuz config目录权限为777 file: path: {{ web_root }}/upload/config mode: 0777 recurse: yes state: directory when: discuz_upload_stat.stat.exists - name: 批量修改uc_client/uc_server目录权限为777 file: path: {{ web_root }}/upload/{{ item }} mode: 0777 recurse: yes state: directory loop: - uc_client - uc_server when: discuz_upload_stat.stat.exists ########################################################################### # 步骤 8初始化数据库原生幂等 ########################################################################### # 步骤1判断root是否有密码核心用简单命令测试 - name: 测试root无密码能否登录 ansible.builtin.shell: mysql -u{{ db_user }} -S /var/lib/mysql/mysql.sock -e show databases; 2/dev/null register: no_pwd_login ignore_errors: yes # 有密码时登录失败忽略错误不中断 changed_when: no # 仅判断状态不标记“变更” # 步骤2仅无密码时设置root密码幂等设过就不重复设 - name: 初始化root密码仅第一次执行 community.mysql.mysql_user: name: {{ db_user }} host: localhost # 简化只设localhost的密码去掉冗余host password: {{ db_root_pwd }} # check_implicit_admin: yes # 无密码时允许登录的关键参数 login_unix_socket: /var/lib/mysql/mysql.sock login_user: {{ db_user }} login_host: {{ db_host }} login_password: # 无密码时填空 state: present # 幂等核心密码已设则跳过 when: no_pwd_login.rc 0 # 只有无密码登录成功时才执行 # 步骤3创建测试库幂等已存在则跳过适配有/无密码登录 - name: 创建luntan数据库多次执行不报错 community.mysql.mysql_db: name: luntan state: present # 幂等确保库存在不存在才创建 encoding: utf8mb4 # 动态适配密码有密码用db_root_pwd无密码填空 login_unix_socket: /var/lib/mysql/mysql.sock login_user: {{ db_user }} login_host: {{ db_host }} login_password: {{ db_root_pwd }}执行剧本 验证1. 执行命令ansible-playbook discuz-lnmp-playbook.yml2. 验证浏览器访问 http://受控节点IP进入 Discuz 安装向导输入剧本中定义的数据库信息库名 discuz_db、用户 discuz_user、密码 Discuz123完成安装。问题解决用户现在遇到的 Ansible 执行修改 MariaDB root 密码任务失败的问题首先要解释错误原因然后给解决方案。首先错误原因Ansible 的 mysql_user/mysql_db 模块依赖 Python 的 MySQL 数据库驱动包但受控节点上没有安装对应的包或者 Python 解释器版本不匹配导致找不到驱动。然后分步骤解决1. 先解释错误核心- 错误提示明确说需要 MySQL Python 模块Python2.7 需要 PyMySQL/MySQL-pythonPython3 需要 mysqlclient/PyMySQL- 受控节点要么没装这些包要么 Ansible 用的 Python 解释器和安装的驱动版本不匹配。2. 解决方案步骤步骤 1在受控节点安装 Python MySQL 驱动区分 CentOS 版本yum/dnf步骤 2可选指定 Ansible 的 Python 解释器避免版本不匹配步骤 3重新执行任务。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询