Ansible 命令

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 命令的执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 查找主机清单中对应的主机或主机组
  3. 加载自己对应的模块文件,如:command
  4. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
    $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  5. 给文件+x执行
  6. 执行并返回结果
  7. 删除临时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
喜欢就支持一下吧
点赞0 分享