定义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/ansible1:创建角色
mkdir roles
vim ansible.cfg
3 roles_path = ./roles ##在当前路径读取文件
ll
cd roles/
ansible-galaxy init apachecd …
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.yml1 --- 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出错的时候要做