栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Ansible总结

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Ansible总结

Ansible介绍与发展历史 Ansileb发展史

作者:Michael DeHaan( Cobbler 与 Func 作者)ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗2012-03-09,发布0.0.1版,2015-10-17,Red Hat宣布1.5亿美元收购;

官网:https://www.ansible.com/
官方文档:https://docs.ansible.com/

Ansible功能介绍:

​ 批量执行远程命令,可以对远程的多台主机同时进行命令的执行批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构提供自动化运维工具的开发API, 有很多运维工具,如jumpserver就是基于 ansible 实现自动化管理功能

ansible的特点
  1. 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
  2. Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
  3. 基于Python语言实现
  4. 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
  5. 安全,基于OpenSSH
  6. 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
  7. 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
  8. 较强大的多层解决方案 role
Ansible结构介绍 Ansible 组成

组合INVENTORY、API、MODULES、PLUGINS的绿框,为ansible命令工具,其为核心执行工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UpnswvoA-1652113078914)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220430160135975.png)]

  • INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口
Ansible命令执行的来源
  • USER 普通用户,即SYSTEM ADMINISTRATOR
  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执
  • 行,通常是JSON格式的YML文件
  • CMDB(配置管理数据库) API 调用
  • PUBLIC/PRIVATE CLOUD API调用
  • USER-> Ansible Playbook -> Ansibile
Ansible的注意事项
  • 执行ansible的主机一般称为管理端, 主控端,中控,master或堡垒机
  • 主控端Python版本需要2.6或以上
  • 被控端Python版本小于2.4,需要安装python-simplejson
  • 被控端如开启SELinux需要安装libselinux-python
  • windows 不能做为主控端
Ansible的安装与入门 使用yum安装Ansible(推荐) 配置epel源
tee /etc/yum.repos.d/Base.repo < 
安装ansible 
yum info ansible
yum install ansible -y
ansible --version

编译安装Ansible 下载编译工具
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
下载安装包
wget https://releases.ansible.com/ansible/ansible-1.5.4.tar.gz
开始编译安装
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
PIP安装
# pip 是安装Python包的管理器,类似 yum
yum install python-pip
pip install --upgrade pip
pip install ansible --upgrade
Ansible相关配置文件 配置文件
  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件, 当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文 件
  • /etc/ansible/hosts 主机清单
  • /etc/ansible/roles/ 存放角色的目录
ansible主配置文件

Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下

ANSIBLE_CONFIG #环境变量,注意此项用 ansible --version 看不到,但可以生效
./ansible.cfg   #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg  #系统默认配置文件

Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改

[defaults]
#inventory     = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp #本机的临时命令执行目录
#forks         = 5   #默认并发数
#sudo_user     = root #默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass     = True   
#remote_port   = 22		#默认使用端口
#host_key_checking = False     #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机

#log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command   #默认模块,可以修改为shell模块
[privilege_escalation] #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

范例:优先度对比

[root@Ansible-Master ~16:34]#ansible --version
ansible 2.9.27
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr  2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
[root@Ansible-Master ~16:34]#cp /etc/ansible/ansible.cfg .
[root@Ansible-Master ~16:34]#ansible --version
ansible 2.9.27
  config file = /root/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr  2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
inventory 主机清单文件

​ ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织默认的inventory file为 /etc/ansible/hostsinventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。
注意: 生产建议在每个项目目录下创建项目独立的hosts文件

官方文档
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
主机清单格式

nventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组
中;
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明;
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机;

**Inventory 参数说明
ansible_ssh_host #将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port #ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
192.168.1.100:2222
ansible_ssh_user #默认的 ssh 用户名
ansible_ssh_pass #ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass #sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8) #sudo 命令路径(适用于1.8及以上版本)
ansible_connection #与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默
认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来
判断'ssh' 方式是否可行.
ansible_ssh_private_key_file #ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的
情况.
ansible_shell_type #目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为
'csh' 或 'fish'.
ansible_python_interpreter #目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 
或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python 不是 2.X 版本的
Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 
可执行程序名不可为 python以外的名字(实际有可能名为python26).与
ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

范例:

[test]
10.0.0.8 ansible_connection=local #指定本地连接,无需ssh配置
#ansible_connection=ssh 需要StrictHostKeyChecking no
10.0.0.7 ansible_connection=ssh ansible_ssh_port=2222 ansible_ssh_user=wang
ansible_ssh_password=magedu
10.0.0.6 ansible_connection=ssh ansible_ssh_user=root
ansible_ssh_password=123456
#执行ansible命令时显示别名,如web01
[websrvs]
web01 ansible_ssh_host=10.0.0.101
web02 ansible_ssh_host=10.0.0.102
[websrvs:vars]
ansible_ssh_password=magedu
some_host ansible_ssh_port=2222 ansible_ssh_user=manager
aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host ansible_python_interpreter=/usr/local/bin/python
ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
Ansible相关工具
  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man
  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本 /usr/bin/ansible-pull 远程执行命令的工具
  • /usr/bin/ansible-vault 文件加密工具
  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具 /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

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

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

ansible 相关工具大多数是通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能 建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点

范例:利用sshpass批量实现基于key验证脚本1

!/bin/bash
rpm -q sshpass &> /dev/null || yum -y install sshpass
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa -P ''
export SSHPASS=magedu
while read IP;do
sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP
done < hosts.list

范例:基于key验证的脚本2

#!/bin/bash
IPLIST="
192.168.213.121
192.168.213.122
192.168.213.123
192.168.213.124
192.168.213.125"
rpm -q sshpass &> /dev/null || yum -y install sshpass
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa -P ''
export SSHPASS=123456
for IP in $IPLIST;do
{ sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP; } &
done
wait

范例:实现基于key验证的脚本

#!/bin/bash
PASS="redhat"
#设置网段最后的地址
END="130"
IP="$(ip a s ens36 | awk -F'[ /]+' 'NR==3{print $3}')"
NET=${IP%.*}.
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=120;i<="$END";i++));do
ping -c 1 -w 1  "${NET}$i" &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p ${PASS} ssh-copy-id -o StrictHostKeyChecking=no "${IP}"


#逐行赋值
#AliveIP=($(cat SCANIP.log))
while read -r line;do 
     AliveIP+=("$line")
done < SCANIP.log
for n in "${AliveIP[@]}";do
sshpass -p ${PASS} scp -o StrictHostKeyChecking=no -r /root/.ssh root@"${n}":
done
#部分主机可能无法获取完整的known_hosts文件固将/root/.ssh/known_hosts拷贝到所有主机
for n in "${AliveIP[@]}";do
scp /root/.ssh/known_hosts "${n}":.ssh/
done
ansible-doc:获取指定模块的帮助文档

格式:

ansible-doc [options] [module...]
-l, --list #列出可用模块
-s, --snippet #显示指定模块的playbook片段

列出所有模块,版本2.9.27有3387个模块,不同版本会有一定的差异;

ansible-doc -l 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2f12BSy9-1652113078915)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220509114140641.png)]

列出指定模块帮助

ansible-doc -s module_name

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OF3ZxUn1-1652113078915)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220509121302395.png)]

ansible Ad-Hoc的 执行方式

​ ansible Ad-Hoc说明:

Ansible Ad-Hoc的执行方式主要的工具就是ansible命令:
#格式:	ansible  [-m module_name] [-a args]

​ 常用选项说明:

		#显示版本	--version
		#指定模块,默认为command	-m module
		#详细过程 -vv -vvv更详细	-v
		#显示主机列表,可简写 --list	-list-hosts
		#检查,并不执行	-C, --check
		#执行命令的超时时间,默认10s	-T, --timeout=TIMEOUT
		#提示输入ssh连接密码,默认Key验证	-k, --ask-pass
		#执行远程执行的用户,默认root	-u, --user=REMOTE_USER
		#代替旧版的sudo 切换	-b, --become
		#指定sudo的runas用户,默认为root	--become-user=USERNAME
		#提示输入sudo时的口令	-K, --ask-become-pass
		#指定并发同时执行ansible任务的主机数	-f FORKS, --forks FORKS

范例:调用shell模块查看shadow文件

