day52-ansible变量-调试-优化

1. ✅ansible变量

1.1. 📝列表变量

fruits:
  - "苹果"
  - "香蕉"
  - "火龙果"
  
python中需要写在一行
fruits = ["苹果","香蕉","火龙果"]

列表搭配着循环使用

1.2. 🔐字典变量

  • 字典dict 服务器信息,一组相关的内容
rsync_server:
  ip: "172.16.1.41"
  module: blog
  bak_dir: /nfs/backup/blog/
  user: www
  userid: 1999
  password: "rsync_backup:1"
  • 编写playbook剧本
- hosts: nfs
  vars:
    nfs_server:
      ip: "10.0.0.31"
      dir: "/nfs/backup/blog/"
      user:
        - "zhu"
        - "zbl"
      user_id:
        - { name: "zhu01",uid: "1000" }
        - { name: "zhu02",uid: "1001" }
  tasks:
    - name: print
      debug:
        msg: |
          nfs服务器ip: {{ nfs_server.ip }}
          nfs服务器目录: {{ nfs_server.dir }}
          nfs服务器用户: {{ nfs_server.user }}

    - name: print
      debug:
        msg: |
          nfs服务器ip: {{ nfs_server.ip }}
          nfs服务目录: {{ nfs_server.dir }}
          nfs服务器用户: {{ item.name }}
          nfs服务器用户id: {{ item.uid }}
      loop: "{{ nfs_server.user_id }}"
  • 运行playbook
ansible-playbook -i hosts 19.nfs_info.yml

2. ✅handlers

  • 触发器:模块状态变化(分发配置文件,文件内容变化),然后触发handlers内容

  • 问题:分发配置文件后,服务是启动还是重启?
  • 需求:配置文件变化或为变化,变化后需要重启服务
#notify+handlers

1.分发配置
2.启动服务(正常)
3.重启服务(配置变化后)
1.编写playbook剧本
[root@m02 /server/ans/playbooks]# vim 20.handlers.yml
- hosts: nfs
  tasks:
    - name: 分发配置文件
      template:
        src: ./files/exports.j2
        dest: /tmp/exports
      notify:
        - 重启服务
  handlers:
    - name: 重启服务
      systemd:
       name: nfs
       state: reloaded
2.运行playbook剧本
[root@m02 /server/ans/playbooks]# ansible-playbook  -i hosts 20.handlers.yml

3. ✅ansible目录规范roles结构

roles/
  └── role_name/            # 角色名称
      ├── defaults/         # 默认变量(优先级最低)
      │   └── main.yml
      ├── vars/             # 内部变量(优先级高于 defaults)
      │   └── main.yml
      ├── tasks/            # 任务列表
      │   └── main.yml
      ├── handlers/         # 处理器(如重启服务)
      │   └── main.yml
      ├── templates/        # Jinja2 模板文件
      ├── files/            # 静态文件(如配置文件)
      ├── meta/             # 元数据(依赖关系等)
      │   └── main.yml
      └── README.md         # 可选:角色说明文档
  └── group_vars/all/main.yml     #共享变量
  └── hosts												#主机清单
  └── ansible.cfg                 #ansible配置文件
  └── top.yml											#主剧本(运行此剧本)

4. ✅ansible部署rsync服务

  • 1️⃣创建roles目录结构
mkdir -p rsync_server/{files,tasks,handlers,templates}

  • 2️⃣在group_vars/all/main.yml中定义变量列表
rsync_server:
  ip: "172.16.1.41"
  module: blog
  bak_dir: /nfs/backup/blog/
  user: www
  userid: 1999
  password: "rsync_backup:1"
  • 3️⃣在tasks目录下编写playbook
- name: 1.安装rsync软件包
  yum:
    name: rsync
    state: latest
  tags:
    - install

- name: 2.修改配置文件
  template:
    src: rsyncd.conf.j2
    dest: /etc/rsyncd.conf
    backup: yes
  notify:
    restart_rsyncd

