0x00 Ansiblie命令执行过程

在 ansible 命令后加上 -vvvv 即可

  1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
    2. 加载自己对应的模块文件,如command
    3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的
    对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
    4. 给文件+x执行
    5. 执行并返回结果
    6. 删除临时py文件,sleep 0退出

Ansible命令集

  1. ansible # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
  2. ansible-doc # Ansible 模块功能查看工具
  3. ansible-galaxy # 下载/上传优秀代码或Roles模块的官网平台,基于网络的
  4. ansible-playbook# Ansible 定制自动化的任务集编排工具
  5. ansible-pull # Ansible远程执行命令的工具(使用较少,海量机器时使用,对运维的架构能力要求较高)
  6. ansible-vault # Ansible 文件加密工具
  7. ansible-console # Ansible基于Linux Consoble界面可与用户交互的命令执行工具
  8. ansible-doc -l # Ansible模块查看

0x01 install ansible

  1. sudo yum install -y epel-release # 安装 epel 源
  2. sudo yum install -y ansible

0x02 ansible 使用与配置

  1. ansible -i /etc/ansible/host all [options]
  2. -i /etc/ansible/hosts all
  3. 指定inventory文件,默认就是使用/etc/ansible/hosts
  4. 其中all是针对hosts定义的所有主机执行,这里也可以指定hosts中定义的组名或模式。
  5. [options]
  6. -m 指定模块(默认是command模块)
  7. -a 指定模块的参数
  8. -u 指定执行远程主机的用户(默认是root)ansible.cfg中可配置
  9. -k 指定远程主机的密码
  10. -s sudo方式运行
  11. -U sudo到那个用户(默认是root)
  12. -f 指定多少个进程并发处理(默认是5)
  13. --private-key=/path:指定私钥路径
  14. -T ssh连接超时时间(默认(10s)
  15. -t 日志输出到该目录
  16. -v 显示详细信息

2.1 ansible 配置文件

/etc/ansible/ansible.cfg

  1. # 常用配置
  2. [defaults]
  3. # inventory = /etc/ansible/hosts
  4. # library = /usr/share/my_modules/ # 存放自己定义的 插件
  5. # remote_tmp = ~/.ansible/tmp # ansible 执行命令时 会在 远程服务器上生成一个临时目录
  6. # local_tmp = ~/.ansible/tmp
  7. # forks = 5 # 启动的进程数
  8. # roles_path = /etc/ansible/roles

2.2 ansible 使用前的配置

  • ansible主机 与各主机间做 免密登录
    ssh-copyid root@IP
  • sudo 免密操作
    1. visudo
    2. ...
    3. %wheel ALL=(ALL) NOPASSWD: ALL # 打开注释
    4. ...
    5. usermod -G wheel towatt

2.3 ansible 的Inventory文件

文件默认为: /etc/ansible/hosts

  • 端口号不是默认设置时,可明确的表示为:

    1. 192.168.11.11:2222
  • 可以在配置变量,在ansible 命令中调用

    1. 192.168.11.11 hostname=agent01.towatt.com
    2. 192.168.11.12 hostname=agent02.towatt.com
  • ansible all -m hostname -a ‘name={{ hostname }}’

  • 可以使用域名( 需在 /etc/hosts 添加域名解析)

    1. agent01.towatt.com
  • 也可以设置别名,但不是在系统的 host 文件中设置

    1. agent02.towatt ansible_ssh_port=2222 ansible_ssh_host=192.168.11.11
  • 一组相似的 hostname,可简写如下

    1. 192.168.5.[231:234]
    2. [a:d].towatt.com
  • 对于每一个 host,你还可以选择连接类型和连接用户名

    1. localhost ansible_connection=local
    2. agent02.towatt.com ansible_connection=ssh ansible_ssh_user=towatt

2.4 下面是一些不常用的东西,可以不必要关注

  • Inventory 参数的说明

    1. ansible_ssh_host
    2. 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
    3. ansible_ssh_port
    4. ssh端口号.如果不是默认的端口号,通过此变量设置.
    5. ansible_ssh_user
    6. 默认的 ssh 用户名
    7. ansible_ssh_pass
    8. ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass SSH 密钥)
    9. ansible_sudo_pass
    10. sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
    11. ansible_sudo_exe (new in version 1.8)
    12. sudo 命令路径(适用于1.8及以上版本)
    13. ansible_connection
    14. 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
    15. ansible_ssh_private_key_file
    16. ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
    17. ansible_shell_type
    18. 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 'fish'.
    19. ansible_python_interpreter
    20. 目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python
    21. 不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
    22. ansible_python_interpreter 的工作方式相同,可设定如 ruby perl 的路径....
  • 一个主机文件的例子:

    1. some_host ansible_ssh_port=2222 ansible_ssh_user=manager
    2. aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
    3. freebsd_host ansible_python_interpreter=/usr/local/bin/python
    4. 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

  1. # yang 用户以 root 身份执行 ping
  2. ansible mytest -m ping -u yang -b --become-user root

4. copy

  1. Options:
  2. - src
  3. - dest
  4. - backup # 当传入的文件和目标文件不一样时,会备份目标文件
  5. - owner # 定义传过去文件的属组
  6. - group
  7. - mode
  8. eg:
  9. ansible -i hosts test -m copy -a 'src=/root/hosts dest=/tmp/fstab backup=yes mode=0644 owner=towatt group=towatt'
  10. ansible -i hosts all -m copy -a 'src=/root/script dest=/tmp/' # 将 script 目录复制到 /tmp 下

5. fetch

  1. - src must' be a file,not a directory.
  2. - dest
  3. eg:
  4. ansible -i hosts all -m fetch -a 'src=/etc/hosts dest=/tmp'

6. file

  1. - group
  2. - owner
  3. - mode
  4. - src
  5. - dest
  6. - state
  7. (Choices: file, link, directory, hard, touch, absent)[Default:
  8. file]
  9. eg:
  10. ansible -i hosts all -m file -a 'src=/tmp/fstab dest=/tmp/fstab.link state=link'
  11. ansible -i hosts all -m file -a 'path=/tmp/scripts owner=tom group=tom state=directory'
  12. # touch the same file, but add/remove some permissions
  13. ansible -i hosts all -m file -a 'path=/tmp/abc state=touch mode="u+rw,g-wx,o-rwx" '
  14. # create a directory if it doesn't exist
  15. ansible -i hosts all -m file -a 'path=/tmp/tt state=directory mode=0644'

7. group

管理一台主机上的 group 组

  1. - gid
  2. - name
  3. - state
  4. (Choices: present, absent)[Default: present]
  5. - system
  6. (Choices: yes, no)[Default: no]
  7. eg:
  8. ansible -i hosts all -m group -a 'name=tom gid=2050 state=present'

8. user

  1. - name
  2. - system # 指定用户为系统用户, [Default: no]
  3. - uid
  4. - comment
  5. - group
  6. - groups # 定义多个组
  7. - home
  8. - password
  9. - shell
  10. - state
  11. (Choices: present, absent)[Default: present]
  12. -remove
  13. (Choices: yes, no)[Default: no]
  14. eg:
  15. ansible -i hosts test -m user -a 'name=tom group=tom comment="ahah" uid=2050'

9. hostname

  1. vim /etc/ansible/hosts
  2. [web:vars] # 定义 web 组的变量
  3. http_port=80
  4. [web]
  5. 192.168.11.11 hostname=agent01
  6. 192.168.11.12 hostname=agent02
  7. eg:
  8. ansible -i hosts web -m hostname -a 'name={{ hostname }}-{{ http_port }}'

10. yum

  1. - name
  2. - state
  3. (Choices: present, installed, latest, absent, removed)[Default: present]
  4. eg:
  5. ansible -i hosts test -m yum -a 'name=httpd state=latest'

11. service

控制远程主机上的服务

  1. - name
  2. - enable
  3. (Choices: yes, no)[Default: (null)]
  4. - state
  5. (Choices: started, stopped, restarted, reloaded)[Default: (null)]
  6. eg:
  7. ansible -i hosts web -m service -a 'name=httpd state=started'

12. script

  1. eg:
  2. ansible -i host web -m script -a '/tmp/test.sh'

13. cron

  1. - name # 任务的描述
  2. - minute
  3. - hour
  4. - day
  5. - month
  6. - weekday
  7. - job
  8. - state
  9. (Choices: present, absent)[Default: present]
  10. eg:
  11. 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 模块的区别

  1. shell 对日常的命令支持较好,
  2. command 的效率比 shell 高,因为 shell 需要调用远程节点的 /bin/bash 环境。

0x04 ansible-console命令

  1. # 切换ansible 组
  2. cd dev
  3. cd test
  4. cd all
  5. # 修改线程数
  6. forks 3
  7. # 可以直接执行命令
  8. root@all (2)[f:10]$ ls
  9. # copy 模块
  10. root@all (2)[f:10]$ copy src=/etc/passwd dest=/tmp/

0x05 ansible-galaxy 命令

直接使用ansible-galaxy 安装一些模块 下载好的模块会放在 /etc/ansible/roles 模块地址: https://galaxy.ansible.com/explore#/

  • 用法
    1. ~]# ansible-galaxy -h
    2. Usage: ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
    3. Options:
    4. -h, --help show this help message and exit
    5. -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection
    6. debugging)
    7. --version show program's version number and exit
    8. eg:
    9. ansible-galaxy install DavidWittman.redis

0x06 ansible-playbook

1. YAML 语法

  1. 以 —- 开始,且需顶行首写。
  2. 次行开始正常写 Playbook 的内容,但一般写明该 Playbook 的功能。
  3. 使用 # 注释
  4. 缩进必须统一,不能空格和 tab 混用
  5. 缩进的级别要一致,同样的缩进代表同样的级别。
  6. 区分大小写
  7. K/V 的值可同行写也可换行写。 同行使用:分隔, 换行以-分隔。
  8. 一个完整的代码块功能的最少元素: name, task
  9. 一个 name只能包括一个 task

2. 实例

  1. ---
  2. - hosts: web
  3. remote_user: root
  4. tasks:
  5. - name: install epel
  6. yum: name=epel-release state=least
  7. - name: install Nginx
  8. yum: name=nginx state=least
  9. - name: config for nginx
  10. copy: src=/etc/ansible/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
  11. notify: restart nginx
  12. handlers:
  13. - name: restart nginx
  14. service: name=nginx state=restartd