马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
#### 一、Ansible增补模块
try () {
} catch () {
} finally
等同于
block () {
} rescue () {
} always
##### 使命块
- block使命块
- 通过block关键字,将多个使命组合到一起
- 将整个block使命组,一起控制是否要实行
```shell
# 判断webservers主机组内主机体系发行版为Rocky的主机,安装nginx并启动服务
- name: block tasks
hosts: webservers
tasks:
- name: group tasks
block:
- name: install nginx
yum:
name: nginx
state: present
- name: start nginx
service:
name: nginx
state: started
enabled: true
when: ansible_distribution == "Rocky" #条件作用与整组使命
```
- rescue和always
- 用于增补block使命
- block中的使命都实行乐成则rescue中的使命不实行
- block中的使命出现失败则实行rescue中的使命
- always中的使命总会实行
```shell
# 测试block使命实行乐成
- name: test block/rescue/always
hosts: webservers
tasks:
- name: test
block:
- name: touch file1
file:
path: /tmp/test1.txt
state: touch
rescue:
- name: touch file2
file:
path: /tmp/test2.txt
state: touch
always:
- name: touch file3
file:
path: /tmp/test3.txt
state: touch
```
##### loop循环
- 批量数值载入变量时使用loop循环,等同于for循环
- 特点是loop中的变量名固定为:item
```shell
## 变量界说方法
简单变量:单个元素赋值给item
loop: [a,b,c,d]
#或
loop:
- a
- b
- c
复杂变量:团体赋值给item,可以用item.key获取指定value
loop:
- {"key": "value", "key": "value"}
- name: create dir
hosts: webservers
tasks:
- name: create dir with loop
file:
path: /tmp/{{item}}
state: directory
loop:
- aa
- bb
- cc
- name: create users
hosts: webservers
tasks:
- name: create user with loop
user:
name: "{{item.iname}}"
password: "{{item.ipass|password_hash('sha512')}}"
state: present
loop:
- {"iname":"test01", "ipass":"123456"}
- {"iname":"test02", "ipass":"654321"}
```
#### 二、Ansible脚色
> playbook范围在于大量文件无法管理的情况,编写后的大量Playbook文件以及调用文件,云云海量、无序的文件只有使用"脚色"管理yml文件
- roles是ansible自1.2版本引入的新特性,用于条理性、布局化地构造playbook
- roles可以大概根据条理型布局自动装载变量文件、tasks以及handlers等
- 要使用roles只须要在playbook中使用include指令引入即可
- roles分别将变量、文件、使命、模板及处理处罚器放置于单独的目次中,并可以便捷的include
- roles一样平常用于基于主机构建服务的场景中,但也可以是用于构建守卫进程等场景中
<img src="19901269-0375cab5a41cada6.jpeg" style="zoom:50%;" />
```shell
roles: #脚色必须放在roles目次下,可以自界说位置,默认/etc/ansible/roles/
project: #脚色项目名称
files: #用于存放静态文件,如copy或script模块须要调用的文件
templates: #用于存放动态文件,即jinja2模板,template模块会自动到此目次下探求模板文件
tasks: #界说使命列表的地方
main.yml #使命列表内容编写在此文件中
handlers: #界说触发器的地方
main.yml #触发器内容编写在此文件中
vars: #界说变量的地方(优先级高)
main.yml #变量界说在此文件中
defaults: #界说变量缺省值的地方(优先级低)
main.yml
meta: #界说作者、版本等形貌信息、依靠关系等
main.yml
README.md #整个脚色的形貌信息
```
##### Roles使用方法
```shell
# 修改ansible.cfg设置文件
[defaults]
inventory = inventory
host_key_checking = false
module_name = shell
nocows = true
roles_path = ./roles
# 查察现有脚色
ansible-galaxy list
# 创建脚色
ansible-galaxy init roles/motd
## 设置脚色三部曲
# 在templates目次下---创建模板文件
vim roles/motd/templates/motd.j2
Hostname: "{{ansible_hostname}}"
Date: "{{ansible_date_time.date}}"
Contact to: "{{admin}}"
# 在vars目次下---创建变量
vim roles/motd/vars/main.yml
---
# vars file for roles/motd
admin: "test@tedu.cn"
# 在tasks目次下---创建使命
vim roles/motd/tasks/main.yml
## 使用脚色
vim role_motd.yml
- name: modify motd with role
hosts: webservers
roles:
- motd
ansible-playbook role_motd.yml
```
##### Roles训练
```shell
## 创建一个脚色用于安装指定软件
# 创建脚色
ansible-galaxy init roles/pkgs
## 设置脚色三部曲
# 创建模板文件、创建变量文件、创建使命文件
vim roles/pkgs/tasks/main.yml
- name: install pkg
yum:
name: "{{pkg}}"
state: present
vim roles/pkgs/defaults/main.yml
pkg: nginx
```
#### 三、Ansible加密解密文件
#### ansible-vault下令
> 该下令用于实现数据加密/解密
```shell
## 常用选项
encrypt:加密
decrypt:解密
view:查察
rekey:重置暗码
# 加密文件
ansible-vault encrypt hello.txt
# 解密文件
ansible-vault decrypt hello.txt
# 重置暗码
ansible-vault rekey hello.txt
# 不解密文件查察内容
ansible-vault view hello.txt
# 使用暗码文件
ansible-vault encrypt --vault-password-file=pass.txt data.txt #pass对data文件加密
ansible-vault decrypt --vault-password-file=pass.txt data.txt #pass对data文件解密
ansible-vault view --vault-password-file=pass.txt data.txt #不解密查察文件内容
# 加密脚本
ansible-vault encrypt user_test.yml
# 实行加密脚本
ansible-playbook --ask-vault-password user_test.yml
```
#### 四、sudo提权
##### sudo提权测试
sudo提权设置文件:/etc/sudoers
- 修改授权方法
- visudo(带语法查抄,默认没有颜色提示)
- vim /etc/sudoers(不带语法查抄,默认有颜色提示)
- 授权格式
```
用户名或组名(%groupname) 在会集认证域中有效,单机忽略 可以实行的下令列表
用户/组 ALL=(ALL) NOPASSWD: ALL
```
##### Ansible设置sudo提权
```shell
# 被控节点创建用户并设置sudo提权
- name: sudo user
hosts: all
tasks:
- name: create sudo user
user:
name: alice
password: "{{'123456'|password_hash('sha512')}}"
state: present
- name: config sudo
lineinfile:
path: /etc/sudoers
line: "alice ALL=(ALL) NOPASSWD: ALL"
state: present
# 修改ansible设置文件
[root@pubserver ansible]# vim ansible.cfg
[defaults]
...
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
```
#### 五、特殊的主机清单变量
> 如某个被控节点不能免密登录、ssh服务端口不是标准22端口等情况,则须要设置特殊的主机清单变量
```shell
## 常用设置
ansible_ssh_host:指定被控节点服务器IP所在
ansible_ssh_user:指定登岸远程主机的用户名
ansible_ssh_pass:指定登岸远程主机的暗码
ansible_ssh_port:指定登岸远程主机的端标语
# 设置特殊的主机清单变量
vim inventory
[group]
web1
web2
db1 ansible_ssh_host=192.168.88.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass=a
```
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |