任务块
- 可以通过block关键字,将多个任务组合到一起
- 可以将整个block任务组,一起控制是否要执行
# 如果webservers组中的主机系统发行版是Rocky,则安装并启动nginx
[root@pubserver ansible]# vim block1.yml
---
- name: block tasks
hosts: webservers
tasks:
- name: define a group of tasks
block:
- name: install nginx # 通过yum安装nginx
yum:
name: nginx
state: present
- name: start nginx # 通过service启动nginx服务
service:
name: nginx
state: started
enabled: yes
when: ansible_distribution=="Rocky" # 条件为真才会执行上面的任务
rescue和always
lock和rescue、always联合使用:
- block中的任务都成功,rescue中的任务不执行
- block中的任务出现失败(failed),rescue中的任务执行
- block中的任务不管怎么样,always中的任务总是执行
loop循环
- 相当于shell中for循环
- ansible中循环用到的变量名是固定的,叫item
role角色
# 创建角色
# 1. 声明角色存放的位置
[root@pubserver ansible]# vim ansible.cfg
[defaults]
inventory = hosts
roles_path = roles # 定义角色存在当前目录的roles子目录中
# 2. 创建角色目录
[root@pubserver ansible]# mkdir roles
# 3. 创建名为motd的角色
[root@pubserver ansible]# ansible-galaxy init roles/motd
[root@pubserver ansible]# ls roles/ motd # 生成了motd角色目录
ansible加解密文件
[root@pubserver ansible]# echo "tedu.cn" > pass.txt
[root@pubserver ansible]# echo "hello wrord" > data.txt
[root@pubserver ansible]# ansible-vault encrypt data.txt --vault-id pass.txt 加密
Encryption successful
[root@pubserver ansible]# ansible-vault decrypt data.txt --vault-id pass.txt 解密
- 使用ansible管理远程主机,存储敏感数据时(如,文件中包含密码),应该将其加密
- 执行playbook时,通过
--ask-vault-password
选项提示输入密码 - ansible-vault encrypt test02.yml
ansible-playbook test02.yml
ansible-playbook test02.yml --ask-vault-password
echo 123 > 123.txt
ansible-playbook test02.yml --vault-id 123.txt
sudo命令
特殊的主机清单变量
- 如果远程主机没有使用免密登陆,如果远程主机ssh不是标准的22端口,可以设置特殊的主机清单变量
ansible_ssh_user
:指定登陆远程主机的用户名ansible_ssh_pass
:指定登陆远程主机的密码ansible_ssh_port
:指定登陆远程主机的端口号
删除远程主机的/root/.ssh/authorized_keys,以便恢复通过密码登陆
# 修改web1 ssh服务的端口为220
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# echo 'Port 220' >> /etc/ssh/sshd_config
[root@web1 ~]# systemctl restart sshd
# 退出再登陆时,需要指定端口号
[root@myhost ~]# ssh -p220 192.168.88.11
# 配置ssh通过用户名、密码管理远程主机,通过220端口连接web1
[root@pubserver myansible]# vim inventory
[group1]
web1 ansible_ssh_user=root ansible_ssh_pass=a ansible_ssh_port=220
web2 ansible_ssh_user=root ansible_ssh_pass=a
db1 ansible_ssh_user=root ansible_ssh_pass=a