0x00 Ansiblie命令执行过程
在 ansible 命令后加上
-vvvv
即可
- 加载自己的配置文件 默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的
对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,sleep 0退出
Ansible命令集
ansible # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
ansible-doc # Ansible 模块功能查看工具
ansible-galaxy # 下载/上传优秀代码或Roles模块的官网平台,基于网络的
ansible-playbook# Ansible 定制自动化的任务集编排工具
ansible-pull # Ansible远程执行命令的工具(使用较少,海量机器时使用,对运维的架构能力要求较高)
ansible-vault # Ansible 文件加密工具
ansible-console # Ansible基于Linux Consoble界面可与用户交互的命令执行工具
ansible-doc -l # Ansible模块查看
0x01 install ansible
sudo yum install -y epel-release # 安装 epel 源
sudo yum install -y ansible
0x02 ansible 使用与配置
ansible -i /etc/ansible/host all [options]
-i /etc/ansible/hosts all
指定inventory文件,默认就是使用/etc/ansible/hosts,
其中all是针对hosts定义的所有主机执行,这里也可以指定hosts中定义的组名或模式。
[options]
-m: 指定模块(默认是command模块)
-a: 指定模块的参数
-u: 指定执行远程主机的用户(默认是root)ansible.cfg中可配置
-k: 指定远程主机的密码
-s: 以sudo方式运行
-U: sudo到那个用户(默认是root)
-f: 指定多少个进程并发处理(默认是5)
--private-key=/path:指定私钥路径
-T: ssh连接超时时间(默认(10s)
-t: 日志输出到该目录
-v: 显示详细信息
2.1 ansible 配置文件
/etc/ansible/ansible.cfg
# 常用配置
[defaults]
# inventory = /etc/ansible/hosts
# library = /usr/share/my_modules/ # 存放自己定义的 插件
# remote_tmp = ~/.ansible/tmp # ansible 执行命令时 会在 远程服务器上生成一个临时目录
# local_tmp = ~/.ansible/tmp
# forks = 5 # 启动的进程数
# roles_path = /etc/ansible/roles
2.2 ansible 使用前的配置
- ansible主机 与各主机间做 免密登录
ssh-copyid root@IP - sudo 免密操作
visudo
...
%wheel ALL=(ALL) NOPASSWD: ALL # 打开注释
...
usermod -G wheel towatt
2.3 ansible 的Inventory文件
文件默认为: /etc/ansible/hosts
端口号不是默认设置时,可明确的表示为:
192.168.11.11:2222
可以在配置变量,在ansible 命令中调用
192.168.11.11 hostname=agent01.towatt.com
192.168.11.12 hostname=agent02.towatt.com
ansible all -m hostname -a ‘name={{ hostname }}’
可以使用域名( 需在 /etc/hosts 添加域名解析)
agent01.towatt.com
也可以设置别名,但不是在系统的 host 文件中设置
agent02.towatt ansible_ssh_port=2222 ansible_ssh_host=192.168.11.11
一组相似的 hostname,可简写如下
192.168.5.[231:234]
[a:d].towatt.com
对于每一个 host,你还可以选择连接类型和连接用户名
localhost ansible_connection=local
agent02.towatt.com ansible_connection=ssh ansible_ssh_user=towatt
2.4 下面是一些不常用的东西,可以不必要关注
Inventory 参数的说明
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_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
一个主机文件的例子:
some_host ansible_ssh_port=2222 ansible_ssh_user=manager
aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host ansible_python_interpreter=/usr/local/bin/python
ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
0x03 常用模块操作
列出所有可用模块 : ansible-doc -a 查看模块的使用 : ansible-doc MODE
1. command
ansible自带模块执行命令 如果命令中有 > < | & ‘ ‘ 等符号, 应使用 shell 模块
2. shell
调用bash执行命令 类似 cat /tmp/stanley.md | awk -F’|’ ‘{print $1,$2}’ &> /tmp/stanley.txt 这些复杂命令,即使使用shell也会失败,
3. ansible 中使用 sudo
# yang 用户以 root 身份执行 ping
ansible mytest -m ping -u yang -b --become-user root
4. copy
Options:
- src
- dest
- backup # 当传入的文件和目标文件不一样时,会备份目标文件
- owner # 定义传过去文件的属组
- group
- mode
eg:
ansible -i hosts test -m copy -a 'src=/root/hosts dest=/tmp/fstab backup=yes mode=0644 owner=towatt group=towatt'
ansible -i hosts all -m copy -a 'src=/root/script dest=/tmp/' # 将 script 目录复制到 /tmp 下
5. fetch
- src must' be a file,not a directory.
- dest
eg:
ansible -i hosts all -m fetch -a 'src=/etc/hosts dest=/tmp'
6. file
- group
- owner
- mode
- src
- dest
- state
(Choices: file, link, directory, hard, touch, absent)[Default:
file]
eg:
ansible -i hosts all -m file -a 'src=/tmp/fstab dest=/tmp/fstab.link state=link'
ansible -i hosts all -m file -a 'path=/tmp/scripts owner=tom group=tom state=directory'
# touch the same file, but add/remove some permissions
ansible -i hosts all -m file -a 'path=/tmp/abc state=touch mode="u+rw,g-wx,o-rwx" '
# create a directory if it doesn't exist
ansible -i hosts all -m file -a 'path=/tmp/tt state=directory mode=0644'
7. group
管理一台主机上的 group 组
- gid
- name
- state
(Choices: present, absent)[Default: present]
- system
(Choices: yes, no)[Default: no]
eg:
ansible -i hosts all -m group -a 'name=tom gid=2050 state=present'
8. user
- name
- system # 指定用户为系统用户, [Default: no]
- uid
- comment
- group
- groups # 定义多个组
- home
- password
- shell
- state
(Choices: present, absent)[Default: present]
-remove
(Choices: yes, no)[Default: no]
eg:
ansible -i hosts test -m user -a 'name=tom group=tom comment="ahah" uid=2050'
9. hostname
vim /etc/ansible/hosts
[web:vars] # 定义 web 组的变量
http_port=80
[web]
192.168.11.11 hostname=agent01
192.168.11.12 hostname=agent02
eg:
ansible -i hosts web -m hostname -a 'name={{ hostname }}-{{ http_port }}'
10. yum
- name
- state
(Choices: present, installed, latest, absent, removed)[Default: present]
eg:
ansible -i hosts test -m yum -a 'name=httpd state=latest'
11. service
控制远程主机上的服务
- name
- enable
(Choices: yes, no)[Default: (null)]
- state
(Choices: started, stopped, restarted, reloaded)[Default: (null)]
eg:
ansible -i hosts web -m service -a 'name=httpd state=started'
12. script
eg:
ansible -i host web -m script -a '/tmp/test.sh'
13. cron
- name # 任务的描述
- minute
- hour
- day
- month
- weekday
- job
- state
(Choices: present, absent)[Default: present]
eg:
ansible -i hosts all -m cron -a 'name=test minute=1 hour=2 day=3 month=4 job="/usr/bin/ls /etc/ > /tmp/ls.log" '
shell 模块 与 command 模块的区别
shell 对日常的命令支持较好,
command 的效率比 shell 高,因为 shell 需要调用远程节点的 /bin/bash 环境。
0x04 ansible-console命令
# 切换ansible 组
cd dev
cd test
cd all
# 修改线程数
forks 3
# 可以直接执行命令
root@all (2)[f:10]$ ls
# copy 模块
root@all (2)[f:10]$ copy src=/etc/passwd dest=/tmp/
0x05 ansible-galaxy 命令
直接使用ansible-galaxy 安装一些模块 下载好的模块会放在 /etc/ansible/roles 模块地址: https://galaxy.ansible.com/explore#/
- 用法
~]# ansible-galaxy -h
Usage: ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
Options:
-h, --help show this help message and exit
-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection
debugging)
--version show program's version number and exit
eg:
ansible-galaxy install DavidWittman.redis
0x06 ansible-playbook
1. YAML 语法
- 以 —- 开始,且需顶行首写。
- 次行开始正常写 Playbook 的内容,但一般写明该 Playbook 的功能。
- 使用 # 注释
- 缩进必须统一,不能空格和 tab 混用
- 缩进的级别要一致,同样的缩进代表同样的级别。
- 区分大小写
- K/V 的值可同行写也可换行写。 同行使用:分隔, 换行以-分隔。
- 一个完整的代码块功能的最少元素: name, task
- 一个 name只能包括一个 task
2. 实例
---
- hosts: web
remote_user: root
tasks:
- name: install epel
yum: name=epel-release state=least
- name: install Nginx
yum: name=nginx state=least
- name: config for nginx
copy: src=/etc/ansible/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx state=restartd