loop循环
创建用户并设置密码,密码以变量的方式
[devops@server1 ansible]$ vim user.yml--- - hosts: db vars_files: - userlist.yml tasks: - name: Add the users ansible.builtin.user: name: "{{ item.user }}" password: "{{ item.pass | password_hash('sha512') }}" state: present loop: "{{ userlist }}"[devops@server1 ansible]$ vim userlist.yml--- userlist: - {user: user1,pass: pass1} - {user: user2,pass: pass2} - {user: user3,pass: pass3}密码改为加密的方式
[devops@server1 ansible]$ ansible-vault encrypt userlist.yml再次查看userlist.yml,并没有展示明文
执行剧本之前要输入密码
[devops@server1 ansible]$ ansible-playbook user.yml --ask-vault-pass Vault password:解除加密
[devops@server1 ansible]$ ansible-vault decrypt userlist.ymlcreate | 创建并加密一个新文件(会打开编辑器编辑内容,保存后自动加密) |
decrypt | 解密一个已加密的文件,输出明文内容或保存为明文文件 |
edit | 编辑已加密的文件(解密后打开编辑器,保存时自动重新加密) |
view | 查看加密文件的内容(解密后只读显示,不修改) |
encrypt | 加密一个已有的明文 YAML 文件(原地加密) |
encrypt_string | 加密一个字符串(常用于命令行传递密码、token 等) |
rekey | 更改加密文件的密码(重新生成密钥) |
更推荐的管理方式
[devops@server1 ansible]$ mkdir host_vars [devops@server1 ansible]$ cd host_vars/ [devops@server1 host_vars]$ mkdir server3 [devops@server1 host_vars]$ cd server3/ [devops@server1 server3]$ vim vault --- userlist: - {user: user1,pass: pass1} - {user: user2,pass: pass2} - {user: user3,pass: pass3} [devops@server1 server3]$ ansible-vault encrypt vault然后就不需要在playbook里面加入变量目录的文件,会自动扫描你的目录
--- - hosts: db #vars_files: #- userlist.yml tasks: - name: Add the users ansible.builtin.user: name: "{{ item.user }}" password: "{{ item.pass | password_hash('sha512') }}" state: present loop: "{{ userlist }}"同理,在apache文件也不需要
[webservers] server2 server3 #[webservers:vars] #http_port=80[devops@server1 ansible]$ mkdir groups_vars [devops@server1 ansible]$ cd groups_vars/ [devops@server1 groups_vars]$ mkdir webservers [devops@server1 groups_vars]$ cd webservers/ [devops@server1 webservers]$ vim vars--- http_port: 80[devops@server1 ansible]$ ansible-playbook apache.yml --ask-vault-pass配置并行
先分成每批 2 台主机。
在该批次内,最多 10 台主机并行(但批次内只有 2 台,故实际并行数为 2)。
- hosts: webservers serial: 2 forks: 10[zabbix-server] server2安装ansible-mysql
[devops@server1 ansible]$ ansible-galaxy collection install git+https://github.com/ansible-collections/community.mysql.gitvim zabbix.yml--- # 目标主机组:zabbix-server # 用途:在指定主机上完整部署 Zabbix Server 6.0(MySQL 后端) - hosts: zabbix-server tasks: # ==================================================================== # 阶段一:添加软件源 # ==================================================================== - name: add zabbix repo ansible.builtin.yum: # 直接从官方 URL 安装 Zabbix 仓库 RPM 包 name: https://repo.zabbix.com/zabbix/6.0/rhel/9/x86_64/zabbix-release-latest-6.0.el9.noarch.rpm state: present # 跳过 GPG 签名验证(测试环境使用,生产环境建议配置 GPG key) disable_gpg_check: yes # ==================================================================== # 阶段二:安装核心组件 # ==================================================================== - name: install zabbix-server ansible.builtin.yum: name: - zabbix-server-mysql # Server 主程序(MySQL 后端) - zabbix-web-mysql # Web 前端(PHP + MySQL) - zabbix-apache-conf # Apache 配置文件 - zabbix-sql-scripts # 数据库初始化 SQL 脚本 - zabbix-selinux-policy # SELinux 策略包(可选,但建议安装) - zabbix-agent # 本机 Agent(用于自我监控) state: present - name: install mysql-server ansible.builtin.yum: name: - mysql-server # MySQL/MariaDB 服务端 - python3-PyMySQL # Ansible MySQL 模块依赖的 Python 驱动 state: present # ==================================================================== # 阶段三:启动 MySQL 服务 # ==================================================================== - name: enable service mysql ansible.builtin.service: name: mysqld # Rocky Linux 9 中 MySQL 服务名 state: started # 立即启动 enabled: yes # 设置开机自启 # ==================================================================== # 阶段四:创建数据库 # ==================================================================== - name: init zabbix database ansible.mysql.mysql_db: name: zabbix state: present # 如果不存在则创建 encoding: utf8mb4 # 支持完整 Unicode(表情等) collation: utf8mb4_bin # 区分大小写,Zabbix 官方推荐 # ==================================================================== # 阶段五:创建数据库用户并授权 # ==================================================================== - name: create zabbix database user ansible.mysql.mysql_user: name: zabbix host: localhost # 只允许本地连接(Server 在本机) password: "zabbix_password" # 明文密码,生产环境建议使用 vault 加密 priv: "zabbix.*:ALL" # 授予对 zabbix 库的所有权限 state: present # ==================================================================== # 阶段六:导入表结构前的准备 # ==================================================================== - name: set log_bin_trust_function_creators ansible.mysql.mysql_variables: variable: log_bin_trust_function_creators value: 1 # 临时允许创建存储过程/函数(Zabbix 导入需要) # 注意:此变量在 MySQL 重启后恢复默认值,导入后需手动关闭 # ==================================================================== # 阶段七:确保数据库为空(解决重复导入报错) # ==================================================================== - name: drop and recreate zabbix database ansible.builtin.shell: cmd: | mysql -e "DROP DATABASE IF EXISTS zabbix;" mysql -e "CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;" register: drop_result changed_when: "'Database created' in drop_result.stdout" # 当输出包含 "Database created" 时标记为 changed # 注意:MySQL 命令默认不输出此信息,该条件可能不生效,建议使用 mysql_db 模块 # ==================================================================== # 阶段八:导入初始表结构和数据(核心步骤,耗时较长) # ==================================================================== - name: import zabbix initial schema and data (this may take a while) ansible.builtin.shell: # 解压 SQL 文件并通过 mysql 客户端导入 # -uzabbix -pzabbix_password 使用 Zabbix 用户认证 # 导入成功后创建锁文件,防止重复执行 cmd: > zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -pzabbix_password zabbix && touch /etc/zabbix/.init_db_sql.lock args: creates: /etc/zabbix/.init_db_sql.lock # 如果锁文件已存在,则跳过此任务(幂等性保证) # ==================================================================== # 阶段九:导入完成后恢复安全设置 # ==================================================================== - name: disable log_bin_trust_function_creators ansible.mysql.mysql_variables: variable: log_bin_trust_function_creators value: 0 # 关闭创建函数的权限,恢复安全状态 # ==================================================================== # 阶段十:配置 Zabbix Server 数据库连接 # ==================================================================== - name: configure zabbix server database password ansible.builtin.lineinfile: path: /etc/zabbix/zabbix_server.conf regexp: '^DBPassword=' # 匹配已存在的 DBPassword 行 insertafter: '^# DBPassword=' # 如果不存在则插入到注释行之后 line: DBPassword=zabbix_password # 使 Server 能使用我们创建的用户密码连接数据库 # ==================================================================== # 阶段十一:启动所有服务并设置开机自启 # ==================================================================== - name: restart and enable all services ansible.builtin.service: name: "{{ item }}" state: restarted # 重启加载新配置 enabled: yes # 开机自启 loop: - zabbix-server # Zabbix Server 核心服务 - zabbix-agent # 本机 Agent - httpd # Apache Web 服务器 - php-fpm # PHP FastCGI 进程管理器