上图对应的模块功能如下:
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用
补充:
(1)Ansible使用者来源于多种维度,分为以下几种方式:
(2)Ansible工具集(ansible命令是Ansible的核心工具,总指挥)
(3)作用对象
应用部署
配置管理
任务流编排
适用于网络管理员、系统运维、应用运维、桌面运维、DevOps、基础架构运维等多领域运维行业,上手快,效率高。
/etc/ansible
/etc/ansible/ansible.cfg #配置文件
/etc/ansible/hosts #主机库(host inventory)管理被监控的主机
/usr/bin/ansible #主程序
/usr/bin/ansible-doc #文档
/usr/bin/ansible-playbook #剧本
实验环境:
虚拟机名称 | ip | 版本 | 角色 |
---|---|---|---|
server1 | 172.25.1.1 | 7.5 | ansible |
server2 | 172.25.1.2 | 7.5 | 远程主机hosts |
server3 | 172.25.1.3 | 7.5 | 远程主机hosts |
步骤一:配置EPEL源
vim /etc/yum.repos.d/epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=0
yum clean all
yum repolist
步骤二:安装ansible
yum install ansible -y
ansible配置文件查找顺序
检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg); ~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件; /etc/ansible.cfg检查etc目录的配置文件。
定义Inventory(主机列表)
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的inventory file为/etc/ansible/hosts。 inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。
Inventory文件格式:
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明。
[webservers]
www1.com:2222
www2.com
[dbservers]
db1.com
db2.com
db3.com
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,例如:
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
主机变量: 可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:
[webservers]
www1.com http_port=80 maxRequestsPerChild=808
www2.com http_port=8080 maxRequestsPerChild=909
组变量
[webservers] #组
www1.com
www2.com
[webservers:vars] #组变量
ntp_server=ntp.com
nfs_server=nfs.com
步骤一:将server2和server3添加到Ansible管理的主机中:
vim /etc/ansible/hosts #定义inventory
[test] #定义组test,将server2和server3添加到组中
172.25.1.2
172.25.1.3
步骤二:定义好inventory后可以调用ping模块来检测网络是否可达
ansible test -m ping #-m指定调用模块
上述报错是因为ssh服务需要密码登陆,改正:
ansible test -m ping -k #-k指使用密码登陆,命令行会提示输入SSH密码
上述报错是因为用户ssh访问时,会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。root用户第一次登陆server2, ~ /.ssh/known_host中无server2的公钥,所以登陆失败。解决方法:
ssh 172.25.1.2 #默认以root身份登陆
ansible test -m ping -k
命令参数
参数 | 作用 |
---|---|
-m | 要执行的模块,默认为command |
-a | 模块的参数 |
-u | ssh连接的用户名,默认用root,ansible.cfg中可以配置 |
-k | 提示输入ssh登录密码,当使用密码验证的时候用 |
-s | sudo运行 |
-U | sudo到哪个用户,默认为root |
-b,–become | 变成hosts主机中的哪个用户身份,拥有其权限 |
-K | 提示输入sudo密码,当不是NOPASSWD模式时使用 |
-C | 只是测试一下会改变什么内容,不会真正去执行 |
-c | 连接类型(default=smart) |
-f | fork多少进程并发处理,默认为5个 |
-i | 指定hosts文件路径,默认default=/etc/ansible/hosts |
-I | 指定pattern,对已匹配的主机中再过滤一次 |
–list-host | 只打印有哪些主机会执行这个命令,不会实际执行 |
-M | 要执行的模块路径,默认为/usr/share/ansible |
-o | 压缩输出,摘要输出 |
–private-key | 私钥路径 |
-T | ssh连接超时时间,默认是10秒 |
-t | 日志输出到该目录,日志文件名以主机命名 |
-v | 显示详细日志 |
ansible命令使用场景:
(1)-a 命令参数,使用command模块远程执行命令
ansible test -a hostname -k
#模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”,“df”,“uptimer”(查看系统平均负载)等等
(2)-m 要执行的参数,使用copy模块远程执行命令
ansible test -m copy -a "src=test.sh dest=/tmp/test.sh mode=755" -k
ansible test -m shell -a "/tmp/test.sh" -k
shell模块:让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等
linux机器都禁止使用root远程登陆,更安全的做法是用普通用户登陆,分发任务。
(1)在ansible主机上和两台hosts主机上创建普通用户devops,用于ansible任务分发与执行。
保证ansible与hosts主机上devops用户id相同
(2)在两台hosts主机上对普通用户devops下方权力
visudo
devops ALL=(ALL) NOPASSWD: ALL
server2:
server3:
(3)在ansible管理机生成ssh公私钥文件,并分发到其他机器
ssh-keygen #生成密钥
ls 用户家目录/.ssh/#查看密钥
ssh-copy-id 172.25.1.2 #发放密钥
ssh-copy-id 172.25.1.3
测试:
(4)在ansible管理机上普通用户家目录下编辑ansible.cfg 配置文件和hosts 主机库(host inventory)文件
mkdir ansible
cd ansible/
vim ansible.cfg
[defaults]
inventory = ./hosts #inventory文件路径
vim hosts
[test]
172.25.1.2
[db]
172.25.1.3
检测文件配置以及免密设置是否成功:
ansible test -m ping #对test组内主机调用ping模块
ansible db -m ping #对db组内主机调用ping模块
ansible all -m ping #对所有组内主机调用ping模块
(5)使用-b连接hosts主机,拥有hosts主机上root(默认)用户的权限
ansible test -m copy -a "src=test.sh dest=/mnt/test.sh" -b
不使用-b进行模块copy时,会因权限问题报错,文件复制不过去,使用-b,文件传输到hosts主机上时切换身份,调用sudo,执行其权力。
(6)-u 指定ssh连接的用户名,连接到hosts主机后,身份为指定用户,指定用户必须存在
每次输入命令-b、-u指定用户权限太麻烦,解决方法:
(7)在ansible.cfg文件中添加配置
remote_user: devops #在远程主机上以devops用户身份执行任务
become: True #是否允许身份切换
become_method: sudo #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo,被控主机为centos的话需要设置become_method为su
become_user: root #切换成什么用户身份,默认为root。设置为root账户,相当于我们以普通账户登入到远程主机时,再使用su - root切换为root账户。
ansible_become_pass=False #使用root账户,则这里要写的就是root账户的密码,此处设置为Flase因为已经做过免密登陆
复制 /etc/ansible/ansible.cfg文件340~344行内容:
粘贴到/home/devops/ansible/ansible.cfg中
测试:
注:在hosts主机上visudo中设置的devops用户权限,是为了当ansible使用devops身份调用hosts主机后在远程主机上以devops用户身份切换到root用户,通过sudo命令,切换身份。
Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts
定义主机和组
定义组嵌套及组变量
[apache]
server1
server2
[nginx]
server3
server4
[webservers:children] # 定义主机组之间的继承关系我们使用”:children”来表示
apache
nginx
[webservers:vars]
ntp_server=time1.aliyun.com
组与组之间可以相互调用,并且可以向组中的主机指定变量。不过,这些变量只能在Ansible-playbook中使用,而Ansible不支持。
定义独立文件保存某一类变量
在inventory主文件中保存所有的变量并不是最佳的方式,还可以独立保存在文件中:
变量的检索位置
匹配所有主机,all或*号功能相同
对多台主机或多个组同时执行,相互之间用冒号分隔即可
ansible “web1:web2” -m ping
编辑inventory文件:
在webserver组但不在database组的主机,用感叹号表示
ansible ‘webserver:&database’ -m ping
模糊匹配
*.exampe.com
www*.com:database