1、Ansible Ad-Hoc 介绍
Ansible Ad-Hoc 的执行方式的主要工具就是 ansible
特点:一次性的执行,不会保存执行命令信息,只适合临时性或测试性的任务
2、ansible 命令用法
ansible <host-pattern> [-m module_name] [-a args]
--version #显示版本
-m module #指定模块,默认为command
-v #详细过程 -vv -vvv更详细
--list-hosts #显示主机列表,可简写 --list
-C, --check #检查,并不执行
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER #执行远程执行的用户,默认root
-b, --become #代替旧版的sudo实现通过sudo机制实现提升权限
--become-user=USERNAME #指定sudo的runas用户,默认为root
-K, --ask-become-pass #提示输入sudo时的口令
-f FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数
-i INVENTORY, --inventory INVENTORY #指定主机清单文件
# 范例
#以test用户执行ping存活检测
ansible all -m ping -u test -k
#以test sudo至root执行ping存活检测
ansible all -m ping -u test -k -b
#以test sudo至mage用户执行ping存活检测
ansible all -m ping -u test -k -b --become-user=mage
#以test sudo至root用户执行ls
ansible all -m command -u test -a 'ls /root' -b --become-user=root -k -K
[root@ansible ~]# ansible all -m ping
192.168.1.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.13 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.11 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
# 并发执行控制
[root@ansible ~]# ansible all -a 'sleep 5' -f1
192.168.1.11 | CHANGED | rc=0 >>
192.168.1.12 | CHANGED | rc=0 >>
192.168.1.13 | CHANGED | rc=0 >>
[root@ansible ~]# ansible all -a 'sleep 5' -f10
192.168.1.12 | CHANGED | rc=0 >>
192.168.1.13 | CHANGED | rc=0 >>
192.168.1.11 | CHANGED | rc=0 >>
# 使用普能用户进行远程管理
# 在所有控制端和被控制端创建用户和密码
[root@ansible ~]# useradd devop
[root@ansible ~]# echo devop:123456 | chpasswd
# 在所有被控制端对用户sudo授权
[root@ansible ~]# visudo
devop ALL=(ALL) NOPASSWD: ALL
[root@ansible ~]# visudo -c
/etc/sudoers: parsed OK
# 实现从控制端到被控制端的基于key验证
[root@ansible ~]# su - devop
[devop@ansible ~]$ vim sshpass.sh
#!/bin/bash
IPLIST="
192.168.1.11
192.168.1.12
192.168.1.13"
[ -f /home/devop/.ssh/id_rsa ] || ssh-keygen -f /home/devop/.ssh/id_rsa -P ''
export SSHPASS=123456
for IP in $IPLIST;do
{ sshpass -e ssh-copy-id $IP; } &
done
wait
# 使用普通用户测试连接,默认连接权限不足失败
[devop@ansible ~]$ ansible 192.168.1.12 -m shell -a 'ls /root'
192.168.1.12 | FAILED | rc=2 >>
ls: cannot open directory /root: Permission deniednon-zero return code
# 使用普通用户通过-b选项连接实现sudo提权后连接成功
[devop@ansible ~]$ ansible 192.168.1.12 -m shell -a 'ls /root' -b --become-user root
192.168.1.12 | CHANGED | rc=0 >>
anaconda-ks.cfg
# 修改配置文件指定sudo机制
[root@ansible ~]#vim /etc/ansible/ansible.cfg
#取消下面行前面的注释
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
# 再次测试
[devop@ansible ~]$ ansible 192.168.1.12 -m shell -a 'ls /root'
192.168.1.12 | CHANGED | rc=0 >>
anaconda-ks.cfg
ansible的Host-pattern
用于匹配被控制的主机的列表
All :表示所有Inventory中的所有主机
ansible all -m ping
*:通配符
ansible "*" -m ping
ansible 192.168.1.* -m ping
ansible "srvs" -m ping
ansible "192.168.1.12 192.168.1.13" -m ping
或关系
ansible "websrvs:appsrvs" -m ping
ansible "192.168.1.10:192.168.1.20" -m ping
逻辑与
# 在websrvs组并且在dbsrvs组中的主机
ansible "websrvs:&dbsrvs" -m ping
逻辑非
# 在所有主机,但不在websrvs组和dbsrvs组中的主机
# 注意:此处为单引号
ansible 'all:!dbsrvs:!websrvs' -m ping
综合逻辑
ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping
正则表达式
ansible "websrvs:dbsrvs" -m ping
ansible "~(web|db).*\.test\.com" -m ping
# 范例
[root@ansible ~]# ansible all --list-hosts
hosts (3):
10.0.0.6
10.0.0.7
10.0.0.8
[root@ansible ~]# ansible websrvs --list-hosts
hosts (3):
10.0.0.6
10.0.0.7
10.0.0.8
[root@ansible ~]# ansible appsrvs --list-hosts
hosts (2):
10.0.0.7
10.0.0.8
[root@ansible ~]# ansible "appsrvs:dbsrvs" --list-hosts
hosts (3):
10.0.0.7
10.0.0.8
10.0.0.6
[root@ansible ~]# ansible "dbsrvs" --list-hosts
hosts (2):
10.0.0.6
10.0.0.7
[root@ansible ~]# ansible appsrvs --list-hosts
hosts (2):
10.0.0.7
10.0.0.8
[root@ansible ~]# ansible "appsrvs:dbsrvs" --list-hosts
hosts (3):
10.0.0.7
10.0.0.8
10.0.0.6
[root@ansible ~]# ansible "appsrvs:&dbsrvs" --list-hosts
hosts (1):
10.0.0.7
# 引用!号时,不要用双引号,而使用单引号
[root@ansible ~]# ansible "appsrvs:!dbsrvs" --list-hosts
-bash: !dbsrvs: event not found
[root@ansible ~]# ansible 'appsrvs:!dbsrvs' --list-hosts
hosts (1):
10.0.0.8
ansible 命令的执行过程
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg
- 查找主机清单中对应的主机或主机组
- 加载自己对应的模块文件,如:command
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 - 给文件+x执行
- 执行并返回结果
- 删除临时py文件,退出
ansible 命令的执行状态
- 绿色:执行成功并且对目标主机不需要做改变的操作
- 黄色:执行成功并且对目标主机做变更
- 红色:执行失败
3、ansible-console
此工具可交互执行命令,支持tab,ansible 2.0+新增
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
- 设置并发数: forks n 例如: forks 10
- 切换组: cd 主机组 例如: cd web
- 列出当前组主机列表: list
- 列出所有的内置命令: ?或help
[root@ansible ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
root@all (3)[f:5]# ping
192.168.1.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.13 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.11 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
root@all (3)[f:5]# list
192.168.1.11
192.168.1.12
192.168.1.13
4、ansible-playbook
此工具用于执行编写好的 playbook 任务
ansible-playbook hello.yml
cat hello.yml
---
#hello world yml file
- hosts: websrvs
remote_user: root
gather_facts: no
tasks:
- name: hello world
command: /usr/bin/wall hello world
5、ansible-vault
此工具可以用于加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml #加密
ansible-vault decrypt hello.yml #解密
ansible-vault view hello.yml #查看
ansible-vault edit hello.yml #编辑加密文件
ansible-vault rekey hello.yml #修改口令
ansible-vault create new.yml #创建新文件
# 执行加密的playbook,交互式输入密码
chmod 600 hello.yml
ansible-playbook --ask-vault-pass hello.yml
# 从pass.txt文件中读取密码
ansible-playbook --vault-password-file pass.txt hello.yml
# 从配置文件中取得密码
# vi /etc/ansible/ansible.cfg
[defaults]
ault-password-file=pass.txt
# 可以直接执行加密文件
ansible-playbook hello.yml
6、ansible-galaxy
Galaxy 是一个免费网站, 类似于github网站, 网站上发布了很多的共享的roles角色。
Ansible 提供了ansible-galaxy命令行工具连接 https://galaxy.ansible.com 网站下载相应的roles, 进行
init(初始化、search( 查拘、install(安装、 remove(移除)等操作。
# 搜索项目
[root@ansible ~]#ansible-galaxy search lamp
# 列出所有已安装的galaxy
ansible-galaxy list
# 安装galaxy,默认下载到~/.ansible/roles下
ansible-galaxy install geerlingguy.mysql
ansible-galaxy install geerlingguy.redis
# 删除galaxy
ansible-galaxy remove geerlingguy.redis
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END