Ansible自动化运维工具--roles角色

定义roles

角色(roles) 用于层次性,结构化地组织playbook。
roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。 
roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。
角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。

让playbook变得更有层次感
默认角色目录 /etc/ansible/roles
用来控制角色:ansible-galaxy
查看相关命令:ansible-galaxy --help
初始化:ansible-galaxy -init  apache
roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,
使用roles的过程也可以认为是目录规范化命名的过程。
roles每个目录下均由main.yml定义该功能的任务集,
tasks/main.yml默认执行所有定义的任务;
roles目录建议放在ansible.cfg中”roles_path”定义的目录下。
要关闭三个节点的防火墙
ansible all -a "systemctl stop firewalld"

在这里插入图片描述

pwd
/home/devops/ansible

1:创建角色

mkdir roles
在这里插入图片描述
vim ansible.cfg
3 roles_path = ./roles ##在当前路径读取文件
在这里插入图片描述
ll
在这里插入图片描述
cd roles/
ansible-galaxy init apache

cd …
ansible-galaxy list ##如果查看失败,可能和roles/或者ansible/权限有关系
在这里插入图片描述

2:安装树状形方便查看

cd roles/apache/
sudo yum install -y tree
在这里插入图片描述
tree .

一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用
.
├── defaults   ##为当前角色定义默认变量时使用此目录
│   └── main.yml  ##主文件
├── files       ##存放静态文件
├── handlers    ##触发器,经常和notify搭配使用,当文件、进程及返回状态发生变化时,notify通过handlers做响应的变更
│   └── main.yml
├── meta        ##定义此角色的特殊设定及其依赖关系
│   └── main.yml
├── README.md
├── tasks  ##存放ansible执行的任务,顶格写
│   └── main.yml  ##main.yml为主函数,用于导入需要执行的任务
├── templates ##存放的是".j2"格式的文件模板,动态文件,文件中可以写变量
└── vars      ##定义当前roles执行时使用的变量
    └── main.yml

在这里插入图片描述

ansible roles的执行方法:
roles的执行方法同ansible-playbook执行方法一样,需要调用roles的调用文件
 
pwd
/home/devops/ansible/roles/apache
rm -fr tests/  ##删除,不需要
ll

在这里插入图片描述

3:编写角色下的各个文件

(1)编辑静态文件(便于访问):

vim files/index.html
www.westos.org
在这里插入图片描述
(2)编辑触发器:

vim handlers/main.yml

---
- name: restart httpd   
  service:
      name: httpd
      state: restarted 

在这里插入图片描述
(3)编辑任务: vim tasks/main.yml

---
- name: install apache   
  yum:
    name: httpd
    state: present

- name: config   
  template:
    src: httpd.conf.j2
    dest: /etc/httpd/conf/httpd.conf
  notify: restart httpd

- name: start apache
  service:
    name: httpd
    state: started

- name: copy index.html
  copy:
    src: index.html
    dest: /var/www/html/index.html 

在这里插入图片描述
(4)scp server3:/etc/httpd/conf/httpd.conf templates/
ls templates/
mv templates/httpd.conf templates/httpd.conf.j2
编辑文件:
vim templates/httpd.conf.j2
42 Listen {{ http_host }}:{{ http_port }}
##监听变量文件中http_host和http_port对应的变量
在这里插入图片描述
vim templates/httpd.conf.j2
在这里插入图片描述
(5)编辑变量文件:

vim vars/main.yml

--- 
http_host: "{{ ansible_hostname }}"  ##所有主机名 
http_port: 80  ##80端口

在这里插入图片描述
4:开始调用
cd /home/devops/ansible

编写主文件来调用角色的文件:
vim apache.yml

---
- hosts: web
  roles:
    - apache 

在这里插入图片描述
cat hosts
在这里插入图片描述
ansible-playbook apache.yml
在这里插入图片描述
访问测试: curl 172.25.78.3
在这里插入图片描述

判断主文件和角色文件的优先级:
以端口为例子:

主文件中加端口8080
vim apache.yml

---
- hosts: web
  vars:
    - http_port: 8080
  roles:
    - apache

在这里插入图片描述
ansible-playbook apache.yml
在这里插入图片描述
curl 172.25.78.3
curl 172.25.78.3:8080
##优先调用了角色中的文件
在这里插入图片描述

在角色文件中不定义,在playbook中定义

vim roles/apache/vars/main.yml
#http_port: 80 ##注释,不让其调用
在这里插入图片描述
cat apache.yml ##8080端口
在这里插入图片描述
ansible-playbook apache.yml
在这里插入图片描述
curl 172.25.78.3:8080
在这里插入图片描述
则结果显示:角色优先级高

获取主机信息:

1:vim hosts

[db]
172.25.78.1

[server]
172.25.78.2

[web]
172.25.78.3

在这里插入图片描述
2:命令采集

