Ansible是一个部署一群远程主机的工具;Ansible通过SSH协议实现远程节点和管理节点之间的通信。理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。Ansible是python开发的,故依赖一些python库和组件,如:paramiko,PyYaml和jinja三个关键组件,我们不需要在节点中安装任何客户端、
ansible系统由管理节点和被管理节点组成,Ansible 在管理节点将 Ansible 模块通过SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN、GIT 等来管理自定义模块及编排。
由上面的图可以看到 Ansible 的组成由一下几个部分组成:
Ansible: ansible的核心模块
Host Inventory:主机清单,也就是被管理的主机列表
Playbooks:ansible的剧本,可想象为将多个任务放置在一起,一块执行
Core Modules:ansible的核心模块
Custom Modules:自定义模块
Connection Plugins:连接插件,用于与被管控主机之间基于SSH建立连接关系
Plugins:其他插件,包括记录日志等
ansible执行自动化任务,分为两种执行放:
主机 | IP | 角色 | 安装软件 |
cong11 | 192.168.121.11 | ansible管理服务器 | ansible |
cong12 | 192.168.121.12 | clent | |
cong13 | 192.168.121.13 | clent |
注:运行ansible时,需要关闭SElinux,或者让SELinux放行Ansible的操作
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库
[root@cong11 ~]# yum install -y epel-release
[root@cong11 ~]# yum install -y ansible
通过rpm -ql ansible可以看到有很多文件,主要是配置文件和和可执行文件,以及所依赖的python库文件。
ansible的主配置文件:/etc/ansible/ansible.cfg
这个文件主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改。
主机清单文件:/etc/ansible/hosts
这个配置文件就是默认主机清单配置文件,可通过ansible.cfg重新定义的;
如定义一组主机:[web_servers] 其中不能包含特殊字符下划线可以,其他特殊字符都不可以使用。
[web_servers]
192.168.121.12
192.168.121.13
除了以上两个重要的配置文件还有三个重要的可执行文件分别是:
nsible 主执行程序,一般用于命令行下执行
ansible-playbook 执行playbook中的任务
ansible-doc 获取各模块的帮助信息
在前面了解了ansible的两种运行方式后,我们来看下使用命令行方式怎么测下主机的运行,如果想要进行测试,需要将被管理的主机添加到/etc/ansible/hosts里。
ansible基于ssh连接指定的远程主机,可以写端口,用户,密码。
[root@cong11 ~]# vim /etc/ansible/hosts
文件 /etc/ansible/hosts 维护着Ansible中被管理服务器的清单。书写格式可以参考/etc/ansible/hosts文件的注释说明。在文件最后追加以下内容
[web_servers]
192.168.121.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123192.168.121.13 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123
其中,中括号里的web_servers是组名,组名下方为该组包括的主机,每一行定义一个主机,组名需要唯一,而组中的一台主机则可以同时属于几个不同的组。
ansible_ssh_port:指定ssh端口(如果是默认端口22,此参数可以省略)
ansible_ssh_user:指定 ssh 用户
ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)
ansible_sudo_pass:指明 sudo 时候的密码
[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -m ping
-i # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
-m # 指定使用的ping模块
web_servers #在主机清单文件中定义的组名(组名建议不要包括特殊字符)
报错:
错误原因:
出现上述错误原因很简单,我们第一次ssh登录一台机器都需要在ansible服务器上保存目标主机的fingerprint指纹,也就是我们看到的这个页面
解决方法:
方法1:
修改/etc/ansible/ansible.cfg文件
需要添加的就是我们图中红箭头指的配置,意思是将公钥认证检查关闭,这样我们就可以正常的访问被管理节点了
方法2:
手动连接一下/etc/ansible/hosts主机清单中的主机,这样就可以在ansible服务器上保存目标主机的fingerprint指纹。后期可以正常连接了
[root@cong11 ~]# ssh [email protected]
[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -m ping
一般来说,在/etc/ansible/hosts中使用明文密码不安全,所以增加主机无密码访问(基于密钥对验证)。在Ansible服务端生成密钥,并且复制公钥到节点中。
[root@cong11 ~]# ssh-keygen
将公钥传到两个节点服务器里
[root@cong11 ~]# for ip in 12 13 ; do ssh-copy-id [email protected].$ip ; doneAnsible
[root@cong11 ~]# vim /etc/ansible/hosts
[web_servers]
nginx01 ansible_ssh_host=192.168.121.12 ansible_ssh_port=22 ansible_ssh_user=root
nginx02 ansible_ssh_host=192.168.121.13 ansible_ssh_port=22 ansible_ssh_user=root
anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]
ansible详细参数:
-v #详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
-i #指定清单文件(hosts)的路径,默认是在 /etc/ansible/hosts
-m #指定使用的module名称,默认使用 command模块
-a #指定module模块的参数
-u #ssh连接的用户名,默认用root,ansible.cfg中可以配置
-k #提示输入ssh登录密码,当使用密码验证的时候用
-s,--sudo 被改成 -b,--become
-U,--sudo-user被改成 --become-user
-K, --ask-become-pass:使用--become或者--become-user时使用的密码认证(即提示输入sudo密码,当不是NOPASSWD模式时使用)。-C #测试此命令执行会改变什么内容,不会真正的去执行
-f FORKS, --forks=FORKS:并行线程数量,当有数量巨大的机器需要配置,可以使用高并发线程,默认是5个。
--list-host:只打印有哪些主机会执行这个命令,不会实际执行ansible-doc详细参数:
ansible-doc -l #列出所有的模块列表
ansible-doc -s 模块名 #查看指定模块的参数 -s, --snippet # [ˈsnɪpɪt] 片断
[root@cong11 ~]# ansible web_servers -m command -a "uptime"
说明:-m:指定ansible要调用的模块;-a:指定具体命令。省略-m选项,默认使用command模块。
[root@cong11 ~]# ansible -m command -a "useradd user1" web_servers
给Ansible被管理节点中的user1用户添加密码
[root@cong11 ~]# ansible 192.168.121.12 -m shell -a "echo "user1:123" | chpasswd"
修改/etc/ansible/hosts文件,内容如下
[root@cong11 ~]# vim /etc/ansible/hosts
[web_servers]
192.168.121.12
192.168.121.13
-m指定ping模块,以user1用户执行ping存活检测。如果不指定用户,在远程机器上默认是以root用户执行。
[root@cong11 ~]# ansible 192.168.1.12 -m ping -u user1 -k
以user1用户sudo到root执行ping存活检测。这种方式需要在远程主机的/etc/sudoers文件中配置user1用户,如果没有配置NOPASSWD,则需要加上-K选项。
远程主机/etc/sudoers文件添加如下:
user1 ALL=(root)NOPASSWD: ALL
[root@cong11 ~]# ansible 192.168.121.12 -m ping -u user1 -k -b
把上述的user1 ALL=(root)NOPASSWD: ALL换成user1 ALL=(root) ALL,再次执行
[root@cong11 ~]# ansible 192.168.121.12 -m ping -u user1 -k -b
发现报错了,这个时候由于远程机器的user1用户不能免密到root用户,所以,执行方式改成如下,加-K(大写)选项
[root@cong11 ~]# ansible 192.168.121.12 -m ping -u user1 -k -b -K
[root@cong11 ~]# ansible all -a "ls" --list-hosts
总结:ansible指定要执行操作的被管理节点或组
1、指定执行机器
注意:ip需要在/etc/ansible/hosts提前里面配置
#指定192.168.1/24段的所有机器
ansible 192.168.1.* -m ping
#指定one、 two两台机器
ansible one.example.com:two.example.com -m ping
2、使用分组过滤
#指定A组
A
#指定A和B两个组
A:B
#指定在A组但不在B组
A:\!B #\表示转义符
#指定同时在A组和B组
A:\&B