#修改被控制端的suduers文件,添加用户ALL=(ALL) NOPASSWD: ALL字段:
sed -ri '/## Same thing without a password/axiang ALL =(ALL) NOPASSWD: ALL /etc/sudoers
#调用shell模块查看shadow
ansible 192.168.213.122 -m shell -a 'sudo cat /etc/shadow |head -5' -u xiang -k -b
[root@Ansible-Master ~14:18]#ansible 192.168.213.123 -m shell -a 'sudo cat /etc/shadow|head -5' -u xiang -k 
SSH password: 
[WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo
192.168.213.123 | CHANGED | rc=0 >>
root:$6$nZpI0Gve/q3y/vLW$k8QocsCR4x65nEqLaFsHhQGR8eYibTP.ixE5pzNY.8qTz3OkwWWIs8c4Z5QZJ6VZ8Lv0YVNvVoapARSpAuHDm1::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::

ansible的Host-pattern

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

all:表示所有inventory中的所有主机

范例:调用ping模块测试所有主机连通性

#查看ansible hosts文件中所有的主机
[root@Ansible-Master ~14:30]#cat /etc/ansible/hosts |grep -Ev "^#|^$"
[local]
192.168.213.101 ansible_connection=local
[webservs]
192.168.213.122:22 hname=www1 domain=slave01
192.168.213.123:22 hname=www2 domain=slave02
[webservs:vars]
mark="-"
[all:vars]
domain=xiangdeming.org
[dbservs]
192.168.213.124:22
[appservs]
192.168.213.101:22
192.168.213.122:22
192.168.213.123:22
192.168.213.124:22

#调用ping模块测试所有主机的连通性,当前例子可以all测试所有主机(共4台),且两通两不通
[root@Ansible-Master ~14:30]#ansible all -m ping 
192.168.213.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.213.123 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.213.122 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.122 port 22: No route to host", 
    "unreachable": true
}
192.168.213.124 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.124 port 22: No route to host", 
    "unreachable": true
}

"*"通配符

#通配符”*“类似于all,可以匹配任意主机或字符
[root@Ansible-Master ~14:33]#ansible "*" -m ping
192.168.213.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.213.123 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.213.122 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.122 port 22: No route to host", 
    "unreachable": true
}
192.168.213.124 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.124 port 22: No route to host", 
    "unreachable": true
}

[root@Ansible-Master ~14:36]#ansible 192.168.213.* -m ping
192.168.213.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.213.123 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.213.122 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.122 port 22: No route to host", 
    "unreachable": true
}
192.168.213.124 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.124 port 22: No route to host", 
    "unreachable": true
}

#多台指定主机,使用”“,并在主机之前用空格隔开;
[root@Ansible-Master ~14:37]#ansible "192.168.213.101 192.168.213.122" -m ping
192.168.213.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.213.122 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.122 port 22: No route to host", 
    "unreachable": true
}

主机之间或的关系

#指定两台主机或关系,使用""并IP或别名组之间使用:隔开;
[root@Ansible-Master ~14:40]#ansible "192.168.213.101:192.168.213.123" -m ping
192.168.213.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.213.123 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

逻辑与

#查看主机列表
[root@Ansible-Master ~14:53]#cat /etc/ansible/hosts |grep -Ev "^#|^$"
[local]
192.168.213.101 ansible_connection=local
[webservs]
192.168.213.123:22
[webservs:vars]
mark="-"
[all:vars]
domain=xiangdeming.org
[dbservs]
192.168.213.124:22
[appservs]
192.168.213.101:22
192.168.213.122:22
192.168.213.123:22
192.168.213.124:22
#在webservs中且在dbservs组中的主机只有192.168.213.123:22
[root@Ansible-Master ~14:55]#ansible "webservs:&appservs" -m ping
192.168.213.123 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

逻辑非

#查看主机列表
[root@Ansible-Master ~14:53]#cat /etc/ansible/hosts |grep -Ev "^#|^$"
[local]
192.168.213.101 ansible_connection=local
[webservs]
192.168.213.122:22
192.168.213.123:22
[webservs:vars]
mark="-"
[all:vars]
domain=xiangdeming.org
[dbservs]
192.168.213.124:22
[appservs]
192.168.213.101:22
192.168.213.123:22
192.168.213.124:22
#在webservs中不存在于dbservs组中的主机只有192.168.213.122:22
[root@Ansible-Master ~15:11]#ansible 'webservs:!appservs' -m ping
192.168.213.122 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

综合逻辑

