8.Ansible:Roles、Galaxy、Vault加密
[toc]
Ansible Roles基本概述
roles不管是Ansible还是saltstack,在写一键部署的时候,都不可能把所有的步骤全部写入到一个’剧本’文件当中,我们肯定需要把不同的工作模块,拆分开来(解耦),那么说到解耦,我们就需要用到roles官方推荐,因为roles的目录结构层次更加清晰。
例如:我们之前推荐大家写一个base.yml里面写所有基础优化的项目,其实把所有东西摞进去也是很鸡肋的,不如我们把这些功能全部拆分开,谁需要使用,就调用即可。
建议:每个roles最好只使用一个tasks这样方便我们去调用,能够很好的做到解耦。(SOA)
Ansible Roles目录结构
官方推荐最佳实践目录结构定义方式
| 1 | production # inventory file for production servers | 
使用galaxy创建roles目录结构及运作流程
| 1 | # 在roles目录下创建目录结构 | 
Ansible Roles依赖关系
roles允许你在使用roles时自动引入其他的roles。role依赖关系存储在roles目录中meta/main.yml文件中。
例如:推送wordpress并解压,前提条件,必须要安装nginx和php,把服务跑起来,才能运行wordpress的页面,此时我们就可以在wordpress的roles中定义依赖nginx和php的roles
| 1 | vim /etc/ansible/roles/wordpress/meta/main.yml | 
如果编写了meta目录下的main.yml文件,那么Ansible会自动先执行meta目录中main.yml文件中的dependencies文件,如上所示,就会先执行nginx和php的安装。
Ansible Roles示例
roles小技巧
- 创建roles目录结构,手动使用ansible-galaxy init test
- 编写roles功能
- 在playbook中引用
使用roles重构rsync
- 规划目录结构如下: - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24- # 创建roles目录并进入 
 mkdir /etc/ansible/roles/ && cd /etc/ansible/roles/
 # 创建rsync的roles层级目录
 ansible-galaxy init rsync
 # 查看层级目录
 tree
 .
 └── rsync
 ├── defaults
 │ └── main.yml
 ├── files
 ├── handlers
 │ └── main.yml
 ├── meta
 │ └── main.yml
 ├── README.md
 ├── tasks
 │ └── main.yml
 ├── templates
 ├── tests
 │ ├── inventory
 │ └── test.yml
 └── vars
 └── main.yml
- 定义roles主机清单 - 1 
 2
 3
 4- # 创建主机清单文件并定义主机池 
 vim /etc/ansible/roles/hosts
 [backup]
 172.16.1.41
- 指定backup主机组,执行那个roles - 1 
 2
 3
 4
 5- # 创建主yml文件,并定义执行动作 
 vim /etc/ansible/roles/site.yml
 - hosts: all
 roles:
 - {role: rsync,when: ansible_hostname == 'backup'}
- 查看rsync角色的tasks任务 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38- # 1.安装rsync 
 vim /etc/ansible/roles/rsync/tasks/install.yml
 - name: Install Rsync
 yum:
 name: rsync
 
 # 2.配置rsync
 vim /etc/ansible/roles/rsync/tasks/config.yml
 - name: Push Rsync Conf
 template:
 src: rsyncd.conf.j2
 dest: /etc/rsyncd.conf
 notify: Restart Rsync Server
 - name: Create Passwd File
 copy:
 content: "{{ rsync_user }}:{{ rsync_passwd }}"
 dest: "{{ rsync_passwd_file }}"
 mode: 0600
 - name: Create {{ backup_dir }}
 file:
 path: /{{ backup_dir }}
 state: directory
 owner: "{{ name }}"
 group: "{{ name }}"
 
 # 3.启动rsync
 vim /etc/ansible/roles/rsync/tasks/start.yml
 - name: Start Rsync
 service:
 name: rsyncd
 state: started
 enabled: yes
 
 # 4.将写完的tas文件包含到main.yml中
 vim /etc/ansible/roles/rsync/tasks/main.yml
 - include_tasks: install.yml
 - include_tasks: config.yml
 - include_tasks: start.yml
- 查看rsync角色的handlers - 1 
 2
 3
 4
 5
 6- # 创建handlers触发的重启动作 
 vim /etc/ansible/roles/rsync/handlers/main.yml
 - name: Restart Rsync Server
 service:
 name: rsyncd
 state: restarted
- 查看rsync角色的files目录 - 1 
 2
 3
 4- # 在files放入配置文件 
 ll /etc/ansible/roles/rsync/files/
 total 8
 -rw-r--r-- 1 root root 322 Nov 16 18:49 rsyncd.conf