setup:采集主机信息
ansible db -m setup | grep ansible_hostname ##采集db组主机名
ansible db -m setup | grep ipv4
##采集ip ansible_all_ipv4_addresses ##取出的值为列表,需要切片
在这里插入图片描述
3:文件采集: 在主文件中写入变量

vim roles/apache/templates/httpd.conf.j2
42 Listen 172.25.78.3:80
在这里插入图片描述
vim apache.yml

---
- hosts: web
  vars:
    - http_port: 80
    - http_host: "{{ ansible_all_ipv4_addresses[-1] }}"  ##采集并切片
  roles:
    - apache

ansible-playbook apache.yml 

在这里插入图片描述
在这里插入图片描述
ansible db -m setup | less (ipv4为字典形式)
在这里插入图片描述
vim apache.yml

  1 ---   
  2 - hosts: web   
  3   vars:   
  4     - http_port: 80   
  5     - http_host: "{{ ansible_facts['default_ipv4']['address'] }}"  ##注意以字典形式采集的格式   
  6   roles:
  7     - apache

ansible_facts ##默认以这个开始,标准写法
在这里插入图片描述
ansible-playbook apache.yml
注意!!!
模版里面可以不加"" tasks里面:必须加""
在这里插入图片描述

##以下所有的信息都可以通过
ansible db -m setup | less 查看
在这里插入图片描述
在这里插入图片描述
vim info.j2

主机名: "{{ ansible_facts['hostname'] }}"
主机ip: "{{ ansible_facts['default_ipv4']['address'] }}"
主机网关: "{{ ansible_facts['default_ipv4']['gateway'] }}" 
主机dns: "{{ ansible_facts['dns']['nameservers'][-1] }}" 
系统空闲内存: "{{ ansible_facts['memfree_mb'] }}"MB 
系统磁盘空间: "{{ ansible_facts['devices']['dm-0']['size'] }}"  ##dm-0:根分区 
系统内核: "{{ ansible_facts['kernel'] }}" 
系统版本: "{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_version'] }}"

在这里插入图片描述
vim test.yml

---
- hosts: all
  tasks:
    - name: create /tmp/info
      template:
        src: info.j2
        dest: /tmp/info 

在这里插入图片描述
pwd /home/devops/ansible
ls
ansible-playbook test.yml
在这里插入图片描述
cat /tmp/info ## 查看获取的主机信息
在这里插入图片描述

ansible之条件语句

ignore_errors: True ##忽略错误,表示无论结果怎么样都忽略,以至于不会影响以下的操作
register:result ###注册结果变量
根据返回直做不一样的判断

动态注册变量

cat hosts
在这里插入图片描述
pwd
/home/devops/ansible

when语句:

vim apache.yml

hosts: all
  vars:
    - http_port: 80
    - http_host: "{{ ansible_facts['default_ipv4']['address'] }}"
  roles:
    - role: apache
      when: ansible_hostname == "server3"  ##即当主机名为server3的时候,才会执行

ansible-playbook apache.yml 

在这里插入图片描述
在这里插入图片描述

1:批量添加用户:用到循环语句loop

vim user.yml

---
- hosts: db
  tasks:
    - name: create users
      user:
        name: "{{ item }}"
        state: present
      loop:
        - user1
        - user2
        - user3
ansible-playbook user.yml 
cat /etc/passwd  ##查看用户

在这里插入图片描述
在这里插入图片描述
cat /etc/passwd
在这里插入图片描述
2:给用户加密码

vim user.yml
---
- hosts: db
  tasks:
    - name: create users
      user:
        name: "{{ item }}"
        state: present
        password: "{{ 'westos' | password_hash('sha512') }}"  
      loop:
        - user1
        - user2
        - user3
##sha512是Hash函数
ansible-playbook user.yml     

在这里插入图片描述
在这里插入图片描述

测试登陆user1:
su - user1
exit
在这里插入图片描述
查看密码: sudo cat /etc/shadow
在这里插入图片描述

3:给每个用户设置不同的密码

vim hosts
---
- hosts: db
  tasks:
    - name: create users
      user:
        name: "{{ item.user}}"  ##匹配user后的所有用户
        state: present
        password: "{{ item.pass | password_hash('sha512') }}"  ##匹配pass后的所有密码
      loop:
        - { user: user1, pass: westos }
        - { user: user2, pass: redhat }
        - { user: user3, pass: linux }
ansible-playbook user.yml 
测试登陆用户:
su - user2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4:把密码和用户单独的写在静态文件里面,并调用这个文件

(1):

vim userlist.yml 
---
userlist:
 - user: user1
   pass: westos
 - user: user2
   pass: redhat
 - user: user3
   pass: linux 

在这里插入图片描述

(2):

vim user.yml 

