S_lion's Studio

(二)ansible初体验

字数统计: 2.2k阅读时长: 9 min
2021/08/22 Share

上篇简单介绍了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
2
3
4
5
6
[root@slions_pc1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 slions_pc1
192.168.100.11 slions_pc2
192.168.100.12 slions_pc3

安装ansible

安装ansible的方式有好多种,不同系统的安装方式可参考:官方文档

我这里就直接使用yum安装了。

1
2
3
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum install epel-release.noarch -y
$ yum install ansible -y

配置命令补全

从Ansible 2.9版本开始,它支持命令的选项补全功能,它依赖于python的argcomplete插件。

1
2
$ yum  install python-argcomplete -y
$ activate-global-python-argcomplete

最后,退出当前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
2
3
[root@slions_pc1 ~]# ansible localhost -m command -a 'echo hello world!'
localhost | CHANGED | rc=0 >>
hello world!

上面的命令是使控制节点自身输出hello world!

ansible模块

ansible有上千个模块,如何能快速找到想要的那个模块呢,当然百度是最快的了。ansible也提供了对应的命令来帮助我们快速寻找,可以使用ansible-doc

其中ansible-doc -l |grep 'xxx'命令可以筛选模块,例如筛选具有复制功能的模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@slions_pc1 ~]# ansible-doc -l|grep 'copy'
vsphere_copy Copy a file to a VMware datastore
win_copy Copies files to remote locations on windows hosts
bigip_file_copy Manage files in datastores on a BIG-IP
ec2_ami_copy copies AMI between AWS regions, return new image id
win_robocopy Synchronizes the contents of two directories using Robocopy
copy Copy files to remote locations
na_ontap_lun_copy NetApp ONTAP copy LUNs
icx_copy Transfer files from or to remote Ruckus ICX 7000 series switches
unarchive Unpacks an archive after (optionally) copying it from the local machine
ce_file_copy Copy a file to a remote cloudengine device over SCP on HUAWEI CloudEngine switches
postgresql_copy Copy data between a file/program and a PostgreSQL table
ec2_snapshot_copy copies an EC2 snapshot and returns the new Snapshot ID
nxos_file_copy Copy a file to a remote NXOS device
netapp_e_volume_copy NetApp E-Series create volume copy pairs

根据描述,大概找出是否有想要的模块。

找到模块后,想要看看它的功能描述以及用法,可以继续使用ansible-doc命令。

详细的模块描述手册: ansible-doc <$module_name>

只包含模块参数用法的模块描述手册: ansible-doc -s <$module_name>

就如很多编程语言一样,最先开始的是学会输出hello world,最后通过一个debug模块来实现。

查看debug模块的用法:

1
2
3
4
5
6
7
[root@slions_pc1 ~]# ansible-doc -s debug
- name: Print statements during execution
debug:
msg: # The customized message that is printed. If omitted, prints a generic message.
var: # A variable name to debug. Mutually exclusive with the `msg' option. Be aware that this option already runs in Jinja2 context and has an implicit `{{ }}'
wrapping, so you should not be using Jinja2 delimiters unless you are looking for double interpolation.
verbosity: # A number that controls when the debug is run, if you set to 3 it will only run debug when -vvv or above

常用的就2个参数,msg与var,这两个参数是互斥的,只能使用其中一个。msg可以输出字符串,也可以输出变量的值,var只能输出变量的值。

例如:

1
2
3
4
[root@slions_pc1 ~]# ansible localhost -m debug -a 'msg="hello world"'
localhost | SUCCESS => {
"msg": "hello world"
}

Ansible中也支持使用变量,这里仅演示最简单的设置变量和引用变量的方式。ansible命令的-e选项或–extra-vars选项可以设置变量。

例如:

1
2
3
4
5
6
7
8
[root@slions_pc1 ~]# ansible localhost -m debug -e 'str="hello world"'  -a 'var=str'
localhost | SUCCESS => {
"str": "hello world"
}
[root@slions_pc1 ~]# ansible localhost -m debug -e 'str="hello world"' -a 'msg={{str}}'
localhost | SUCCESS => {
"msg": "hello world"
}

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
2
3
4
5
6
7
8
9
10
11
[defaults]
inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件配置,资源清单就是一些ansible需要链接管理的主机列表。
forks = 5 #设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。
sudo_user = root #这个设置默认执行命令的用户,在playbook中重新设置这个参数。
remote_port = 22 #这个是指定链接被管节点的管理端口,默认22。除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的。
host_key_checking = false #设置是否检查SSH主机的秘钥。可以设置为True或者False。
timeout = 60 #设置SSH链接的超时间隔,单位是秒。
log_path = /var/log/ansible.log #系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储Ansible日志的文件
poll_interval = 15 #异步执行任务的时候多久检查一次任务装填
transport = smart #选择远程的工具 默认情况下就是smart(智能)模式 自动选择连接方式
module_set_locale #设置本地的环境变量
CATALOG
  1. 1. 环境描述
  2. 2. 安装ansible
  3. 3. 配置主机互信
  4. 4. ansible初体验
    1. 4.1. ansible语法
    2. 4.2. ansible模块
  5. 5. ansible配置文件