上篇简单介绍了ansible的概念与架构,也提到了如果想要简单的实现一些批量管控主机的功能,可以轻松上手。这边就主要介绍下如何实现最简单的功能。
从之前的架构图上看能知道,ansible分为了控制节点机与被控节点,首先需要在控制节点上安装ansible软件。
Ansible的模块是用Python来执行的,且默认远程连接的方式是ssh,所以控制节点和被控制端都需要有Python环境,并且被控制端需要启动sshd服务,但通常这两个条件在安装Linux系统时就已经具备了。所以使用Ansible的安装过程只有一个:在控制节点安装Ansible。
环境描述
主机名 | IP地址 | 操作系统版本 | 内核版本 | 角色 |
---|---|---|---|---|
slions_pc1 | 192.168.100.10 | CentOS 7.6.1810 | 3.10.0-957.el7.x86_64 | 控制节点 |
slions_pc2 | 192.168.100.11 | CentOS 7.6.1810 | 3.10.0-957.el7.x86_64 | 被控节点 |
slions_pc3 | 192.168.100.12 | CentOS 7.6.1810 | 3.10.0-957.el7.x86_64 | 被控节点 |
所有的主机上都已启动sshd服务并保持默认配置(监听22端口)。
为了后续控制目标节点方便些,事先在控制节点将所有节点的DNS解析配置好了。
1 | [root@slions_pc1 ~]# cat /etc/hosts |
安装ansible
安装ansible的方式有好多种,不同系统的安装方式可参考:官方文档
我这里就直接使用yum安装了。
1 | wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo |
配置命令补全
从Ansible 2.9版本开始,它支持命令的选项补全功能,它依赖于python的argcomplete插件。
1 | yum install python-argcomplete -y |
最后,退出当前Shell重新进入,或者简单的直接执行如下命令即可:
1 | exec $SHELL |
然后就可以按tab一次或两次补全参数或提示参数。
配置主机互信
Ansible默认是基于ssh连接的,所以要控制其它节点首先需要建立好ssh连接,而建立ssh连接要么需要提供密码,要么需要配置好认证方式。为了方便后文的测试,这里先配置好控制节点和其它被控节点之间的主机互信。
为了避免配置主机互信过程中的交互式询问,这里使用ssh-keyscan工具添加主机认证信息以及sshpass工具(安装Ansible时会自动安装sshpass,也可以yum -y install sshpass安装)直接指定ssh连接密码。
在控制节点生成密钥对。
1 | ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' |
将各节点的主机信息写入控制节点的~/.ssh/known_hosts文件。
1 | for host in 192.168.100.{11,12} slions_pc{2,3};do ssh-keyscan -t rsa $host >> ~/.ssh/known_hosts 2>/dev/null;done |
将控制节点上的ssh公钥分发给各节点:
1 | for host in 192.168.100.{11,12} slions_pc{2,3};do sshpass -p '123' ssh-copy-id root@$host &>/dev/null;done |
以上就完成了ssh主机互信。
ansible初体验
ansible语法
1 | ansible <host-pattern> [-f forks] [-m module_name] [-a args] |
其中:
host-pattern # 被控节点,可以是all,或者配置文件中的主机组名
-f forks # 指定并行处理的进程数
-m module # 指定使用的模块,默认模块为command
-a args # 指定模块的参数
举个例子:
1 | [root@slions_pc1 ~]# ansible localhost -m command -a 'echo hello world!' |
上面的命令是使控制节点自身输出hello world!
ansible模块
ansible有上千个模块,如何能快速找到想要的那个模块呢,当然百度是最快的了。ansible也提供了对应的命令来帮助我们快速寻找,可以使用ansible-doc
。
其中ansible-doc -l |grep 'xxx'
命令可以筛选模块,例如筛选具有复制功能的模块:
1 | [root@slions_pc1 ~]# ansible-doc -l|grep 'copy' |
根据描述,大概找出是否有想要的模块。
找到模块后,想要看看它的功能描述以及用法,可以继续使用ansible-doc命令。
详细的模块描述手册: ansible-doc <$module_name>
只包含模块参数用法的模块描述手册: ansible-doc -s <$module_name>
就如很多编程语言一样,最先开始的是学会输出hello world
,最后通过一个debug
模块来实现。
查看debug模块的用法:
1 | [root@slions_pc1 ~]# ansible-doc -s debug |
常用的就2个参数,msg与var,这两个参数是互斥的,只能使用其中一个。msg可以输出字符串,也可以输出变量的值,var只能输出变量的值。
例如:
1 | [root@slions_pc1 ~]# ansible localhost -m debug -a 'msg="hello world"' |
Ansible中也支持使用变量,这里仅演示最简单的设置变量和引用变量的方式。ansible命令的-e选项或–extra-vars选项可以设置变量。
例如:
1 | [root@slions_pc1 ~]# ansible localhost -m debug -e 'str="hello world"' -a 'var=str' |
Ansible的字符串是可以不用引号去包围的,例如str=hello是允许的,但如果字符串中包含了特殊符号,则可能需要使用引号去包围,例如此处的示例出现了会产生歧义的空格。此外,要区分变量名和普通的字符串,需要在变量名上加一点标注:用 {{ }}包围Ansible的变量,这其实是Jinja2模板的语法。其实不难理解,它的用法和Shell下引用变量使用$符号或${}是一样的,例如echo “hello ${var}”。
ansible配置文件
我们通过yum安装后的ansible会提供默认的ansible配置文件,位置在/etc/ansible/ansible.cfg
。
实际上,ansible支持4种方式指定配置文件,它们的解析顺序是:
ANSIBLE_CFG
: 环境变量中指定的配置文件ansible.cfg
: 当前目录下的ansible.cfg~/ansible.cfg
: 家目录下的ansible.cfg/etc/ansible/ansible.cfg
: 默认的全局配置文件
Ansible配置文件采用ini风格进行配置,每一项配置都使用key=value的方式进行配置。
下面是截取了部分配置文件的配置信息,暂时没有必要都了解,用到哪里时百度即可。
1 | [defaults] |