ansible
安装ansible:
AnbleVersion2.4及更高版本可以管理包含Python2.6或更高版本的早期操作系统。
yum方式安装:
yum源或rpm包来源:埃佩尔以及Relases.ansible.com.
$ sudo yum install ansible
您也可以自己构建一个可以分发和安装的RPM。
1 2 3 4 | $ git clone https: //github .com /ansible/ansible .git $ cd . /ansible $ make rpm $ sudo rpm -Uvh . /rpm-build/ansible- *.noarch.rpm |
托管节点的需求
在托管节点上,需要ssh。默认情况下使用sftp。如果sftp不可用,可以在ansible.cfg切换到scp
。您还需要Python 2(版本2.6或更高版本)或Python 3(版本3.5或更高版本)。
注
-
如果在远程节点上启用了SELinux,需要安装 libselinux-python。 yum install libselinux-python
-
默认情况下,Ansible使用位于
/usr/bin/python的解释器
。如果是 python2/3 您可能会看到以下错误:"module_stdout": "/bin/sh: /usr/bin/python: No such file or directory\r\n"
-
可以使用raw 快速执行命令
$ ansible myhost --sudo -m raw -a "yum install -y python2"
通过Pip发布最新版本
Ansible可以通过Python包管理器“pip”安装。如果您的Python版本中还没有“pip”,您可以通过以下方法获得pip:
$ sudo easy_install pip
然后用[1]:
$ sudo pip install ansible
或者如果您正在寻找最新的开发版本:
$ pip install git+https://github.com/ansible/ansible.git@devel
https://docs.ansible.com/ansible/latest/user_guide/index.html
远程连接信息
在我们开始之前,了解Ansible如何通过SSH与远程计算机进行通信是很重要的。
EnterpriseLinux 6操作系统作为控制机器时,OpenSSH的版本可能太老,无法支持ControlPersio。就会使用“paramiko”。如果您希望使用KerberizedSSH等特性,请考虑使用Fedora、MacOS或Ubuntu作为您的控制机器,直到OpenSSH的更新版本在您的平台上可用为止。
偶尔会遇到不支持SFTP的设备。这是很少见的,但是如果发生这种情况,您可以切换到scp模式。配置可测性.
在使用远程机器时,Ansible默认假定您使用的是SSH键。鼓励使用SSH密钥,但在需要时也可以通过提供该选项来使用密码身份验证。--ask-pass
。如果使用sudo特性和sudo需要密码时,也可以提供--ask-become-pass
(以前--ask-sudo-pass
已经被否决了)。
- 编辑/etc/ansible/hosts
- 添加本机的public SSH key到目标机器的authorized_keys #ssh-copy-id
- 添加本机的私钥到Ansible
- 运行ansible all -m ping 测试是否添加成功
/etc/ansible/hosts
存放需要管理的机器。这是一个库存文件,在这里也有更深入的解释:处理库存.
1 2 3 4 5 6 7 | 建立密钥认证 [root@ansible ~] # ssh-keygen [root@ansible ~] # for i in {1..4}; do ssh-copy-id -i 192.168.78.1$i; done 设置SSH代理以避免重新键入密码: [root@ansible ~] #ssh-agent bash [root@ansible ~] #ssh-add ~/.ssh/id_rsa |
(取决于您的设置,您可能希望使用Ansible的--private-key
选项来指定pem文件)
1 2 | [root@localhost ansible] # ansible --help | grep priva --private-key=PRIVATE_KEY_FILE, --key- file =PRIVATE_KEY_FILE |
在所有节点上运行一个实时命令:
$ ansible all -a "/bin/echo hello"
阅读一些更真实的案例adhoc命令简介,探索使用不同模块可以做什么,并了解Ansible使用剧本语言。
小贴士
1 2 3 4 5 | 在运行命令时,可以使用“localhost”或“127.0.0.1”作为服务器名称来指定本地服务器。 例子: $ ansible localhost -m ping -e 'ansible_python_interpreter="/usr/bin/env python"' 通过将此添加到库存文件中,可以显式地指定localhost: localhost ansible_connection= local ansible_python_interpreter= "/usr/bin/env python" #创建了一个别名 |
配置:
-
1)批量定义主机
1 2 3 | [g1] g[1:50].example.com g[a-f].example.com |
1 2 3 4 5 6 7 8 | [root@localhost ansible] # vim /etc/ansible/hosts 192.168.1.[128:130] [root@localhost ansible] # ansible all -uroot -k -m ping -o #-k ssh密码登录 -u指定用户 -m要执行的模块 -o摘要输出 SSH password: 192.168.1.128 | SUCCESS => { "changed" : false , "ping" : "pong" } 192.168.1.129 | SUCCESS => { "changed" : false , "ping" : "pong" } 192.168.1.130 | UNREACHABLE!: Failed to connect to the host via ssh : ssh : connect to host 192.168.1.130 port 22: No route to host |
-
2)内置参数:用户名和密码和ssh端口;命令行不用输入-u和-k选项
1 2 3 4 5 6 7 8 9 10 | [root@localhost ~] # vim /etc/ansible/hosts [web] 192.168.1.[31:32] ansible_ssh_user= 'root' ansible_ssh_pass= 'redhat' ansible_ssh_port= '22' 192.168.1.172 http_port=80 [root@localhost ~] # ansible web -m ping -o SSH password: 192.168.1.32 | SUCCESS => { "changed" : false , "ping" : "pong" } 192.168.1.31 | SUCCESS => { "changed" : false , "ping" : "pong" } 192.168.1.172 | SUCCESS => { "changed" : false , "ping" : "pong" } |
#可以让两台服务器产生的apache配置文件httpd.conf差异化
-
3)组变量,:vars
1 2 3 4 5 6 7 | [webservers] 192.168.1.[31:32] [web:vars] ansible_ssh_user= 'root' ansible_ssh_pass= 'redhat' ansible_ssh_port= '22' http_port=80 |
# 组变量的作用域是覆盖组所有成员,通过定义一个新块,块名由组名+ ":vars"组成。**
- 4)全局变量、指定python解释器
1 2 3 4 5 6 7 8 9 10 11 | [all:vars] # *:vars 块变量,all:vars 全局变量 ansible_ssh_private_key_file= /root/ . ssh /id_rsa ansible_ssh_port=22 ansible_ssh_user=root [t3:vars] # t3 使用python解释器是python2 ansible_python_interpreter= /usr/bin/python2 nginx_port=80 # 私有变量在playbooks中使用 [t3] 192.168.11.162 |
-
5)嵌套组,:children
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@localhost ~] # vim /etc/ansible/hosts [nginx] 192.168.1.31 [apache] 192.168.1.32 [web:children] apache nginx [nested:vars] ntp_server=s1b. time .edu.cn [root@localhost ~] # ansible webservers -m ping -o 192.168.1.31 | SUCCESS => { "changed" : false , "ping" : "pong" } 192.168.1.32 | SUCCESS => { "changed" : false , "ping" : "pong" } |
#嵌套组定义一个新块,块名由[ 组名+":chilren"] 组成。嵌套组也可以定义组变量,作用域是嵌套组里的所有组
嵌套组只能在/usr/bin/ansible-playbook中起作用,在/usr/bin/ansible中不起作用
-
6)自定义主机清单文件
1 2 3 | [root@localhost ~] # ansible -i /etc/ansible/webservices webservers -m ping -o 192.168.1.31 | SUCCESS => { "changed" : false , "ping" : "pong" } 192.168.1.32 | SUCCESS => { "changed" : false , "ping" : "pong" } |
-
7)查看组中的主机列表
1 2 3 4 5 6 7 8 | [root@localhost ~] # ansible web --list-host hosts (2): 192.168.1.32 192.168.1.31 [root@localhost ~] # ansible nginx --list-host hosts (1): 192.168.1.31 |
- 8)分离 主机与组 特定数据
将定义的主机名与组变量单独剥离出来放到指定的文件中,将采用YAML格式存放,存放位置规定:"/etc/ansible/group_vars/+组名"和"/etc/ansible/host_vars/+主机名"分别存放指定组名或主机名定义的变量,如下:
1 2 3 4 5 6 7 8 9 10 | [root@ansible host_vars] # cat 192.168.78.11.yml http_port: 80 [root@ansible group_vars] # cat mysql.yml ntp_server: s1b. time .edu.cn database_server: 192.168.78.14 [root@ansible group_vars] # cat web.yml ntp_server: s1b. time .edu.cn http_prot: 80 |
**可以直接调用变量,规范目录名的原因是ansible会自动加载这几个目录下的变量,如果变量不放到这几个目录下,是不能调用的,我们会在后面介绍到不放到特定目录下,playbook如何调用这些变量**
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Inventory 分文件管理(文件名即是组名) 分文件: /etc/ansible/group_vars/vim /etc/ansible/group_vars/webservers /etc/ansible/host_vars/foosball vim 文件中的内容: 变量 ntp_server: acme.example.org db_server: 10.0.0.1 分文件夹:(文件夹就是组名) /etc/ansible/group_vars/vim/install /etc/ansible/group_vars/vim/init /etc/ansible/host_vars/foosball |
[root@localhost ~]# ansible webservers -uroot -k -m ping -o
SSH password:
192.168.1.32 | SUCCESS => {"changed": false, "ping": "pong"}
192.168.1.31 | SUCCESS => {"changed": false, "ping": "pong"}
三、常用模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | copy模块: 目的:把主控端 /root 目录下的a.sh文件拷贝到到指定节点上 命令:ansible 10.1.1.113 -m copy -a 'src=/root/a.sh dest=/tmp/ owner=root group=root mode=0755' file 模块: 目的:更改指定节点上 /tmp/t .sh的权限为755,属主和属组为root 命令:ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root" cron 模块: 目的:在指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间 命令:ansible all -m cron -a 'name="custom job" minute=\*/3 hour=\* day=\* month=\* weekday=\* job="/usr/sbin/ntpdate 172.16.254.139"' group模块: 目的:在所有节点上创建一个组名为nolinux,gid为2014的组 命令:ansible all -m group -a 'gid=2014 name=nolinux' user模块: 目的:在指定节点上创建一个用户名为nolinux,组为nolinux的用户 命令:ansible 10.1.1.113 -m user -a 'name=nolinux groups=nolinux state=present' 删除用户 命令:ansible 10.1.1.113 -m user -a 'name=nolinux state=absent remove=yes' yum模块: 目的:在指定节点上安装 apache 服务 命令:ansible all -m yum -a "state=present name=httpd" state=latest=>>安装最新版本 service模块: 目的:启动指定节点上的 httpd 服务,并让其开机自启动 命令:ansible 10.1.1.113 -m service -a 'name=httpd state=restarted enabled=yes' script模块: 目的:在指定节点上执行 /root/a .sh脚本(该脚本是在ansible主控端) 命令:ansible 10.1.1.113 -m script -a '/root/a.sh' ping 模块: 目的:检查指定节点机器是否还能连通 命令:ansible 10.1.1.113 -m ping command 模块: 目的:在指定节点上运行 hostname 命令 命令:ansible 10.1.1.113 -m command -a 'hostname' raw模块: 目的:在10.1.1.113节点上运行 ifconfig 命令 命令:ansible 10.1.1.113 -m raw-a 'ifconfig|eth0' get_url模块: 目的:将http: //10 .1.1.116 /favicon .ico文件下载到指定节点的 /tmp 目录下 命令:ansible 10.1.1.113 -m get_url -a 'url=http://10.1.1.116/favicon.ico dest=/tmp' stat模块: 目的:获取远程文件状态信息,包括atime、ctime、mtime、md5、uid、gid等信息 ansible web -m stat -a 'path=/etc/sysctl.conf' synchronize模块: 目的:将主控方 /root/a 目录推送到指定节点的 /tmp 目录下 命令:ansible 10.1.1.113 -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes' 执行效果: delete= yes 使两边的内容一样(即以推送方为主) compress= yes 开启压缩,默认为开启 --exclude=.git 忽略同步.git结尾的文件 mode=pull 更改推送模式为拉取模式 目的:将10.1.1.113节点的 /tmp/a 目录拉取到主控节点的 /root 目录下 命令:ansible 10.1.1.113 -m synchronize -a 'mode=pull src=/tmp/a dest=/root/' 需要更多模块请使用ansible-doc -l查询 |
关于ansbile工具的shell、command、script、raw模块的区别和使用场景
1 2 3 4 5 6 7 8 9 10 11 | command 模块 [执行远程命令] [root@node1 ansible] # ansible testservers -m command -a 'uname -n' script模块 [在远程主机执行主控端的shell /python 脚本 ] (使用相对路径) [root@node1 ansible] # ansible testservers -m script -a '/etc/ansible/test.sh shell模块 [执行远程主机的shell /python 脚本] [root@node1 ansible] # ansible testservers -m shell -a 'bash /root/test.sh' raw模块 [类似于 command 模块、支持管道传递] [root@node1 ansible] # ansible testservers -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print \$2}' |awk -F: '{print \$2}'" |
二、命令参数
1 2 3 4 5 6 7 | $ ansible all -m ping #ping所有节点 默认用当前用户名远程连接到计算机,-u 可以指定用户 1)以bruce身份 ping 所有主机 ansible all -m ping -u bruce 2)用 bruce 用户以 root 身份 ping ansible all -m ping -u bruce -- sudo 3)用 bruce 用户 sudo 到 bruce 用户 ping ansible all -m ping -u bruce -- sudo -- sudo -user bruce |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Usage: ansible <host-pattern> [options] Options: -m MODULE\_NAME, --module-name=MODULE\_NAME 要执行的模块,默认为 command -a MODULE_ARGS, --args=MODULE_ARGS 模块的参数 -u REMOTE_USER, --user=REMOTE_USER ssh 连接的用户名,默认用 root,ansible.cfg 中可以配置 -k, --ask-pass 提示输入 ssh 登录密码,当使用密码验证登录的时候用 -s, -- sudo sudo 运行 -U SUDO_USER, -- sudo -user=SUDO_USER sudo 到哪个用户,默认为 root -K, --ask- sudo -pass 提示输入 sudo 密码,当不是 NOPASSWD 模式时使用 -B SECONDS, --background=SECONDS run asynchronously, failing after X seconds(default=N /A ) -P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using -B (default=15) -C, --check 只是测试一下会改变什么内容,不会真正去执行 -c CONNECTION 连接类型(default=smart) -f FORKS, --forks=FORKS fork 多少个进程并发处理,默认 5 -i INVENTORY, --inventory- file =INVENTORY 指定 hosts 文件路径,默认 default = /etc/ansible/hosts -l SUBSET, --limit=SUBSET 指定一个 pattern,对<host_pattern>已经匹配的主机中再过滤一次 --list-hosts 只打印有哪些主机会执行这个 playbook 文件:不是实际执行该 playbook -M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为 /usr/share/ansible/ -o, --one-line 压缩输出,摘要输出 --private-key=PRIVATE_KEY_FILE 私钥路径 -T TIMEOUT, --timeout=TIMEOUT ssh 连接超时时间,默认 10 秒 -t TREE, --tree=TREE 日志输出到该目录,日志文件名会以主机名命名 - v , --verbose verbose mode (-vvv for more , -vvvv to enable connection debugging) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现