---
- hosts: db
  vars_files:
    - userlist.yml
  tasks:
  - name: create users
  user:
    name: "{{ item.user }}"
    state: present
    password: "{{ item.pass | password_hash('sha512') }}"
  loop: "{{ userlist }}"  ##调用userlist.yml文件 

ls 
ansible-playbook   user.yml

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

用ansible-vault加密/解密

 
ansible通过命令行ansible-vault给目标文件/字符串进行加密。
在执行playbook时,通过指定相应参数来给目标文件解密,从而实现ansible vault的功能。
ansible-vault --help
create(创建新)
decrypt(解密)
edit(编辑加密文件
encrypt(加密)
rekey(修改口令)
view(查看)
options(选项)

在这里插入图片描述

上一个添加用户还是存在一定的安全隐患,
那么需要将userlist.yml这个文件进行加密,
使得查看这个文件的时候,看到的不是用户和密码,而是加密过的

pwd
ls
在这里插入图片描述
(1)加密
ansible-vault encrypt userlist.yml
输入密码:redhat
cat userlist.yml ##加密后的文件
在这里插入图片描述
(2)查看文件,需要输入密码才能看到
ansible-vault view userlist.yml
在这里插入图片描述
(3)编辑文件
ansible-vault edit userlist.yml 再次添加用户
在这里插入图片描述

  • user: user4
    pass: ansible
    在这里插入图片描述
    重新推:
    ansible-playbook user.yml --ask-vault-pass ##提示输入密码
    在这里插入图片描述
    (4)给user.yml加密:(密码redhat)
    注意!!!!!!!两个文件的密码保持一致userlist.yml users.yml
    加密:
    ansible-vault encrypt user.yml
    在这里插入图片描述
    (5)解密
    ansible-vault decrypt user.yml
    cat user.yml ##看到解密后的文件
    在这里插入图片描述

批量的在各个节点添加解析

cat /etc/hosts
在这里插入图片描述

vim hosts
[db]
172.25.78.1

[server]
172.25.78.2

[web]
172.25.78.3

[zabbix:children]
db
server
web

在这里插入图片描述

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.78.250 foundation78.ilt.example.com

{% for host in groups['zabbix'] %}
{{ hostvars[host]['ansible_facts']['eth0']['ipv4']['address'] }} {{ hostvars[host]['ansible_facts']['hostname'] }}
{% endfor %}

在这里插入图片描述

vim test.yml

---
- hosts: all
  tasks:
    - name: update /etc/hosts
      template:
        src: etc.j2
        dest: /etc/hosts

在这里插入图片描述
ansible-playbook test.yml
在这里插入图片描述
pwd
ls
在这里插入图片描述
查看更新后的文件
cat /etc/hosts
在这里插入图片描述

block语句

写一个简单的block.yml
在这里插入图片描述
强制让文件在运行的时候出一个错误,然后继续运行。
在这里插入图片描述

利用ansible工具分区

在写yml文件之前,需要考虑分区遇到的问题
如果主机上没有/dev/vdb1进行分区,那就进行分区,分好区后需要进行格式化,还需要挂载

在这里插入图片描述

ansible-doc parted ##查看分区需要的系统参数
在这里插入图片描述
ansible-doc filesystem 查看格式化参数
在这里插入图片描述
ansible-doc mount 查看挂载参数
在这里插入图片描述

没有设备的话需要先添加设备再进行分区
sudo fdisk -l
在这里插入图片描述
(1)分区
在这里插入图片描述

vim fdisk.yml 
  1 ---
  2 - hosts: db
  3   tasks:
  4     - name: Create a new primary partition with a size of 512M
  5       parted:   ##划分出大小为512的分区
  6         device: /dev/sdb   ##在这个磁盘上划分
  7         number: 1   ##个数为一个
  8         state: present
  9 
 

ansible-playbook fdisk.yml 
sudo fdisk /dev/sdb  ##查看划分的分区

cat /proc/partitions 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)格式化挂载

vim fdisk.yml 
在(1)文件基础上加
 10     - name: Create a ext4 filesystem on /dev/sdb1  
 11       filesystem:    ##格式化
 12         fstype: ext4  ##文件系统类型
 13         dev: /dev/sdb1  ##文件系统名称
 14 
 15     - name: Mount up device  #挂载
 16       mount:
 17         path: /media  ##挂载地
 18         src: /dev/sdb1
 19         fstype: ext4
 20         opts: noatime
 21         state: present
ansible-playbook fdisk.yml 
查看是否挂载成功
df  

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3)加入调试,判断是否存在设备

vim fdisk.yml
  1 ---
  2 - hosts: db
  3   vars:
  4     - devpath: /dev/sdb
  5   tasks:
  6     - debug:
  7         msg: " /dev/sdb not exists"   ##若不存在,则报出此内容
  8       when: devpath is not exists

 ansible-playbook fdisk.yml 

在这里插入图片描述
在这里插入图片描述

block:正常要执行的内容

rescue:当block出错的时候要做

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值