十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
系统环境:CentOS Linux release 7.5.1804 (Core)
临潭网站建设公司成都创新互联公司,临潭网站设计制作,有大型网站制作公司丰富经验。已为临潭上1000+提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的临潭做网站的公司定做!
ansible版本:ansible 2.9.0
Ansible配置以ini格式存储配置数据,在Ansible中几乎所有配置都可以通过Ansible的Playbook或环境变量来重新赋值。在运行Ansible命令时,命令将会按照以下顺序查找配置文件。
(1)ANSIBLE_CONFIG :
首先,Ansible命令会检查环境变量,及这个环境变量指向的配置文件。
(2)./ansible.cfg :
其次,将会检查当前目录下的ansible.cfg配置文件。
(3)~/.ansible.cfg :
再次,将会检查当前用户home目录下的.ansible.cfg配置文件。
(4)/etc/ansible/ansible.cfg :
最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文件。
大多数的Ansible参数可以通过设置带有ANSIBLE_
开头的环境变量进行配置,参数名称必须都是大写字母,如下配置:
export ANSIBLE_SUDO_USER=root
设置了环境变量之后,ANSIBLE_SUDO_USER
就可以在后续操作中直接引用。
Ansible有很多配置参数,以下是几个默认的配置参数:
inventory = /root/ansible/hosts
library = /usr/share/my_modules/
forks = 5
sudo_user = root
remote_port = 22
host_key_checking = False
timeout = 20
log_path = /var/log/ansible.log
对上面的参数进行说明:
<1> inventory:
该参数表示inventory文件的位置,资源清单(inventory)就是Ansible需要连接管理的一些主机列表。
<2> library:
Ansible的所有操作都使用模块来执行实现,这个library参数就是指向存放Ansible模块的目录。
<3> forks:
设置默认情况下Ansible最多能有多少个进程同时工作,默认5个进程并行处理。具体需要设置多少个,可以根据控制端性能和被管理节点的数量来确定。
<4> sudo_user:
设置默认执行命令的用户,也可以在playbo o k中重新设置这个参数。
<5> remote_port:
指定连接被管理节点的管理端口,默认是22,除非设置了特殊的SSH端口,否则不需要修改此参数。
<6> host_key_checking:
设置是否检查SSH主机的密钥。可以设置为True或False。即ssh的主机再次验证。
<7> timeout:
设置SSH连接的超时间隔,单位是秒。
<8> log_path:
Ansible默认不记录日志,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path。需要注意,模块将会调用被管节点的(r)syslog来记录,执行Ansible的用户需要有写入日志的权限。
将ansible server的ssh公钥分发到各被管节点上。
指定ssh公钥生成格式和存放路径:ssh-keygen -t rsa -f /tmp/temp/id_rsa -N ''
ssh公钥分发目标机:ssh-copy-id root@192.168.246.204
也可以使用ansible自身来批量添加密钥到被控节点上。使用ansible的authorized_key模块即可。
以下是借助expect 工具实现非交互式的s s h- co py- id,免得总是询问远程用户的登录密码。
# 安装expect
yum install -y expect
# 编辑expect脚本
cat auto_sshcopyid.exp
#!/usr/bin/expect
set timeout 10
set user_hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh-copy-id $user_hostname
expect {
"(yes/no)?"
{
send "yes\n"
expect "*password: " { send "$password\n" }
}
"*password: " { send "$password\n" }
}
expect eof
# 编辑调用expect的sehll脚本
#!/bin/bash
#加载系统函数库
. /etc/init.d/functions
ip=$(echo -n "$(seq -s "," 59 61),187" | xargs -d "," -i echo 192.168.246.{})
password="wtf"
for i in $ip
do
ping -c 1 $i > /dev/null
if [ $(echo $?) -eq 0 ];then
/tmp/temp/auto_sshcopyid.exp root@$i $password & >> /tmp/temp/a.log
action "$i is ok" /bin/true
else
action "$i There is no!" /bin/false
fi
done
# 执行shell脚本配置互信
chmod +x /tmp/temp/{sshkey.sh,auto_sshcopyid.exp}
./sshkey.sh
向默认的inventory文件/etc/ansible/hosts中添加上几个被管节点清单。
[test]
## ansible_python_interpreter指定python解释器版本
192.168.246.187 ansible_python_interpreter=/usr/local/python3/bin/python3
192.168.246.188
192.168.246.189
使用ping模块测试被管节点。能成功,说明ansible能控制该节点。
## 单独测试一台node主机
ansible 192.168.246.187 -m ping
192.168.246.187 | SUCCESS => {
"changed": false,
"ping": "pong"
}
## 测试一个主机组
ansible test -m ping
192.168.246.188 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.246.188 port 22: No route to host",
"unreachable": true
}
192.168.246.189 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.246.189 port 22: No route to host",
"unreachable": true
}
192.168.246.187 | SUCCESS => {
"changed": false,
"ping": "pong"
}
如果要指定非root用户运行ansible命令,则加上"--sudo"或"-s"来提升为sudo_user配置项所指定用户的权限。
ansible 192.168.246.187 -m ping -b --become-user=root --become-method=sudo
inventory用于定义ansible要管理的主机列表,可以定义单个主机和主机组。上面的/etc/ansible/hosts就是默认的inventory。下面展示了inventory常用的定义规则。
cat -n /etc/ansible/hosts
1 192.168.100.59:22
2 192.168.100.60 ansible_ssh_pass=123456 ansible_ssh_port=22
3 [nginx]
4 192.168.100.5[7:9]
5 [nginx:vars]
6 ansible_ssh_pass='123456'
7 [webservers:children]
8 nginx
第一行和第二行单独定义主机,第一行带上了连接被管节点的端口,第二行带上了单独传递给ssh的参数,分别是ssh连接时的登录远程用户的密码参数和ssh的连接端口。
第三行和第四行定义的是nginx主机组,该组中包含了192.168.100.57 到59这3台主机。还支持字母的扩展,如"web[a- d]"。
第五行和第六行定义了要传递给nginx主机组的变量。若定义为"[all:vars]"或"[*:vars]"则表示传递给所有主机的变 量。
第七和第八行定义了一个新的主机组webservers,改组的组成员有nginx组。
可以指定多个inventory配置文件,只需在ansible的配置文件如/etc/ansible/ansible.cfg中将inventory指令设置为 对应的文件或目录即可,如果是目录,那么此目录下的所有文件都是inventory文件。
inventory文件中可以使用一些内置变量,绝大多数ansible的连接和权限变量都可以在此使用,见ansible命令解释
。常见的有:
(1)ansible_ssh_host :
ansible使用ssh要连接的主机。
(2)ansible_ssh_port :
ssh的端口。默认为22。
(3)ansible_ssh_user :
ssh登录的用户名。默认为root。
(4)ansible_ssh_pass :
ssh登录远程用户时的认证密码。
(5)ansible_ssh_private_key_file :
ssh登录远程用户时的认证私钥。
(6)ansible_connection :
使用何种模式连接到远程主机。默认值为smart(智能),表示当本地ssh支持持久连接(controlpersist)时采用ssh连接,否则采用python的paramiko ssh连接。
(7)ansible_shell_type :
指定远程主机执行命令时的shell解析器,默认为sh(不是bash,它们是有区别的,也不是全路径)。
(8)ansible_python_interpreter :
远程主机上的python解释器路径。默认为/usr/bin/python。
(9)ansible_*_interpreter :
使用什么解释器。例如,sh、bash、awk、sed、expect、ruby等等。
其中有几个参数可以在配置文件ans ible.cf g中指定,但指定的指令不太一样,以下是对应的配置项:
(1)remote_port:
对应于ansible_ssh_port。
(2)remote_user:
对应于ansible_ssh_user。
(3)private_key_f ile:
对应于ansible_ssh_private_key_f ile。
(4)excutable:
对应于ansible_shell_type。但有一点不一样,excutable必须指定全路径,而后者只需指定 basename。
如果定义了"ansible_ssh_host",那么其前面的主机名就称为别名。例如,以下inventory文件中nginx就是一个别名,真正连接的对象是192.168.246.187。/etc/ansible/hosts
如下:
[test]
nginx ansible_ssh_host=192.168.246.187
#192.168.246.187
192.168.246.188
192.168.246.189
[test:vars]
ansible_ssh_private_key_file=/root/.ssh/rsa_back/id_rsa
ansible_python_interpreter=/usr/local/python3/bin/python3
执行ansible:
ansible test -m ping
nginx | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.246.188 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.246.188 port 22: No route to host",
"unreachable": true
}
192.168.246.189 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.246.189 port 22: No route to host",
"unreachable": true
}
手动指定inventory主机清单文件路径:
ansible test -i /tmp/inventory_file -m ping
本博文是参考马龙帅大佬文章整理生成,属于博主读书笔记,如有侵权,请大佬与我联系,立删!
最后,感谢开源,拥抱开源~