这一节主要介绍ansible的基本概念,常用模块
Ansible是一个配置管理系统configuration management system, ansible 是一个基于python 开发的(集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点)自动化运维工具, 其功能实现基于ssh远程连接服务, ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能, 除了ansible之外,还有salt、chef、puppet 等批量管理工具。
易读的语法:playbook语法基于YAML,YAML是一种以易于人类读写为设计理念的数据格式语言
远程主机无须安装依赖:需要被管理的服务器安装SSH和Python2.5以上版本
基于推送模式:可以直接控制变更在服务器上发生的时间。拉取模式在大规模服务器场景上有较好的扩展性
内置模块:内置大量功能模块,模块具有幂等性的,意味着重复同一个playbook是安全
Linux环境root用户:
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
ansible程序文件
/usr/bin/ansible: 命令行工具
ansible命令通用格式: ansible <host-pattern> [options] [-m module_name] [-a args]
/usr/bin/ansible-doc: 帮助文档 ** 重要 **
/usr/bin/ansible-playbook: 剧本执行工具
/etc/ansible/ansible.cfg: 主配置文件
/etc/ansible/hosts: 管理的主机清单
/etc/ansible/roles: 角色存放处
默认配置文件存储在/etc/ansible/ansible.cfg
ansible寻找ansible.cfg的顺序:
1.ANSIBLE_CONFIG环境变量所指定的文件
2../ansible.cfg当前目录下的ansible.cfg <=======建议和playbook一起,放到当前目录下
3.~/.ansible.cfg 主目录下的.ansible.cfg
4./etc/ansible/ansible.cfg
ansible管理主机的集合称为inventory。inventory文件名称默认为:hosts,也要为以下方式:
存储路径:
/etc/ansible/hosts
/home/
ansible_ssh_host 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user 默认的 ssh 用户名
ansible_ssh_pass ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8) sudo 命令路径(适用于1.8及以上版本)
ansible_connection 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter 目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
ansible_{xxxx}_interpreter 与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
例如:
[root@kickstart auto]# cat hosts
# install python3 etcd patroni
[test2] <-----组名
192.168.150.190 hostname=pg01 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
192.168.150.191 hostname=pg02 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
192.168.150.192 hostname=pg03 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
playbook是Ansible中一个术语,指的是用于配置管理的脚本。想要运行playbook脚本,可能需要以下文件入目录的支持,以使配置更加灵活,标准。
一个playbook的目录基本结构:最简单的可以只包含两个文件:hosts 与.yml的playbook文件
[root@kickstart enmo]# tree /playbooks/enmo
/root/playbooks/enmo
├── config_hosts.yml <------主playbook
├── files <------文件存放目录
├── group_vars <------组变量目录
├── hosts <------inventory文件
├── host_vars <------主机变量目录
├── roles <------将playbook分为多个文件的机制
└── templates <------模板文件,可传入变量
[root@kickstart ~]# ansible --version
ansible [core 2.12.1]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/python38/lib/python3.8/site-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/python38/bin/ansible
python version = 3.8.11 (default, Dec 29 2021, 23:25:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
jinja version = 3.0.3
libyaml = True
[root@kickstart enmo]# ansible test -m ping
192.168.150.190 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.150.192 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.150.191 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
在目标主机上运行ansible脚本中定义的任务
play示例:
每个play必须包含以下两项:
hosts: 一组主机
tasks: 需要在这组主机上运行的任务
其余,都是可选项配置:
name: play的注释,运行play时将这段文字打印出来
vars: 一系列变理与值
tasks: play 中运行的任务;每个task必须包含一个键值对。键是块的名字,值是传递到模块的参数
- hosts: test
remote_user: root
vars_files: /root/auto/group_vars/test
tasks:
- debug: msg='{{hostname}}'
- name: copy iso file
copy: src=/root/CentOS-7-x86_64-Everything-1810.iso dest=/root/CentOS-7-x86_64-Everything-1810.iso
- name: Mount DVD read-only
ansible.posix.mount:
path: /mnt
src: /root/CentOS-7-x86_64-Everything-1810.iso
fstype: iso9660
state: mounted
- name : Create a directory if it does not exist
ansible.builtin.file:
path: /etc/yum.repos.d/bak
state: directory
mode: '0755'
- name: This command will change the working directory to somedir/
ansible.builtin.shell:
cmd: mv *.repo bak
chdir: /etc/yum.repos.d
removes: /etc/yum.repos.d/*.repo
- name: scp yum config file
copy: src=/root/auto/centos7.6.repo dest=/etc/yum.repos.d/centos7.6.repo
- name: yum postgresql rpm packages
yum:
name: "{{ packages }}"
vars:
packages:
- ncurses-devel
- gdbm-devel
- openssl-devel
- readline-devel
- zlib-devel
- sqlite-devel
- tk-devel
- xz-devel
- gcc
- python-psycopg2
state: present
ansible_python_interpreter: /usr/bin/python2
查看ansible配置信息
[root@kickstart enmo]# ansible-config -h
usage: ansible-config [-h] [--version] [-v] {list,dump,view,init} ...
View ansible configuration.
positional arguments:
{list,dump,view,init}
list Print all config options
dump Dump configuration
view View configuration file
init Create initial configuration
optional arguments:
--version show program's version number, config file location, configured module
search path, module location, executable location and exit
-h, --help show this help message and exit
-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging)
查看inventory配置信息
[root@kickstart enmo]# ansible-inventory --list
{
"_meta": {
"hostvars": {
"192.168.150.190": {
"ansible_ssh_pass": "root",
"ansible_ssh_port": 22,
"ansible_ssh_user": "root",
"hostname": "pg05"
},
"192.168.150.191": {
"ansible_ssh_pass": "root",
"ansible_ssh_port": 22,
"ansible_ssh_user": "root",
"hostname": "pg05"
},
"192.168.150.192": {
"ansible_ssh_pass": "root",
"ansible_ssh_port": 22,
"ansible_ssh_user": "root",
"hostname": "pg06"
}
}
},
"all": {
"children": [
"test",
"ungrouped"
]
},
"test": {
"hosts": [
"192.168.150.190",
"192.168.150.191",
"192.168.150.192"
]
}
}
ansible-galaxy命令用来从ansible社区下载分享的role及生成与role相关的初始文件与目录
[root@kickstart playbooks]# ansible-galaxy init --init-path=/root/playbooks/roles postgresql
- Role postgresql was created successfully
[root@kickstart roles]# ls
postgresql
[root@kickstart roles]# tree postgresql/
postgresql/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
| 模块名 | 功能 |
|---|---|
| file | 设置文件、链接文件、目录的属性;删除文件、链接文件、目录 |
| lineinfile | 编辑文件单行内容 |
| replace | 编辑文件多行内容 |
| blockinfile | 编辑文件块内容:插入、更新、删除 |
| copy | 将文件从本地或远程复制到远程 |
| fetch | 将文件从远程复制到本地 |
| template | 向远程复制模板文件把变量写入 |
| synchronize | 向远程复制文件,适合比较大的文件 |
| pip | 管理Python lib库文件 |
| yum | Redhat和Centos管理操作系统rpm包 |
| apt | Ubuntu Debian软件包管理工具 |
| yum_repository | 配置yum源 |
| archive | 归档或压缩文件 |
| unarchive | 解压文件 |
| hostname | 设置主机名 |
| user | 管理操作系统账号 |
| group | 管理用户组 |
| shell | 运行被控端系统命令,支持变量与特殊符号 |
| command | 运行被控端系统命令,不支持变理与特殊符号 ,推荐用shell |
| raw | 和shell 类似,用于没有安装python的环境 |
| script | 传输后在远程节点上运行本地脚本 |
| service | 管理远程节点服务 |
| mount | 挂载文件系统,NFS,ISO等 |
| stat | 查看远程文件的状态 |
| get_url | 用于从http ftp https服务器下载文件 |
| fail | 失败模块,一般与stat模块一块用 |
| debug | 用于脚本调试 |
| ping | 查看到目标端是否连通 |