Ansible基础 - 02安装与配置
Ansible基础 - 02安装与配置
一、Ansible安装
### 方式一:yum [root@cl-server ~]# yum install epel-release [root@cl-server ~]# yum install ansible ### 方式二:二进制安装 [root@cl-node01 ~]# yum install python-jinja2 PyYAML python-paramiko python-babel python-crypto [root@cl-node01 ~]# wget https://releases.ansible.com/ansible/ansible-2.9.21.tar.gz [root@cl-node01 ~]# tar xf ansible-2.9.21.tar.gz [root@cl-node01 ~]# cd ansible-2.9.21 [root@cl-node01 ansible-2.9.21]# ls bin contrib docs hacking licenses MANIFEST.in PKG-INFO requirements.txt SYMLINK_CACHE.json changelogs COPYING examples lib Makefile packaging README.rst setup.py test
[root@cl-node01 ansible-2.9.21]# python setup.py build running build running build_py creating build creating build/lib creating build/lib/ansible copying lib/ansible/__init__.py -> build/lib/ansible copying lib/ansible/constants.py -> build/lib/ansible copying lib/ansible/context.py -> build/lib/ansible copying lib/ansible/release.py -> build/lib/ansible creating build/lib/ansible/cli copying lib/ansible/cli/__init__.py -> build/lib/ansible/cli ...... [root@cl-node01 ansible-2.9.21]# python setup.py install running install running bdist_egg running egg_info writing requirements to lib/ansible.egg-info/requires.txt writing lib/ansible.egg-info/PKG-INFO ...... Using /usr/lib/python2.7/site-packages Finished processing dependencies for ansible==2.9.21 [root@cl-node01 ansible-2.9.21]# mkdir /etc/ansible [root@cl-node01 ansible-2.9.21]# cp examples/ ansible.cfg hosts scripts/ [root@cl-node01 ansible-2.9.21]# cp examples/* /etc/ansible/
1.1 版本查看
[soupman@cl-server ~]$ ansible --version
ansible 2.9.21
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/home/soupman/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
1.2 安装文件列表
- 配置文件目录:/etc/ansible/执行文件目录:/usr/bin/
- ansible.cfg - 配置文件
- hosts - 主机文件清单
- roles - 配置角色的文件夹,默认为空
- Lib库依赖目录: /usr/lib/python2.7/site-packages/ansible-2.9.21-py2.7.egg/
- Help文档目录: /usr/share/doc/ansible-X.X.X/
- Man文档目录: /usr/share/man/man1/
二、Ansible命令
[root@cl-node01 scripts]# ls -l /usr/bin/ansible*
-rwxr-xr-x 1 root root 171 1月 7 11:18 /usr/bin/ansible
-rwxr-xr-x 1 root root 185 1月 7 11:18 /usr/bin/ansible-config
-rwxr-xr-x 1 root root 193 1月 7 11:18 /usr/bin/ansible-connection
-rwxr-xr-x 1 root root 187 1月 7 11:18 /usr/bin/ansible-console
-rwxr-xr-x 1 root root 179 1月 7 11:18 /usr/bin/ansible-doc
-rwxr-xr-x 1 root root 185 1月 7 11:18 /usr/bin/ansible-galaxy
-rwxr-xr-x 1 root root 191 1月 7 11:18 /usr/bin/ansible-inventory
-rwxr-xr-x 1 root root 189 1月 7 11:18 /usr/bin/ansible-playbook
-rwxr-xr-x 1 root root 181 1月 7 11:18 /usr/bin/ansible-pull
-rwxr-xr-x 1 root root 181 1月 7 11:18 /usr/bin/ansible-test
-rwxr-xr-x 1 root root 183 1月 7 11:18 /usr/bin/ansible-vault
[soupman@cl-server ~]$ ansible
ansible ansible-console ansible-doc-2.7 ansible-playbook ansible-pull-2.7
ansible-2 ansible-console-2 ansible-galaxy ansible-playbook-2 ansible-vault
ansible-2.7 ansible-console-2.7 ansible-galaxy-2 ansible-playbook-2.7 ansible-vault-2
ansible-config ansible-doc ansible-galaxy-2.7 ansible-pull ansible-vault-2.7
ansible-connection ansible-doc-2 ansible-inventory ansible-pull-2
2.1 命令解释
/usr/bin/ansible
Ansible ad-hoc 临时命令执行工具,常用于临时命令的执行/usr/bin/ansible-doc
Ansible 模块功能查看工具/usr/bin/ansible-galaxy
Ansible 下载/上传优秀代码或Roles模块 的官网平台,基于网络的/usr/bin/ansible-playbook
Ansible 定制自动化的任务集编排工具/usr/bin/ansible-pull
Ansible 远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)/usr/bin/ansible-vault
Ansible 文件加密工具/usr/bin/ansible-console
Ansible 基于Linux Consoble界面可与用户交互的命令执行工具
2.2 命令使用
### -vvv 打印详细输出
[root@cl-server ansible]# ansible cl-node01 -vvv -a 'cat /tmp/aa.txt'
### -f 指定并发数
[root@cl-server ansible]# ansible cl-node01 -vvv -a 'cat /tmp/aa.txt' -f 10
### -i 指定别的位置的主机清单hosts
[root@cl-server ansible]# ansible myhost -a 'cat /tmp/aa.txt' -i /etc/ansible/my-hosts
### -m 指定模块
[root@cl-server ansible]# ansible cl-node01 -m shell -a 'cat /tmp/aa.txt'
### 获取主机列表
[root@cl-server ~]# ansible-inventory host --list
### 获取全部模块的信息
[root@cl-server ~]# ansible-doc -l
### 获取指定模块的使用帮助
[root@cl-server ~]# ansible-doc -s MOD_NAME
2.3 命令详解
[root@cl-node01 doc]# ansible
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
[-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k]
[--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
[-c CONNECTION] [-T TIMEOUT]
[--ssh-common-args SSH_COMMON_ARGS]
[--sftp-extra-args SFTP_EXTRA_ARGS]
[--scp-extra-args SCP_EXTRA_ARGS]
[--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
[-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
[-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
[-a MODULE_ARGS] [-m MODULE_NAME]
pattern
# ansible [-f forks] [-m module_name] [-a args]
-a MODULE_ARGS # 模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:"date","pwd"等等
-k,--ask-pass # ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass # ask for su password。su切换密码
-K,--ask-sudo-pass # ask for sudo password。提示密码使用sudo,sudo表示提权操作
--ask-vault-pass # ask for vault password。假设我们设定了加密的密码,则用该选项进行访问
-B SECONDS # 后台运行超时时间
-C # 模拟运行环境并进行预运行,可以进行查错测试
-c CONNECTION # 连接类型使用
-f FORKS # 并行任务数,默认为5
-i INVENTORY # 指定主机清单的路径,默认为/etc/ansible/hosts
--list-hosts # 查看有哪些主机组
-m MODULE_NAME # 执行模块的名字,默认使用 command 模块,如果只执行单一命令可以不用 -m参数
-o # 压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S # 用 su 命令
-R SU_USER # 指定 su 的用户,默认为 root 用户
-s # 用 sudo 命令
-U SUDO_USER # 指定 sudo 到哪个用户,默认为 root 用户
-T TIMEOUT # 指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u REMOTE_USER # 远程用户,默认为 root 用户
-v # 查看详细信息,同时支持-vvv,-vvvv可查看更详细信息
三、命令执行
3.1 基于密码方式的连接
### 方式一:
[opserver]
192.168.234.6 ansible_ssh_user=root ansible_ssh_pass=test9999
### 方式二:
[opserver]
192.168.234.6
[opserver:vars]
ansible_ssh_user=root ansible_ssh_pass=test9999
### 方式三:
[opserver]
192.168.234.6
cat /etc/ansible/group_vars/opserver.yml
ansible_ssh_user:root
ansible_ssh_pass:test9999
3.2 基于SSH key方式连接
实现SSH免密登录
3.3 主机清单
ansible的Host-pattern,用于匹配被控制的主机的列表
- All: 表示所有Inventory中的所有主机。 ansible all –m ping
- *(通配符): ansible "*" -m ping | ansible 192.168.1.* -m ping | ansible "srvs" -m ping
- 或关系: ansible "websrvs:appsrvs" -m ping | ansible "192.168.1.10:192.168.1.20" -m ping
- 逻辑与: 在websrvs组并且在dbsrvs组中的主机 ansible "websrvs:&dbsrvs" –m ping
- 逻辑非: 在websrvs组,但不在dbsrvs组中的主机,此处为单引号 ansible 'websrvs:!dbsrvs' –m ping
- 综合逻辑: ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' –m ping
- 正则表达式: ansible "websrvs:dbsrvs" –m ping | ansible "~(web|db).*\.kunking\.com" –m ping
3.4 返回结果
- 绿色: 被管理端没有被修改
- 黄色: 被管理端发生变更
- 红色: 执行出现故障
3.5 sudo用户执行命令
### 首先使用 visudo 添加sudo权限: adminx ALL=(ALL) NOPASSWD: ALL ### 以adminx sudo至root用户执行ls [root@cl-server ansible]# ansible cl-node01 -m command -u adminx -a 'ls /root' -b --become-user=root -k -K SSH password: ### adminx密码 BECOME password[defaults to SSH password]: ### become-user=root密码 cl-node01 | CHANGED | rc=0 >> anaconda-ks.cfg Readme.txt redis-5.0.12 redis-5.0.12.tar.gz
3.6 常见模块
- command(默认): 不支持管道过滤grep
- shell: 支持管道过滤grep
- script: 在远程主机上执行控制端的脚本
- yum: 安装软件
- yum_repository: 配置yum源
- copy: 拷贝文件到远程主机
- file: 在远程主机创建目录或文件
- service: 启动或停止服务
- mount: 挂载设备
- cron: 执行定时任务
- firewalld: 防火墙设置
- get_url: 下载软件或访问网页
- git: 执行git命令
- user/group: 用户和组
- setup: 目标主机信息
四、配置文件
4.1 配置文件
inventory = /etc/ansible/hosts # 资源清单inventory文件的位置
library = /usr/share/ansible # 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5 # 并发连接数,默认为5
sudo_user = root # 设置默认执行命令的用户
remote_port = 22 # 指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False # 设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60 # 设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log # 指定一个存储ansible日志的文件(默认不记录日志)
4.2 配置文件加载顺序
- ANSIBLE_CONFIG: 环境变量
- ansible.cfg: 当前执行目录下
- .ansible.cfg: ~/.ansible.cfg
- /etc/ansible/ansible.cfg