#查看主机列表
[root@Ansible-Master ~15:21]#grep -Ev "^#|^$" /etc/ansible/hosts 
[local]
192.168.213.101 ansible_connection=local
[webservs]
192.168.213.122:22
192.168.213.123:22
[webservs:vars]
mark="-"
[all:vars]
domain=xiangdeming.org
[dbservs]
192.168.213.124:22
[appservs]
192.168.213.121:22
192.168.213.124:22
[ftpservs]
192.168.213.125:22

#webservs与dbservs中的主机在appservs中存在的而在ftpservs中不存在的主机;
[root@Ansible-Master ~15:21]#ansible 'webservs:dbservs:&appservs:!ftpservs' -m ping
192.168.213.124 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.124 port 22: No route to host", 
    "unreachable": true
}

正则表达式

#查看主机列表
[root@Ansible-Master ~15:29]#grep -Ev "^#|^$" /etc/ansible/hosts 
[local]
192.168.213.101 ansible_connection=local
[webservs]
web1.example.com
web2.example.com
[webservs:vars]
mark="-"
[all:vars]
domain=xiangdeming.org
[dbservs]
db[1:3].example.com
[appservs]
192.168.213.[120:129]:22
[ftpservs]
192.168.213.130:22

#以web

并发控制

#同时执行多台主机sleep 5,#单台主机执行sleep 5,这里是3台一起执行的,具体的需自行执行
[root@Ansible-Master ~16:09]#ansible appservs  -a "sleep 5" -f3
192.168.213.121 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.121 port 22: No route to host", 
    "unreachable": true
}
192.168.213.122 | CHANGED | rc=0 >>

192.168.213.123 | CHANGED | rc=0 >>

192.168.213.124 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.124 port 22: No route to host", 
    "unreachable": true
}

#单台主机执行sleep 5,这里是一台一台执行的;具体的需自行执行
[root@Ansible-Master ~16:09]#ansible appservs  -a "sleep 5" -f1
192.168.213.121 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.121 port 22: No route to host", 
    "unreachable": true
}
192.168.213.122 | CHANGED | rc=0 >>

192.168.213.123 | CHANGED | rc=0 >>

192.168.213.124 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.213.124 port 22: No route to host", 
    "unreachable": true
}

ansible的执行过程

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

Ansible的执行状态

  • 绿色:执行成功并需要做改变的操作;
  • 黄色:执行 成功并且对目标主机做出了改变或执行了某些语句的操作,可以通过change_when:false关闭;
  • 红色:执行失败
ansible-console

此工具可交互执行命令,支持tab,ansible 2.0+新增

提示符格式

#	执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
常用子命令
  • 设置并发数: forks n 例如: forks 10
  • 切换组:cd 主机组 例如: cd web
  • 列出当前组主机列表: list
  • 列出所有的内置命令: ?或help
常用参数
positional arguments:
  pattern               # 连接的主机地址,需在主机清单中

optional arguments:
  --ask-vault-pass      # 加密playbook文件时提示输入密码
  --list-hosts          # 列出执行匹配到的主机,但并不会执行
  --playbook-dir BASEDIR    # 由于此工具不使用剧本,因此将其用作 替换剧本目录
  --step                #one-step-at-a-time: confirm each task before running
  --syntax-check        # 检查Playbook中的语法书写
  --vault-id VAULT_IDS  # vault id
  --vault-password-file # vault 密码文件
  --version             # 显示程序的版本号,配置文件位置,配置的模块搜索路径,模块位置,可执行文件位置
  -C, --check           don't make any changes; instead, try to predict some
  -C, --check           # 模拟执行,不会真正在机器上执行(查看执行会产生什么变化)
  -D, --diff            # 当更新的文件数及内容较少时,该选项可显示这些文件不同的地方,该选项结合-C用会有较好的效果
  -M MODULE_PATH, --module-path MODULE_PATH    # 要执行的模块的路径
  -f FORKS, --forks FORKS    # 并行任务数。FORKS被指定为一个整数,默认是5
  -h, --help            # 命令帮助文档
  -i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY    # 指定要读取的Inventory文件
  -l SUBSET, --limit SUBSET    # 限定执行的主机范围
  -v, --verbose         # 执行详细输出 (-vvv for more, -vvvv to enable connection debugging)

