1 ansible命令执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 加载自己对应的模块文件,如command
  3. 通过ansible将模块命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件
  4. 给文件+x执行
  5. 执行并返回结果
  6. 删除临时py文件,sleep 0退出

ansible 的执行状态

root@ubuntu20:~# grep -A 14 '\[colors\]' /etc/ansible/ansible.cfg
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan

root@ubuntu20:~#
  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功并且对目标主机做变更
  • 红色:执行失败

2 ansible系列命令

header 1

header 2

/usr/bin/ansible

主程序,临时命令执行工具

/usr/bin/ansible-doc

查看配置文档,模块功能查看工具,相当于man

/usr/bin/ansible-playbook

定制自动化任务,编排剧本工具,相当于脚本

/usr/bin/ansible-galaxy

下载/上传优秀代码或Roles模块的官网平台

/usr/bin/ansible-pull

远程执行命令的工具

/usr/bin/ansible-vault

文件加密工具

/usr/bin/ansible-console

基于Console界面与用户交互的执行工具

/usr/bin/ansible-config

查看,编辑管理ansible的配置文件

/usr/bin/ansible-inventory

查看被控制端主机清单的详细信息

利用ansible实现管理的主要方式

  • Ansible Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
  • Ansible playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程

ansible 使用前准备

ansible 相关工具大多数是通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能

建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点

2.1 ansible(ansible命令在主要是与模块联动使用的)

ansible通过ssh实现配置管理,应用部署,任务指定等功能,建议配置ansible端能基于秘钥认证的方式联系各被管理节点

Ansible Ad-Hoc 的执行方式的主要工具就是 ansible

格式

ansible <host-pattern> [-m module_name] [-a args]

选项

header 1

header 2

-a

指定模块的参数

–version

显示版本

-f FORKS, --forks FORKS

fork多少进程并发处理,默认为5个

-m module

指定使用的模块,默认为command

-v

查看执行的详细过程(-vv、-vvv更详细)

-i

指定hosts文件路径,默认:/etc/ansible/hosts

-I

指定pattern,对已匹配的主机中再过滤一次

–list-hosts

显示主机列表(可以简写为–list)

如:ansible all --list

-k,–ask-pass

提示输入ssh连接密码,默认使用key验证

-K,–ask-become-pass

提示执行输入sudo的密码

-C,–check

检查,并不执行

-c

设置连接类型(default=smart)

-T,–timeout=TIMEOUT

执行命令的超时时间,默认10s

-t

日志输出到该目录,日志文件名以主机命名

-u,–user=REMOTE_USER

指定远程执行的执行用户,若不指定用户,则使用当前用户身份

-U

sudo到哪个用户,默认为root

-b,–become

代替旧版本的sudo切换

–become-user=USERNAME

指定sudo的runas用户,默认为root

-h,–help

显示帮助信息

-s

sudo运行

-o

压缩输出,摘要输出

示例

# vim加颜色
echo export EDITOR=vim >> /etc/profile.d/env.sh
source /etc/profile.d/env.sh

示例

# 增加sudo权限
visudo
%wheel ALL=(ALL) NOPASSWD:ALL

#将op_biz加入wheel组中,且保持原来的主组权限
usermod -aG wheel op_biz
ansible dbserv -m command -a 'ls /root' -u op_biz -k -b

# 基于key验证
ssh-keygen
ssh-copy-id 10.134.115.56
ansible all -m ping

Ansible的Host-Pattern

用于匹配被控制的主机的列表

ALL:表示所有Inventory中的所有主机

示例:

ansible all -m ping

*:通配符

ansible "*" -m ping
ansible 192.168.1.* -m ping
ansible "*srvs" -m ping
ansible "10.0.0.11 10.0.0.12" -m ping

或关系

ansible "web:app" -m ping
ansible "192.168.1.10:192.168.1.20" -m ping
ansible "web:app" --list-hosts

逻辑与

# 在web组并且在db组中的主机
ansible "web:&db" -m ping

逻辑非

# 在web组,但不在db组中的主机
# 注意此处为单引号
ansible 'web:!db' -m ping

综合逻辑

ansible 'web:db:&app:!ftp' -m ping

正则表达式

ansible "web:&db" -m ping
ansible "~(web|db)srvs" -m ping
ansible "~(web|db).*\.test\.com" -m ping

示例:包含kube和etcd并且不包含本机(10.0.0.11)的机器都执行重启操作

ansible 'kube*:etcd:!10.0.0.11' -a reboot && reboot

示例

root@ubuntu20:~# cat /etc/ansible/hosts
[web]
10.0.0.15
10.0.0.11
[db]
10.0.0.15
10.0.0.16
[app]
10.0.0.11
10.0.0.12
root@ubuntu20:~# ansible all  --list-hosts
  hosts (4):
    10.0.0.15
    10.0.0.11
    10.0.0.16
    10.0.0.12
root@ubuntu20:~# ansible web  --list-hosts
  hosts (2):
    10.0.0.15
    10.0.0.11
root@ubuntu20:~# ansible app  --list-hosts
  hosts (2):
    10.0.0.11
    10.0.0.12