- 查看rsync依赖 - 1 
 2
 3
 4
 5
 6
 7
 8
 9- # 创建rsync依赖文件并指向路径 
 vim /etc/ansible/roles/rsync/meta/main.yml
 dependencies:
 - {role: create_user}
 
 ## 此处省略编辑创建用户的playbook
 1)初始化一个create_user目录
 2)在tasks/main.yml中写入创建用户和组即可
 3)建议使用变量
- 执行roles - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18- # 使用-t指定执行测试rsync角色执行roles(site.yml) 
 ansible-playbook -i hosts -t rsync site.yml
 PLAY [backup] ********************************************************************************************
 
 TASK [Gathering Facts] ********************************************************************************
 ok: [172.16.1.41]
 
 TASK [backup : Install Rsync Server] ***********************************************************************
 ok: [172.16.1.41]
 
 TASK [backup : Configure Rsync Server] *********************************************************************
 ok: [172.16.1.41]
 
 TASK [backup : Start Rsync Server] *************************************************************************
 ok: [172.16.1.41]
 
 PLAY RECAP ********************************************************************************************
 172.16.1.41 : ok=5 changed=0 unreachable=0 failed=0
使用roles重构nfs
- 使用roles创建Nfs服务, 目录结构如下 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16- # 目录结构 
 tree /etc/ansible/roles
 ├── group_vars
 │ └── all
 ├── hosts
 ├── nfs
 │ ├── files
 │ ├── handlers
 │ │ └── main.yml
 │ ├── tasks
 │ │ └── main.yml
 │ ├── templates
 │ │ └── exports
 │ └── vars
 ├── site.yml
- 定义roles主机清单 - 1 
 2
 3
 4- # 创建主机清单文件并定义主机池 
 vim /etc/ansible/roles/hosts
 [nfs]
 172.16.1.31
- 指定nfs主机组,执行那个roles - 1 
 2
 3
 4
 5
 6
 7- # 创建主yml文件,并定义执行动作 
 vim /etc/ansible/roles/site.yml
 - hosts: nfs
 remote_user: root
 roles:
 - nfs
 tags: nfs
- 查看nfs角色的tasks任务 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26- # 创建task任务文件 
 vim /etc/ansible/roles/nfs/tasks/main.yml
 - name: Install Nfs-Server
 yum:
 name:nfs-utils
 state: present
 
 - name: Configure Nfs-Server
 template:
 src: exports
 dest: /etc/exports
 notify: Restart Nfs-Server
 
 - name: Create Directory Data
 file:
 path: {{ share_dir }}
 state: directory
 owner: www
 group: www
 mode: 0755
 
 - name: Start Nfs-Server
 systemd:
 name: nfs
 state: started
 enabled: yes
- 查看nfs角色的handlers - 1 
 2
 3
 4
 5
 6- # 创建handlers触发任务 
 vim /etc/ansible/roles/nfs/handlers/main.yml
 - name: Restart Nfs-Server
 systemd:
 name: nfs
 state: restarted
- 查看rsync角色的files目录 - 1 
 2
 3- # 创建nfs的变量配置文件并存入templates目录下 
 vim /etc/ansible/roles/nfs/templates/exports
 {{ share_dir }} {{ share_ip }}(rw,sync,all_squash,anonuid=666,anongid=666)
- nfs对应的变量定义 - 1 
 2
 3
 4
 5- # 创建组变量 
 vim /etc/ansible/roles/group_vars/all
 #nfs
 share_dir: /data
 share_ip: 172.16.1.31
- 执行roles - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21- # 使用-t指定执行nfs标签执行roles(site.yml) 
 ansible-playbook -i hosts -t nfs site.yml
 PLAY [nfs] ********************************************************************************************
 
 TASK [Gathering Facts] ********************************************************************************
 ok: [172.16.1.31]
 
 TASK [nfs : Install Nfs-Server] ***********************************************************************
 ok: [172.16.1.31]
 
 TASK [nfs : Configure Nfs-Server] *********************************************************************
 ok: [172.16.1.31]
 
 TASK [nfs : Create Directory Data] ********************************************************************
 ok: [172.16.1.31]
 
 TASK [nfs : Start Nfs-Server] *************************************************************************
 ok: [172.16.1.31]
 
 PLAY RECAP ********************************************************************************************
 172.16.1.31 : ok=5 changed=0 unreachable=0 failed=0
Ansible Galaxy
什么是Galaxy?
Galaxy是一个免费网站,类似于github网站,网站上基本都是共享roles,从Galaxy下载roles是最快启动项目方式之一。
Galaxy官方网站:TP
ansible提供了一个命令ansible-galaxy,可以用来对roles项目进行初始化,查找,安装,移除等操作
| 1 | # 语法结构 | 
Ansible vault(playbook加密)
| 1 | # 语法结构 | 