权限提升参数:
 
  --become-method BECOME_METHOD    # 要使用的权限提升方法(默认=sudo),使用 `ansible-doc -t become -l` 列出有效的选择
  --become-user BECOME_USER    # 以此用户身份运行操作(默认=root)
  -K, --ask-become-pass    # 要求提权的密码
  -b, --become          # 设置为yes激活权限提升。

连接参数:
 
  --private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE    # 使用此文件的连接进行验证
  --scp-extra-args SCP_EXTRA_ARGS    # 指定仅传递给 scp 的额外参数(例如 -l)
  --sftp-extra-args SFTP_EXTRA_ARGS    # 指定仅传递给 sftp 的额外参数(例如 -f、-l)
  --ssh-common-args SSH_COMMON_ARGS    # 指定要传递给 sftp/scp/ssh 的通用参数
  --ssh-extra-args SSH_EXTRA_ARGS    # 指定仅传递给 ssh 的额外参数(例如 -R)
  -T TIMEOUT, --timeout TIMEOUT    # 连接超时时间,单位:秒,默认 10 秒
  -c CONNECTION, --connection CONNECTION    # 要使用的连接类型,默认是 smart
  -k, --ask-pass        # 询问连接密码,也就说,使用密码访问的话,需要加此参数
  -u REMOTE_USER, --user REMOTE_USER    # 以此用户身份连接,默认为 None

范例:进入console界面

[root@Ansible-Master ~16:42]#ansible-console
Welcome to the ansible console.
Type help or ? to list commands.

root@all (6)[f:5]$ 

范例:组切换

[root@Ansible-Master ~22:28]#ansible-console
Welcome to the ansible console.
Type help or ? to list commands.

root@all (7)[f:5]$ cd webservs
root@webservs (2)[f:5]$ cd dbservs
root@dbservs (1)[f:5]$ list
db01
root@dbservs (1)[f:5]$ cd webservs
root@webservs (2)[f:5]$ list
192.168.213.122
192.168.213.123
root@webservs (2)[f:5]$ 
ansible-vault

此工具可以用于加密解密yml文件

格式:

#	ansible-vault [create|decrypt|edit|encrypt|rekey|view]

范例:

cat hello.yml
---
#hello word yml file
- hosts: webservs
  remote_user: root
  gather_facts: no
  
  tasks:
  	- name: hello word
  	  command: /usr/bin/wall hello word

ansible-vault encrypt hello.yml #加密
[root@Ansible-Master ~22:46]#ansible-vault encrypt hello.yml
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@Ansible-Master ~22:49]#vim hello.yml 
[root@Ansible-Master ~22:55]#cat hello.yml 
$ANSIBLE_VAULT;1.1;AES256
31316439613433353866623232373436636332393361386137336634376463333163343762356261
3663396166363930383266633862383861653239623066370a363766653332613165336230333230
33633335643930343866626336613562363734626364636162333838353933376235353737323164
6238633539633432370a316263613864613933636462303338633236313265633933373735383261
30633930326630353362383063633834336431303161646533313761623062383534343931303664
32623932336463363864353034336132343636343537353830633764356332653965396532666462
64663535643563653164643865386238643738376363393165386566636430306161663362616561
34653066393731343366633131626332346338646366306130616462643862366639373833363135
38363337393266663836336361363638366663636135666435663230333935626634616137353830
37663737643332663533643761306438653035393764626130643666633764326332336163333563
61653263373563386330383237313430386366353066616666626234373630636666646435346238
65323530393064306164633132383238663233636365623362356438626631363534343339643536
6337

ansible-vault decrypt hello.yml #解密
[root@Ansible-Master ~22:55]#ansible-vault decrypt hello.yml
Vault password: 
Decryption successful
[root@Ansible-Master ~22:58]#cat hello.yml
---
#hello word yml file
- hosts: webservs
  remote_user: root
  gather_facts: no
  
  tasks:
      - name: hello word
        command: /usr/bin/wall hello word

ansible-vault view hello.yml #查看
[root@Ansible-Master ~22:59]#ansible-vault encrypt hello.yml
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@Ansible-Master ~22:59]#ansible-vault view hello.yml
Vault password: 
---
#hello word yml file
- hosts: webservs
  remote_user: root
  gather_facts: no
  
  tasks:
      - name: hello word
        command: /usr/bin/wall hello word


