Ansible--快速入门
程序员文章站
2022-06-28 23:39:20
Ansible快速入门 介绍 Ansible是一款简单的运维自动化工具,只需要使用ssh协议连接就可以来进行系统管理,自动化执行命令,部署等任务。 Ansible的特点 1、ansible不需要单独安装客户端,也不需要启动任何服务2、ansible是python中的一套完整的自动化执行任务模块3、a ......
ansible快速入门
介绍
ansible
是一款简单的运维自动化工具,只需要使用ssh
协议连接就可以来进行系统管理,自动化执行命令,部署等任务。
ansible的特点
1、ansible不需要单独安装客户端,也不需要启动任何服务
2、ansible是python中的一套完整的自动化执行任务模块
3、ansible playbook 采用yaml配置,对于自动化任务执行过一目了然
ansible组成结构
-
ansible
是ansible
的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。 -
ansible playbook
任务剧本(又称任务集),编排定义ansible
任务集的配置文件,由ansible
顺序依次执行,yaml
格式。 -
inventory
ansible
管理主机的清单,默认是/etc/ansible/hosts
文件。 -
modules
ansible
执行命令的功能模块,ansible2.3
版本为止,共有1039
个模块。还可以自定义模块。 -
plugins
插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。 -
api
提供给第三方程序调用的应用程序编程接口。
环境准备
ip | 系统 | 主机名 | 描述 |
---|---|---|---|
192.168.1.30 | centos7 | ansible | ansible管理节点 |
192.168.1.31 | centos7 | linux.node01.com | 被管理节点1 |
192.168.1.32 | centos7 | linux.node02.com | 被管理节点2 |
192.168.1.33 | centos7 | linux.node03.com | 被管理节点3 |
192.168.1.36 | centos6 | linux.node06.com | 被管理节点6 |
ansible安装
1)配置epel
源
[root@ansible ~]# wget -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@ansible ~]# yum clean all [root@ansible ~]# yum makecache
2)安装ansible
[root@ansible ~]# yum -y install ansible # 查看ansible版本 [root@ansible ~]# ansible --version ansible 2.8.0 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, aug 4 2017, 00:39:18) [gcc 4.8.5 20150623 (red hat 4.8.5-16)]
ansible inventory文件
inventory
文件通常用于定义要管理的主机的认证信息,例如ssh
登录用户名、密码以及key
相关信息。可以同时操作一个组的多台主机,组与主机组之间的关系都是通过inventory
文件配置。配置文件路径为:/etc/ansible/hosts
基于密码连接
[root@ansible ~]# vim /etc/ansible/hosts # 方法一 主机+端口+密码 [webserver] 192.168.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" 192.168.1.32 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" 192.168.1.33 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" 192.168.1.36 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" # 方法二 主机+端口+密码 [webserver] 192.168.1.3[1:3] ansible_ssh_user=root ansible_ssh_pass="123456" # 方法二 主机+端口+密码 [webserver] 192.168.1.3[1:3] [webserver:vars] ansible_ssh_pass="123456"
基于秘钥连接
基于秘钥连接需要先创建公钥和私钥,并发送给被管理机器
1)生成公私钥
[root@ansible ~]# ssh-keygen [root@ansible ~]# for i in {1,2,3,6}; do ssh-copy-id -i 192.168.1.3$i ; done
2)配置连接
[root@ansible ~]# vim /etc/ansible/hosts # 方法一 主机+端口+密钥 [webserver] 192.168.1.31:22 192.168.1.32 192.168.1.33 192.168.1.36 # 方法一 别名主机+端口+密钥 [webserver] node1 ansible_ssh_host=192.168.1.31 ansible_ssh_port=22 node2 ansible_ssh_host=192.168.1.32 ansible_ssh_port=22 node3 ansible_ssh_host=192.168.1.33 ansible_ssh_port=22 node6 ansible_ssh_host=192.168.1.36 ansible_ssh_port=22
主机组的使用
# 主机组变量名+主机+密码 [apache] 192.168.1.36 192.168.1.33 [apache.vars] ansible_ssh_pass='123456' # 主机组变量名+主机+密钥 [nginx] 192.168.1.3[1:2] # 定义多个组,把一个组当另外一个组的组员 [webserver:children] #webserver组包括两个子组:apache nginx apache nginx
临时指定inventory
1)先编辑一个主机定义清单
[root@ansible ~]# vim /etc/dockers [dockers] 192.168.1.31 ansible_ssh_pass='123456' 192.168.1.32 192.168.1.33
2)在执行命令是指定inventory
[root@ansible ~]# ansible dockers -m ping -i /etc/dockers -o 192.168.1.33 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"} 192.168.1.32 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"} 192.168.1.31 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
inventory内置参数
ansible ad-hoc
ad-hoc —— 临时的,在ansible
中是指需要快速执行,并且不需要保存的命令。说白了就是执行简单的命令——一条命令。对于复杂的命令则为playbook
,类似于saltstack
的state sls
状态文件。
ansible命令格式
1)常用命令参数
[root@ansible ~]# ansible -h usage: ansible <host-pattern> [options] -a module_args #模块参数 -c, --check #检查语法 -f forks #并发 --list-hosts #列出主机列表 -m module_name #模块名字 -o 使用精简的输出
2)示例
[root@ansible ~]# ansible webserver -m shell -a 'uptime' -o 192.168.1.36 | changed | rc=0 | (stdout) 13:46:14 up 1 day, 9:20, 4 users, load average: 0.00, 0.00, 0.00 192.168.1.33 | changed | rc=0 | (stdout) 21:26:33 up 1 day, 8:51, 3 users, load average: 0.00, 0.01, 0.05 192.168.1.31 | changed | rc=0 | (stdout) 21:26:33 up 1 day, 8:50, 3 users, load average: 0.00, 0.01, 0.05 192.168.1.32 | changed | rc=0 | (stdout) 21:26:33 up 1 day, 8:59, 3 users, load average: 0.00, 0.01, 0.05
3)命令说明
host-pattern格式
目标target
主机,主机组匹配方式
主机的匹配
# 一台目标主机 [root@ansible ~]# ansible 192.168.1.31 -m ping # 多台目标主机 [root@ansible ~]# ansible 192.168.1.31,192.168.1.32 -m ping # 所有目标主机 [root@ansible ~]# ansible all -m ping
组的匹配
# 组的配置信息如下:这里定义了一个nginx组和一个apache组 [root@ansible ~]# ansible nginx --list hosts (2): 192.168.1.31 192.168.1.32 [root@ansible ~]# ansible apache --list hosts (3): 192.168.1.36 192.168.1.33 192.168.1.32 # 一个组的所有主机匹配 [root@ansible ~]# ansible apache -m ping # 匹配apache组中有,但是nginx组中没有的所有主机 [root@ansible ~]# ansible 'apache:!nginx' -m ping -o 192.168.1.36 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"} 192.168.1.33 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"} # 匹配apache组和nginx组中都有的机器(并集) [root@ansible ~]# ansible 'apache:&nginx' -m ping -o 192.168.1.32 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"} # 匹配apache组nginx组两个组所有的机器(并集);等于ansible apache,nginx -m ping [root@ansible ~]# ansible 'apache:nginx' -m ping -o 192.168.1.32 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"} 192.168.1.31 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"} 192.168.1.33 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"} 192.168.1.36 | success => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}