root@ubuntu20:~#
root@ubuntu20:~# ansible "app:web"  --list-hosts
  hosts (3):
    10.0.0.11
    10.0.0.12
    10.0.0.15
root@ubuntu20:~# ansible "app:&web"  --list-hosts
  hosts (1):
    10.0.0.11
root@ubuntu20:~#

# 引用!号时,不要用双引号,而使用单引号
root@ubuntu20:~# ansible "app:!db"  --list-hosts
-bash: !db: event not found
root@ubuntu20:~# ansible 'app:!db'  --list-hosts
  hosts (2):
    10.0.0.11
    10.0.0.12
root@ubuntu20:~#

示例:并发执行控制

# 分别执行下面两条命令观察结果
root@ubuntu20:~# ansible web -a 'sleep 3' -f10
10.0.0.11 | CHANGED | rc=0 >>

10.0.0.15 | CHANGED | rc=0 >>

root@ubuntu20:~# ansible web -a 'sleep 3' -f1
10.0.0.15 | CHANGED | rc=0 >>

10.0.0.11 | CHANGED | rc=0 >>

root@ubuntu20:~#

2.2 ansible-doc(显示模块帮助)

ansible-doc:查看ansible模块(插件)文档说明,针对每个模块都有详细的用法说明,功能和Linux的man命令类似

格式

ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]

-l, --list       # 列出可用模块
-s, --snippet    # 显示指定模块的playbook片段

查看帮助

root@ubuntu20:~# ansible-doc --help

选项

header 1

header 2

-a, --all

显示所有模块的文档

-h, --help

显示帮助信息

-j, --json

将所有的模块转储为JSON格式

-l, --list

列出可用模块

-F, --list_files

显示模块的名称和模块原路径

-M MODULE_PATH, --module-path=MODULE_PATH

模块路径

-s, --snippet

显示指定模块的playbook片段

-t TYPE, --type=TYPE

指定模块类型(默认为module)

-v, --verbose

查看执行的详细过程(-vv、-vvvv更详细)

–version

查看版本

示例

ansible-doc -l        # 列出所有模块,ansible-doc -l | grep zabbix
ansible-doc ping      # 查看指定模块帮助用法
absible-doc -s ping   # 查看指定模块帮助用法
ansible-doc file      # 查看 file 模块的用法,虽然用chown也可以,但是不具有安全性和幂等性

示例:查看指定的插件

ansible-doc -t connection -l
ansible-doc -t lookup  -l

2.3 ansible-playbook

playbook是由一个或多个’play’组成的列表
play的主要功能在于将实现归并为一组的主机装扮成事先通过ansible中的task定义好的角色,从根本上来讲,所谓task无非是调用ansible的一个module。
将多个play组织在一个playbook中,即可让它们联同起来按事先编排的机制工作。
Playbook采用YAML语言编写

# 语法:ansible-playbook [options] playbook.yml [playbook2 ...]
# options:
# 大部分的参数和ansible的参数一致

示例

[root@ubuntu20 /data/ansible]#pwd
/data/ansible
[root@ubuntu20 /data/ansible]#cat /data/ansible/uptime.yml
---
- hosts: web
  remote_user: root
  gather_facts: no

  tasks:
    - name: run time
      shell: uptime
      register: now_time
    - name: print run time
      debug:
        msg: "{{ now_time.stdout }}"

[root@ubuntu20 /data/ansible]#ansible-playbook uptime.yml

PLAY [web] *************************************************************

TASK [run time] ********************************************************
changed: [10.0.0.15]
changed: [10.0.0.11]

TASK [print run time] **************************************************
ok: [10.0.0.15] => {
    "msg": " 09:07:15 up 32 min,  1 user,  load average: 0.00, 0.00, 0.00"
}
ok: [10.0.0.11] => {
    "msg": " 09:07:14 up 31 min,  1 user,  load average: 0.08, 0.02, 0.01"
}

PLAY RECAP ********************************************************************************************************
10.0.0.11                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
10.0.0.15                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@ubuntu20 /data/ansible]#

2.4 ansible-galaxy

Galaxy 是一个免费网站, 类似于github网站, 网站上发布了很多的共享的roles角色。

Ansible 提供了ansible-galaxy命令行工具连接 https://galaxy.ansible.com 网站下载相应的roles, 进行 init(初始化、search( 查拘、install(安装、 remove(移除)等操作。

语法

ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...

选项

header 1

header 2

-h, --help

查看帮助信息

-c, --ignore-certs

忽略SSL证书验证错误

-s API_SERVER, --server=API_SERVER

API服务器地址

-v, --verbose

查看执行的详细过程(-vv、-vvvv更详细)

–version

查看版本

示例

# 连接https://galaxy.ansible.com 下载相应的roles

# 搜索项目
[root@ansible ~]#ansible-galaxy search lnmp

# 列出所有已安装的galaxy
ansible-galaxy list

# 安装galaxy,默认下载到~/.ansible/roles下
ansible-galaxy install geerlingguy.nginx
ansible-galaxy install geerlingguy.mysql 
ansible-galaxy install geerlingguy.redis