ansible-vault edit hello.yml #编辑加密文件
[root@Ansible-Master ~23:01]#ansible-vault edit hello.yml 
Vault password: 
---
#hello word yml file
- hosts: webservs
  remote_user: root
  gather_facts: no

  tasks:
      - name: hello word
        command: /usr/bin/wall hello word


ansible-vault rekey hello.yml #修改口令
[root@Ansible-Master ~23:08]#ansible-vault rekey hello.yml 
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful


ansible-vault create new.yml #创建新文件
[root@Ansible-Master ~23:11]#ansible-vault create new.yml
New Vault password: 
Confirm New Vault password: 
[root@Ansible-Master ~23:16]#ansible-vault view new.yml
Vault password: 
1234455
ansible-galaxy

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8O1aa0qq-1652113078916)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220509233242785.png)]

范例:

#搜索项目
[root@Ansible-Master ~23:11]# ansible-galaxy search lamp
#列出所有已安装的galaxy
[root@Ansible-Master ~23:11]# ansible-galaxy list
#安装galaxy,默认下载到~/.ansible/roles下
[root@Ansible-Master ~23:11]# ansible-galaxy install geerlingguy.mysql
[root@Ansible-Master ~23:11]# ansible-galaxy install geerlingguy.redis
#删除galaxy
[root@Ansible-Master ~23:11]# ansible-galaxy remove geerlingguy.redis
Aansible常用模块

2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852 个模块,2019年05月25日(ansible 2.7.10)时2080个模块,2020年03月02日有3387个模块

参考文档

虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只用10几个模块 常用模块帮助文档参考:

https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uBCbHRqU-1652191366658)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220509234308075.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mjkjKOUs-1652191366659)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220509234452051.png)]

Command模块
  • 功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
  • 注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现
  • 注意:此模块不具有幂等性

范例:

#查看webservs组中的主机信息
ansible webservs --list-hosts

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9dPtbFOU-1652191366659)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510000136037.png)]

#查看远端passwd信息
ansible webservs -m command -a 'ls -l /etc/passwd'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sop3b2D5-1652191366660)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510000231874.png)]

#查看远端主机root下的信息chdir=/root(执行命令前先切换到root目录)
ansible webservs -m command -a 'chdir=/root ls -l'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2xE2HGrL-1652191366660)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510000334160.png)]

#在远端主机上创建文件夹creates=/root/data(执行命令前先判断/root/data是否存在,存在则跳过,不存在则执行后续命令)
ansible webservs -m command -a 'creates=/root/data mkdir /root/data'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fb76o7lx-1652191366660)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510000523284.png)]

#尝试使用重定向(command模块不支持)
ansible webservs -m command -a 'echo hello > /data/hello.log'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10JZ77Dd-1652191366660)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510000626955.png)]

#尝试使用变量(command模块不支持)
ansible webservs -m command -a 'echo $HOSTNAME'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfgX8IVf-1652191366661)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510000811839.png)]

shell模块
  • 功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >
  • 注意:此模块不具有幂等性

范例:

#获取远端主机的主机名称
[root@Ansible-Master ~11:03]#ansible webservs -m shell -a "echo $HOSTNAME"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8Ejrho2-1652191366661)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510110451273.png)]

#创建文件夹
[root@Ansible-Master ~11:06]#ansible webservs -m shell -a 'creates=/root/data mkdir /root/data'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARLZHqK7-1652191366661)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510110648145.png)]

#使用重定向
[root@Ansible-Master ~11:06]#ansible webservs -m shell -a 'echo hello > /root/data/hello.log'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zSRaCIR-1652191366661)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510110750047.png)]

Copy模块
  • 功能:从ansible服务器主控端复制文件到远程主机
  • 注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件

范例:

#要求:将ssh_key脚本复制到被控端组:webservs,且文件的拥有人:xiang、属组:bin、权限:700、名称:ssh-key.sh、若文件存在则生成备份
#在本端生成ssh_key.sh脚本文件
tee /root/Data/ssh_key.sh < /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p ${PASS} ssh-copy-id -o StrictHostKeyChecking=no "${IP}"
EOF
#调用copy文件将ssh_key.sh脚本文件拷贝到被控端组:Webservs
[root@Ansible-Master ~13:44]#ansible webservs -m copy -a 'src=/root/Date/ssh_key.sh dest=/root/data/ssh-key.sh owner=xiang group=bin  mode=700 backup=yes'
192.168.213.123 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "checksum": "773ed6b1d312562033b0865926a56de91d7574b4", 
    "dest": "/root/data/ssh-key.sh", 
    "gid": 1, 
    "group": "bin", 
    "mode": "0700", 
    "owner": "xiang", 
    "path": "/root/data/ssh-key.sh", 
    "size": 867, 
    "state": "file", 
    "uid": 1001
}
192.168.213.122 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "773ed6b1d312562033b0865926a56de91d7574b4", 
    "dest": "/root/data/ssh-key.sh", 
    "gid": 1, 
    "group": "bin", 
    "mode": "0700", 
    "owner": "xiang", 
    "path": "/root/data/ssh-key.sh", 
    "size": 867, 
    "state": "file", 
    "uid": 1001
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yp1BoVR3-1652191366662)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510134735359.png)]

#指定内容,直接生成目标文件
ansible websrvs -m copy -a "content='test line1ntest line2n' dest=/tmp/test.txt"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-64dxiI1X-1652191366662)(C:Users10163AppDataRoamingTyporatypora-user-imagesimage-20220510134245311.png)]

##目录复制的区别
#复制/etc目录自身,注意/etc/后面没有/(这种方法性能会很差,不推荐使用,可以使用sync或者直接scp的方式实现)
ansible websrvs -m copy -a "src=/etc dest=/backup"
##复制/etc/下的文件,不包括/etc/目录自身,注意/etc/后面有/
ansible websrvs -m copy -a "src=/etc/ dest=/backup"
Script模块
  • 功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
  • 注意:此模块不具有幂等性
  • 注意:需标准输入脚本脚本无法执行,会一直等待输入

范例:

##运行被控主机上的脚本文件
#在本段生成生成脚本test.sh
tee /root/test1.sh < #!/bin/bash
> hostname -I
> EOF
#ansible server端调用Script模块让脚本在远端运行
[root@Ansible-Master ~14:03]#ansible 192.168.213.122 -m script -a '/root/test1.sh'
192.168.213.122 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.213.122 closed.rn", 
    "stderr_lines": [
        "Shared connection to 192.168.213.122 closed."
    ], 
    "stdout": "192.168.40.182 192.168.0.122 192.168.213.122 192.168.122.1 240e:47c:3250:5398:8b92:72c6:58e7:7ed5 rn", 
    "stdout_lines": [
        "192.168.40.182 192.168.0.122 192.168.213.122 192.168.122.1 240e:47c:3250:5398:8b92:72c6:58e7:7ed5 "
    ]
}
Get_url模块
  • 功能: 用于将文件从http、https或ftp下载到被管理机节点上
常用参数
url: 下载文件的URL,支持HTTP,HTTPS或FTP协议
dest:下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:指定属主
group:指定属组
mode:指定权限
force: 如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件
checksum: 对目标文件在下载后计算摘要,以确保其完整性;示例: checksum="sha256:D98291AC[...]B6DC7B97",checksum="sha256:http://example.com/path/sha256sum.txt"
url_username: 用于HTTP基本认证的用户名。 对于允许空密码的站点,此参数可以不使用`url_password'
url_password: 用于HTTP基本认证的密码。 如果未指定`url_username'参数,则不会使用`url_password'参数
validate_certs:如果“no”,SSL证书将不会被验证。 适用于自签名证书在私有网站上使用
timeout: URL请求的超时时间,秒为单位

范例:

##下载nginx-1.18.0.tar.gz的安装包
#ansible server下载包,并生成MD5值以确保slave端下载的包的完整性;
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#生成md5值
md5sum  nginx-1.18.0.tar.gz
openssl md5 nginx-1.18.0.tar.gz
#slave端下载nginx-1.18.0.tar.gz安装包
	ansible webservs -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/data/nginx.tar.gz checksum="md5:b2d33d24d89b8b1f87ff5d251aa27eb8"'
#也可以不带md5值,但是建议带保证包的完整性
ansible webservs -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/data/nginx.tar.gz‘
Fetch 模块
  • 功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录;
  • 选项与copy类似
#拷贝slave端的messages文件至ansible 主端

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/882443.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号