- name: 3.添加www虚拟用户
  user:
    name: "{{ rsync_server.user }}"
    uid: 1999
    shell: /sbin/nologin
    create_home: no
    state: present

- name: 4.创建/nfs/backup/blog/备份目录,修改所有者
  file:
    path: "{{ rsync_server.bak_dir }}"
    owner: "{{ rsync_server.user }}"
    group: "{{ rsync_server.user }}"
    state: directory

- name: 5.添加密码文件,权限为600
  lineinfile:
    path: /etc/rsyncd.passowrd
    line: "{{ rsync_server.password }}"
    owner: root
    group: root
    mode: '0600'
    create: yes

- name: 6.启动rsyncd服务
  systemd:
    name: rsyncd
    enabled: yes
    state: started
  • 4️⃣在templates目录下创建rsyncd.conf.j2模板文件
##rsyncd.conf start##
fake super = yes 
uid = {{ rsync_server.user }}
gid = {{ rsync_server.user }}
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[{{ rsync_server.module }}]
comment = path
path = {{ rsync_server.bak_dir }}
  • 5️⃣在handlers目录下编写handlers
- name: restart_rsyncd
  systemd:
    name: rsyncd
    state: restarted
  • 6️⃣在roles目录下编写主top.yml主playbook
- hosts: bak
  roles:
    - rsync_server
  • 7️⃣运行主playbook
ansible-playbook top.yml

  • 8️⃣检查
ansible bak -m shell -a 'systemctl status rsyncd'

5. ✅ansible部署nfs服务

  • 1️⃣创建roles目录结构
mkdir -p rsync_server/{files,tasks,handlers,templates}

  • 2️⃣在group_vars/all/main.yml中定义变量列表
nfs_server:
  ip: "172.16.1.31"
  nfs_dir: /nfs/blog/uploads/
  user: www
  userid: 1999
  • 3️⃣在nfs_server/templates目录下创建exports.j2模板文件
{{ nfs_server.nfs_dir }} 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
  • 4️⃣编写playbook剧本
- name: 1.安装rpcbind,nfs-utils软件包
  yum:
    name: rpcbind,nfs-utils
    state: latest

- name: 2.修改配置文件
  template:
    src: exports.j2
    dest: /etc/exports
    backup: yes
  notify:
    reload_nfs

- name: 3.添加www虚拟用户
  user:
    name: "{{ nfs_server.user }}"
    uid: "{{ nfs_server.userid }}"
    shell: /sbin/nologin
    create_home: no
    state: present

- name: 4.创建共享目录,修改所有者
  file:
    path: "{{ nfs_server.nfs_dir }}"
    owner: "{{ nfs_server.user }}"
    group: "{{ nfs_server.user }}"
    state: directory

- name: 5.启动rpcbind服务
  systemd:
    name: "{{ item }}"
    enabled: yes
    state: started
  loop:
    - rpcbind
    - nfs-utils
  • 5️⃣在roles编写top.yml主剧本
- hosts: nfs
  roles:
    - role: nfs_server
  • 6️⃣运行playbook
ansible-playbook top.yml

  • 7️⃣检查
ansible nfs -m shell -a 'showmount -e'

6. ✅ansible调试功能

6.1. 🔍语法检查

ansible-playbook -C top.yml
-C 模拟运行剧本,检查错误,register变量无法使用
--syntax-check 语法检查,不运行

6.2. ☀️显示执行详细过程

ansible-playbook -vvv top.yml

6.3. 🎯tag标签

  • 在剧本中定义标签,运行的时候指定标签
- name: 1.安装rsync软件包
  yum:
    name: rsync
    state: latest
  tags:
    - install

- name: 2.修改配置文件
  copy:
    src: rsyncd.conf
    dest: /etc/rsyncd.conf
    backup: yes
  tags:
    - config
  notify:
    restart_rsyncd

- name: 3.添加www虚拟用户
  user:
    name: www
    uid: 1999
    shell: /sbin/nologin
    create_home: no
    state: present
  tags:
    - config