# 删除galaxy
ansible-galaxy remove geerlingguy.nginx

2.5 ansible-pull

命令功能从VCS存储库中提取剧本并为本地主机执行,该命令的使用涉及ansible的另一种工作模式:pull模式(ansible默认使用push模式)。这和通常的push模式工作机制刚好相反,其适用于一下场景。

1、有数量巨大的机器需要配置,即使使用高并发线程依旧要花费很多时间;

2、在刚启动的、没有网络连接的主机上使用运行ansible

语法

ansible-pull -U <repository> [options] [<playbook.yml>]

参数

header 1

header 2

-U , --url

剧本资料库的网址

-d , --directory

检出存储库的目录

-i, --inventory, --inventory-file

指定清单主机路径或逗号分隔的主机列表。–不推荐使用库存文件

-o, --only-if-changed

仅在存储库已更新的情况下运行剧本

-u <REMOTE_USER>, --user <REMOTE_USER>

以该用户身份连接(默认=无)

通常ansible-pull结合git和crontab 一并实现,其原理是通过crontab定期拉取指定的git库中的playbook到本地,并指定模式自动运行预先制定好的指令。

示例

*/20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/ -i /etc/ansible/hosts -U \
git://git.kingifa.com/king-gw-ansiblepull >> /var/log/ansible-pull.log 2>&1
# ansible-pull通常在配置大批量机器的场景会用到,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求。

2.6 ansible-config

ansible-config:查看,编辑管理ansible的配置文件

ansible-config [view|dump|list] [--help] [options] [ansible.cfg]
list            # 打印所有配置选项
dump            # 备份配置信息
view            # 查看配置文件

选项

header 1

header 2

-c CONFIG_FILE, --config=CONFIG_FILE

指定配置文件所在的路径

-h, --help

查看帮助信息

-v, --verbose

查看执行的详细过程(-vv、-vvvv更详细)

–version

查看版本

2.7 ansible-inventory

ansible-inventory:查看被控制端主机清单的详细信息默认情况下它使用库存脚本,返回JSON格式

语法

ansible-inventory [options] [host|group]

参数

header 1

header 2

–ask-vault-pass

询问vault密码

–output OUTPUT_FILE

将显示信息输出在指定文件中

–toml

使用TOML格式显示

-h, --help

显示帮助信息

-i INVENTORY

指定invetniory文件

-y, --yaml

使用yaml格式显示

-v, --verbose

查看执行的详细过程(-vv、-vvvv更详细)

–version

查看版本

示例

[root@node1 ~]# ansible-inventory --list
{
    "_meta": {
        "hostvars": {}
    }, 
    "all": {
        "children": [
            "ungrouped"
        ]
    }
}

2.8 ansible-vault

ansible-vault主要用于配置文件(yml文件)的加密,如编写的playbook配置文件中包含敏感的信息,不希望其他人随便的看,

# 功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
create			#创建
decrypt			#解密
edit			#编辑
encrypt			#加密
rekey			#修改密码
view			#查看

选项

header 1

header 2

–ask-vault-pass

询问vault密码

-h, --help

查看帮助信息

–new-vault-id=NEW_VAULT_ID

设置用于rekey的新vault标识

–new-vault-password-file=NEW_VAULT_PASSWORD_FIL

新的保险库密码文件为rekey

–vault-id=VAULT_IDS

要使用的保险库标识

–vault-password-file=VAULT_PASSWORD_FILES

库密码文件

-v, --verbose

查看执行的详细过程(-vv、-vvvv更详细)

–version

查看版本

示例

ansible-vault create bidding.yml    # 创建新文件
ansible-vault encrypt bidding.yml   # 加密
ansible-vault decrypt bidding.yml   # 解密
ansible-vault view bidding.yml      # 查看
ansible-vault eidt bidding.yml      # 编辑加密文件
ansible-vault rekey bidding.yml     # 修改口令

# 加密之后无法运行,只有解密之后才能运行
ansible-playbook bidding.yml

2.9 ansible-console

2.0+新增,可交互式执行ansible命令

支持tab补全,常用于ad-hoc和ansible-playbook之间的场景,常用于集中一批临时操作或命令。

提示符格式

执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$

常用子命令:

  • 设置并发数:forks n 例如:forks 10
  • 切换组:cd 主机组 例如:cd bidding
  • 列出当前组主机列表:list
  • 列出所有的内置命令:? 或 help

示例

root@ubuntu20:~# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.

root@all (4)[f:5]$ list
10.0.0.15
10.0.0.11
10.0.0.16
10.0.0.12
root@all (4)[f:5]$ cd db
root@db (2)[f:5]$ list
10.0.0.15
10.0.0.16
root@db (2)[f:5]$ ping
[DEPRECATION WARNING]: Distribution ubuntu 20.10 on host 10.0.0.16 should use /usr/bin/python3, but is using /usr/bin/python
for backward compatibility with prior Ansible releases. A future Ansible release will default to using the discovered
platform python for this host. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for
more information. This feature will be removed in version 2.12. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
10.0.0.16 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
10.0.0.15 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
root@db (2)[f:5]$