目录
一、Ansible简介
二、安装部署Ansible
2.1、在控制节点安装ansible
2.2、对Linux和Unix受管节点要求
2.3、基于 Microsoft Windows 的受管主机
2.4、受管网络设备
三、Ansible配置文件
3.1、ansible.cfg配置文件推荐做法
3.2、ansible.cfg配置文件内容
四、Ansible清单
五、运行临时命令
Asnible是什么?一种简单的自动化语言,可通过playbooks完美描述IT应用架构。一种自动化引擎,运行playbooks。也就是自动化运维,避免手动操作的误操作,管理功能一致的服务器避免差异。
Ansible中的主机分为 控制节点 和 受管节点。在控制节点上进行操作就可以管理受管节点。
Ansible的安装在控制节点进行。Ansible是用python开发的,要先安装python,再安装ansible。红帽环境直接安装。CentOS环境ansible需要epel源来安装ansible。
sudo yum install epel-release
sudo yum list installed platform-python
sudo yum install ansible
受管节点不需要安装特殊的代理。Ansible 控制节点使用 标准的网络协议连接受管主机,从而确保系统处于指定的状态。
受管主机可能要满足一些要求,具体取决于控制节点连接它们的方式以及它们要运行的模块。 Linux 和 UNIX 受管主机需要安装有 Python,这样才能运行大部分的模块。 对于 RHEL8 和 CentOS8 可以依靠 platform-python 软件包。也可以启用并安装 python36
可以通过修改 Ansible 配置文件中的设置来自定义 Ansible 安装的行为。 Ansible 从控制节点上多个可能的位置之一选择其配置文件。
可以用ansible --version查看当前ansible的配置文件。
推荐做法是在要运行 Ansible 命令的目录中创建 ansible.cfg 文件。目录中也包含任何供 Ansible 项目使用的文件,如清单 inventory 和 playbook,这是用于 Ansible 配置文件的最常用位置。一般不使用 ~/.ansible.cfg 或 /etc/ansible/ansible.cfg 文件。
Ansible配置文件由几个部分组成,每一部分含有以 key = value 键值对形式定义的设置。 每个部分的标题以方括号 [ ] 括起。对于基本操作,使用以下两部分:
[student@workstation ~]$ mkdir -p ansible/roles
[student@workstation ~]$ cd ansible/
[student@workstation ansible]$ vim ansible.cfg
[student@workstation ansible]$ tree
.
├── ansible.cfg
└── roles
1 directory, 1 file
[student@workstation ansible]$ cat ansible.cfg
# [defaults]部分设置 Ansible 操作的默认值
# inventory 清单文件的路径
# remote_user 在受管主机上登录的用户的名称。如果未指定,则使用当前用户的名称
# ask_pass 是否提示输入SSH密码。如果使用SSH公钥身份验证,则可以是 false
# roles_path 查找roles的路径,多个路径用冒号 : 分隔
[defaults]
inventory = /home/student/ansible/inventory
remote_user = devops
ask_pass = false
roles_path = /home/student/ansible/roles
# [privilege_escalation]部分配置 Ansible 如何在受管主机上执行特权升级
# become 指定连接后是否自动在受管主机上切换用户(通常切换为 root)
# become_method 如何切换用户,通常为sudo
# become_user 要在受管主机上切换到的用户(通常是root,这也是默认值)
# become_ask_pass 是否需要为become_method提示输入密码。默认为 false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
[student@workstation ansible]$ ansible --version
ansible 2.9.21
config file = /home/student/ansible/ansible.cfg
configured module search path = ['/home/student/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
ansible命令可以用命令选项覆盖配置文件,具体用 ansible --help 查看。
[student@workstation ansible]$ ansible --help
Privilege Escalation Options:
control how and which user you become as on target hosts
--become-method BECOME_METHOD
privilege escalation method to use (default=sudo #
如何切换用户,通常为sudo), use `ansible-doc -t become -l` to
list valid choices.
--become-user BECOME_USER
run operations as this user (default=root #
要在受管主机上切换到的用户(通常是root,这也是默认值))
-K, --ask-become-pass
ask for privilege escalation password
-b, --become run operations with become (does not imply password
prompting)
Connection Options:
......
-k, --ask-pass ask for connection password
-u REMOTE_USER, --user REMOTE_USER
connect as this user (default=devops #
在受管主机上登录的用户的名称。如果未指定,则使用当前用户的名称)
清单定义 Ansible 将要管理的一批主机。这些主机也可以分配到组中,以进行集 中管理。组可以包含子组,主机也可以是多个组的成员。
可以通过两种方式定义主机清单。静态主机清单可以通过文本文件来定义。动态主机清单可以根据需要使用外部信息提供程序通过脚本或其他程序来生成。
指定清单的推荐做法,是在目录的配置文件 ansible.cfg 中 inventory = 配置。命令行用 --inventory 指定主机列表来覆盖默认的。主机列表写主机名、IP地址,可以用冒号 : 指定连续的范围,可以分组。使用asnible --list-host 检查。
[student@workstation ansible]$ vim inventory
[student@workstation ansible]$ cat inventory
[dev]
servera.lab.example.com
[test]
serverb.lab.example.com
[prod]
serverc.lab.example.com
serverd.lab.example.com
[webservers:children]
prod
[student@workstation ansible]$ ansible webservers --list-host
hosts (2):
serverc.lab.example.com
serverd.lab.example.com
# 默认存在all和ungrouped组
[student@workstation ~]$ ansible -i inventory all --list-host
[student@workstation ~]$ ansible -i inventory ungrouped--list-host
临时命令可以快速执行单个Ansible任务。使用的模块可以用 ansible-doc -l 列出。大多数模块具有幂等性,这表示它们可以安全地多次运行;如果系统已处于正确的状态,它们不会进行任何操作。
ansible servera.lab.example.com -m ping
ansible all -m ping
ansible-doc -l # 列出可用模块
快速进行测试。
[student@workstation ansible]$ ansible dev -m ping
servera.lab.example.com | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
[student@workstation ansible]$ ansible webservers -m shell -a "yum repolist"
[WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command because yum is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
serverd.lab.example.com | CHANGED | rc=0 >>
repo id repo name
appstream CentOS Linux 8 - AppStream
baseos CentOS Linux 8 - BaseOS
extras CentOS Linux 8 - Extras
serverc.lab.example.com | CHANGED | rc=0 >>
repo id repo name
appstream CentOS Linux 8 - AppStream
baseos CentOS Linux 8 - BaseOS
extras CentOS Linux 8 - Extras
比如,使用copy模块向webservers复制文件,并向webservers添加一个john用户指定其为wheel组。-m 指定模块,-a 指定模块参数,参数的使用方法用ansible-doc查看例子即可。
[student@workstation ansible]$ ansible-doc copy
[student@workstation ansible]$ ansible webservers -m copy -a "src=/etc/hosts dest=/tmp owner=student group=student mode=0664"
[student@workstation ansible]$ ansible webservers -m shell -a "ls -l /tmp"
[student@workstation ansible]$ ansible-doc user
[student@workstation ansible]$ ansible webservers -m user -a "name=john comment='Jonh Nash' group=wheel"
[student@workstation ansible]$ ansible webservers -m shell -a "id john"