- name: 4.创建/nfs/backup/blog/备份目录,修改所有者
  file:
    path: "{{ bak_dir }}"
    owner: www
    group: www
    state: directory
  tags:
    - config

- name: 5.添加密码文件,权限为600
:
    path: /etc/rsyncd.passowrd
    line: "rsync_backup:1"
    owner: root
    group: root
    mode: '0600'
    create: yes
  tags:
    - config

- name: 6.启动rsyncd服务
  systemd:
    name: rsyncd
    enabled: yes
    state: started
  tags:
    - start
  • 查看剧本中的标签
ansible-playbook -i hosts --list-tags top.yml

  • 运行指定标签
ansible-playbook -i hosts -t config top.yml

  • 排除指定标签,运行其他的
ansible-playbook -i hosts --skip-tags install top.yml

7. ✅ansible优化

7.1. 🚀性能优化

  • 1️⃣配置文件目录的优化(roles)
  • 2️⃣关闭facts变量
  • 3️⃣主机清单优化
  • 4️⃣管理并发数优化
[defaults]
host_key_checking = False
deprecation_warnings = False
interpreter_python=/usr/bin/python3
gathering = explicit
inventory = ./hosts
forks = 10
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

7.2. 🔐安全优化

7.2.1. vault加密/解密

  • vault加密,敏感信息加密(主机清单⽂件中有密码,剧本中有敏感信息)
ansible-vault encrypt 文件(剧本,主机清单文件) #1.加密

ansible/ansible-playbook --ask-vault-pass xxxx #2.运行

ansible-vault decrypt 文件(剧本,主机清单文件) #3.解密

7.2.2. 配置sudo

  • 安全
    • 配置sudo⽤⼾ ans ALL=(ALL) NOPASSWD: ALL
    • 配合vpn,jumpserver⼀起使⽤
    • ⽤⼾--->vpn---->jumpserver(跳板机)---->ansible
    • ⽤⼾的密码,进⾏加密( hash, ansible-vault)

  • 所有被管理节点上添加ansible用户,设置密码
  • 所有被管理节点上配置ansible sudo权限ans ALL=(ALL) NOPASSWD: ALL
  • 管理端与被管理端密钥认证:分发密钥发到ans⽤⼾.
  • 管理端: ansible.cfg配置,通过ans⽤⼾连接,远程连接端⼝号, 使⽤sudo.

  • 管理端
1.添加ans用户
ansible all -m shell -a 'echo "ans ALL=(ALL)  NOPASSWD: ALL" >>/etc/sudoers'
ansible all -m shell -a 'useradd ans'
ansible all -m shell -a 'echo zhubl996 |passwd --stdin ans'

2.修改ansible配置文件
vim /etc/ansible/ansible.cfg
[defaults]
sudo_user      = ans ##被管理端上具有sudo权限的用户 nopasswd: ALL
remote_user    = ans ##被管理端使用的用户,不指定默认是当前用户/root
remote_port    = 22  ##被管理端ssh端口号 
host_key_checking = False
log_path = /var/log/ansible.log
[inventory]
[privilege_escalation]
become=True          ##开启sudo功能
become_method=sudo   ##使用sudo命令
become_user=root     ##普通用户切换为root
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

3.重新分发密钥给ans普通用户.
ssh-copy-id  ans@172.16.1.7  ...所有节点都要分发密钥.

4.测试
ansible all -m ping
  • 被管理端
连接到某一台机器修改ssh配置文件关闭root远程登录功能.
修改/etc/ssh/sshd_config
sed 
PermitRootLogin=no

8. ✅总结

  • 主机清单
  • ansible模块
  • ansible剧本(变量,判断,循环)
  • ansible roles
  • 调试 -C/tags,ignore_errors
  • jinja2模板文件
  • 优化
  • 最终目标:书写各种服务的剧本(通过变量控制剧本)相当于变量就是剧本的入口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱包林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值