杨梅冲
每天在想什么呢?

1.include文件包含

  应用场景:

    1个ansible剧本内容过多,涉及到多个play(- host:web),可读性变弱,不方便调试.

    于是人们想出把单个大的剧本拆分为多个,小的剧本.

    多个小的剧本可以通过include功能合并使用.

 

在我们书写剧本的时候,会涉及到多个步骤,还会涉及到服务端和客户端.

发现剧本越来越大,不容易进行分析与阅读.

把剧本拆分开,分成2个文件服务端,客户端.

这时候可以通过include_tasks的功能把多个剧本文件合并在一起,让剧本变成多个方便阅读与维护.

 

include_tasks

以之前安装的nfs为例:服务端和客户端都写在同一个yaml文件里,如果需要进行分离

image

image

 nfs分离

# 分离服务端
mkdir /ansible/nfs
vim /ansible/nfs/nfs_server.yml
  - name: 01 . 部署nfs-utils,rpcbind
    yum:
      name: nfs-utils,rpcbind
      state: present
    tags:
      - 01.install
    ignore_errors: True
  - name: 02 . 修改配置文件
    lineinfile:
      path: /etc/exports
      line: "/backup-nfs 172.16.1.0/24(rw,all_squash)"
      create: true
    tags:
      - 02.conf
  - name: 03 . 创建共享目录并改所有者
    file:
      path: /backup-nfs
      owner: ec2-user
      group: ec2-user
      state: directory
    tags:
      - 03.dir
  - name: 04. 启动服务rpcbind,nfs(注意顺序)
    systemd:
      name: "{{ item }}"
      enabled: yes
      state: started
    loop:
      - rpcbind
      - nfs
    tags:
      - 04.start_srv

# 分离客户端,空格可处理,也可以不用处理
vim /ansible/nfs/nfs_client.yml
    - name: 01 . 部署nfs-utils
      yum:
        name: nfs-utils
        state: present
    - name: 02 . 挂载nfs
      mount:
        src: 172.16.1.41:/backup-nfs
        path: /ans-upload
        fstype: nfs
        state: mounted

# include主执行文件配置:
# cat include-nfs.yml 
- hosts: ywmonitor
  tasks:
    - include_tasks: /home/ec2-user/other/nfs/nfs_server.yml
#nfs客户端部署
- hosts: www
  tasks:
    - include_tasks: /home/ec2-user/other/nfs/nfs_client.yml
  # handler:

2.roles

通过使用include_tasks功能,大型剧本,缩小体积,变的更加模块化.

我们发现新的问题,handlers,变量文件,发送配置文件(可能是j2文件)存放比较 混乱 .

于是人们发明了一套规范,这个规范是一套剧本目录结构的要求与标准,让我们书写剧本的时候,把剧本的内容和需要的文件,按照目录要求,分门别类存储.

这套规则一般叫roles规则,roles的本质就是规定了1套目录结构,用于书写剧本的.

官网:https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_reuse_roles.html

image

 以nfs为例进行拆分

# 第一步新建目录(没有需要放的目录可以不用新建,本次都建立)
# tasks 核心目录
mkdir -p roles/nfs/nfs-server/{file,handlers,tasks,templates}
cd roles/nfs/
mkdir group_vars/all -p
touch top.yml hosts
# hosts我直接拷贝
cp /etc/ansible/hosts .
cat hosts
[nfs-server]
172.31.0.1

$ tree roles/
roles/
└── nfs
    ├── group_vars  # 可以建成只有nfs使用的vars/main.yml
    │   └── all
    │       └── main.yml
    ├── hosts
    ├── nfs-server
    │   ├── files
    │   ├── handlers
    │   │   └── main.yml
    │   ├── tasks
    │   │   └── main.yml
    │   └── templates
    │       └── exports.j2
    └── top.yaml

8 directories, 6 files

# 第二步:拆分
1.将tasks里需要替换成变量的全部替换成变量
2.templates按规定配置好,放到对应目录
3.添加变量group_vars/all/main.yml
4.添加触发器,文件变动后自动重启程序
5.编写控制文件top.yml

# 1.tasks
vim nfs-server/tasks/main.yml
  - name: 01 . 部署nfs-utils,rpcbind
    yum:
      name: nfs-utils,rpcbind
      state: present
    tags:
      - 01.install
    ignore_errors: True
  - name: 02 . 修改配置文件
    template:
      src: exports.j2
      dest: /etc/exports
      create: true
    tags:
      - 02.conf
  - name: 03 . 创建共享目录并改所有者
    file:
      path: "{{ nfs_dir }}"
      owner: "{{ nfs_user }}"
      group: "{{ nfs_user }}"
      state: directory
    tags:
      - 03.dir
  - name: 04. 启动服务rpcbind,nfs(注意顺序)
    systemd:
      name: "{{ item }}"
      enabled: yes
      state: started
    loop:
      - rpcbind
    tags:
      - 04.start_srv

# 2.exports.j2
cat nfs-server/templates/exports.j2 
# author: {{ author }}
{{ nfs_dir }} 172.31.0.0/24(rw,all_squash)

# 3.group_vars
#cat group_vars/all/main.yml 
author: xc
nfs_user: ec2-user
nfs_dir: /backup-nfs

# 4.handlers
# cat nfs-server/handlers/main.yml 
- name: restart_nfs
  systemd:
    name: nfs
    enabled: yes
    state: restarted

# 编写控制文件roles/nfs/top.yml
cat top.yml 
- hosts: ywmonitor
  roles:
    - role: nfs-server

#- hosts: www
#  roles:
#    - role: nfs-client


# 执行
ansible-playbook -C top.yml 

PLAY [ywmonitor] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [172.31.0.1]
TASK [nfs-server : 01 . 部署nfs-utils,rpcbind] *******************************************************************************************
ok: [172.31.0.1]
TASK [nfs-server : 02 . 修改配置文件] ****************************************************************************************************
changed: [172.31.0.1]
TASK [nfs-server : 03 . 创建共享目录并改所有者] ******************************************************************************************
changed: [172.31.0.1]
TASK [nfs-server : 04. 启动服务rpcbind,nfs(注意顺序)] ************************************************************************************
changed: [172.31.0.1] => (item=rpcbind)

PLAY RECAP *******************************************************************************************************************************
172.31.0.1              : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

 roles小结:

  roles本质是:目录规范

  模块化思想

  尽量多使用变量,循环,handlers .

3.valut

  加密指定的文件: ansible-vault用于加密敏感信息

  hosts文件加密

  变量文件加密

#进行加密
ansible-vault encrypt  文件#enable
#进行使用
ansible或ansible-playbook   --ask-vault-pass 即可
#彻底解密
ansible-vault decrypt  hosts#


# 例如加密hosts,要记住密码
ansible-vault encrypt hosts
New Vault password: 
Confirm New Vault password: 
Encryption successful

# cat hosts
$ANSIBLE_VAULT;1.1;AES256
37356337353765646562363366386463633836356234346637653162353765323732383934326465
6139653938353162646138653134623262316366323538630a383434326436303634393136626562
36613361363630346538376135383565646165396434653463653133323765623536333832613936
3732356434666163610a666166623331393165616366636437373365333837633465666665636663
6365

# 执行命令
ansible-playbook -C top.yml --ask-vault-pass
Vault password:

# 解密:就恢复成原样了
ansible-vault decrypt hosts

4.Galaxy

官网:https://galaxy.ansible.com/ui/

其它用户上传的,如果网络不好,可以采用下载到本地:Download tarball

image

 

posted on 2026-05-17 01:26  杨梅冲  阅读(9)  评论(0)    收藏  举报