当服务器越来越多,统一管理显得尤为重要,一款合适的自动化运维管理工具必不可少,既能满足管理新部署的机器,还能兼容之前部署的机器,无客户端版的Ansible管理工具无疑是最合适的选择!

8月5日上午9:30,老男孩教育第六周优秀老学员分享请到了Linux高级运维34期优秀老学员为在校学员分享了Ansible自动化运维从入门到实战的知识技能,老司机呕心沥血之作,耗时大半年,全程干货满满,学员们收获颇丰!以下是分享内容:

第1章 ansible入门

1.1 关于ansible

Ansible是一款IT自动化工具。它可以配置管理,部署软件并编排更高级的任务,例如持续部署或零停机滚动升级。

Ansible的主要目标是简单易用。它还非常注重安全性和可靠性,具有最少的移动部件,使用OpenSSH进行传输(其他传输和拉模式作为替代方案),以及围绕人类可审计性设计的语言,即使那些不熟悉该程序。

我们相信简单性与各种规模的环境相关,因此我们为各种类型的繁忙用户进行设计:开发人员,系统管理员,发布工程师,IT经理以及其他人员。Ansible适用于管理所有环境,从少数几个实例的小型设置到数千个实例的企业环境。

Ansible以无代理方式管理机器。永远不会有如何升级远程守护进程或由于守护进程被卸载而无法管理系统的问题。由于OpenSSH是同行评审最多的开源组件之一,安全风险大大降低。Ansible是分散的,它依赖于您现有的操作系​​统凭据来控制对远程机器的访问。如果需要,Ansible可以轻松连接Kerberos,LDAP和其他集中式身份验证管理系统。

1.2 安装ansible

需要epel源
  1. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  2. yum install ansible -y
复制代码

分发密钥
  1. ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
  2. sshpass -p'1q2w3e$R' ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no" root@10.0.0.10
复制代码

1.3 第一个命令

编辑(或创建)/etc/ansible/hosts并将一个或多个远程系统放入其中。
  1. [apiservers]
  2. 10.0.0.23
  3. 10.0.0.24
复制代码

现在,ping所有节点:
  1. $ ansible all -m ping
复制代码

在所有节点上运行一个实时命令:
  1. $ ansible all -a "/bin/echo hello"
复制代码

1.4 配置文件的读取顺序

可以在配置文件中进行更改并使用该配置文件,该文件将按以下顺序搜索:

  1. - ANSIBLE_CONFIG (如果设置了环境变量)
  2. - ansible.cfg (在当前目录中)
  3. - ~/.ansible.cfg (在家目录中)
  4. - /etc/ansible/ansible.cfg
复制代码

1.5 ansible ad-hoc执行模式

1.5.1 什么是ad-hoc命令?

ad-hoc命令是您可以输入的内容,以便快速执行某些操作,但不希望稍后保存。

一般来说,Ansible的真正强大之处在于剧本。

为什么你会使用临时任务与剧本?

例如,如果你想要重启所有web服务,则可以在Ansible中快速执行一行,而无需编写剧本。

不过,对于配置管理和部署,则需要选择使用ansible-playbook 。

开始执行命令,先列出匹配主机的列表:
  1. $ ansible "10.0.0.*" --list-hosts
  2.   hosts (2):
  3.     10.0.0.24
  4.     10.0.0.23
复制代码

1.5.2 执行shell命令:
  1. ansible "10.0.0.*" -m shell -a "hostname"
复制代码

1.5.3 文件传输:

要将文件直接传输到多台服务器:
  1. ansible "10.0.0.*" -m copy -a "src=/etc/hosts dest=/etc/hosts owner=root group=root"
复制代码

1.5.4 创建文件
  1. ansible "10.0.0.*" -m file -a "path=/tmp/a.txt state=file mode=0644 owner=root group=root"
复制代码

1.5.5 创建目录
  1. ansible "10.0.0.*" -m file -a "path=/tmp/test state=directory mode=0755 owner=root group=root"
复制代码

1.5.6 删除目录
  1. ansible "10.0.0.*" -m file -a "path=/tmp/test state=absent"
复制代码

1.5.7 管理软件包

确保已安装软件包,但不要进行更新:
  1. ansible "webservers" -m yum -a "name=iotop state=present"
复制代码

确保包装是最新版本:
  1. ansible "webservers" -m yum -a "name=vim state=latest"
复制代码

确保未安装软件包
  1. ansible "webservers" -m yum -a "name=iotop state=absent"
复制代码

1.5.8 管理服务
  1. ansible "webservers" -m service -a "name=network state=restarted"
复制代码

1.5.9 查看模块帮助
  1. ansible-doc module_name
复制代码

1.5.10 收集系统信息
  1. ansible all -m setup
复制代码

1.5.11 获取目标主机的信息
  1. ansible all -m setup -a "filter=ansible_os_family"
复制代码

1.5.12 常用参数
  1. --list-hosts 输出匹配主机的列表; 不执行任何其他事情
  2. --version显示程序的版本号并退出
  3. -C, --check不要做任何改变; 相反,试着预测一些可能发生的变化
  4. -m --module-name 要执行的模块名称(默认=command)
  5. -a  模块参数
  6. -e, --extra-vars 将其他变量设置为key = value或YAML / JSON,如果文件名前缀为@
  7. -f <FORKS>, --forks <FORKS> 指定要使用的并行进程数(默认值= 5)
  8. -v, --verbose详细模式(-vvv for more,-vvvv启用连接调试)
复制代码

1.6 主机组

定义主机和组的文件默认在/etc/ansible/hosts,除了默认的格式之外,还可以使用ymal格式(不常用)来定义。

YAML格式如:
  1. all :
  2.   hosts :
  3.     mail.example.com :
  4.   children :
  5.     webservers :
  6.       hosts :
  7.         foo.example.com :
  8.         bar.example.com :
  9.     dbservers :
  10.       hosts :
  11.         one.example.com :
  12.         two.example.com :
  13.         three.example.com :
复制代码

1.7 默认组

有两个默认组:all和ungrouped

all包含每个主机

ungrouped包含没有属组的主机

1.8 主机变量和组变量

1.8.1 主机变量
  1. [webservers]
  2. web01 ansible_port=25535 ansible_host=10.0.0.23
  3. web02 ansible_port=25535 ansible_host=10.0.0.24
复制代码
  1. ansible web01 -m ping
复制代码

1.8.2 组变量

修改web01 web02的ssh端口为25535,并添加组变量
  1. [webservers:vars]
  2. ansible_port=25535
复制代码
  1. ansible webservers -m ping
复制代码

1.8.3 拆分主机和组特定变量

Ansible中的首选做法是不将变量存储在主清单文件(/etc/ansible/hosts)中。

除了将变量直接存储在主清单文件中之外,主机和组变量还可以存储在相对于库存文件的单个文件中(不是目录,它始终是文件)。

这些变量文件采用YAML格式。
  1. mkdir -p /etc/ansible/hosts_vars
  2. mkdir -p /etc/ansible/group_vars
复制代码

第2章 Ansible进阶

2.1 playbook简介

与adhoc任务执行模式相比,Playbooks使用ansible是一种完全不同的方式,并且功能特别强大。

简而言之,playbooks是真正简单的配置管理和多机器部署系统的基础,与已有的系统不同,并且非常适合部署复杂的应用程序。

Playbooks可以声明配置,但它们也可以协调任何手动订购流程的步骤,即使不同的步骤必须在特定订单的机器组之间来回跳转。他们可以同步或异步启动任务。

虽然您可以运行/usr/bin/ansible主程序来执行临时任务,但是更有可能将源代码保留在源代码管理中并用于推出配置或确保远程系统的配置符合规范。

Playbooks以YAML格式表示,并且具有最少的语法,有意尝试不是编程语言或脚本,而是配置或进程的模型。

2.2 playbook示例
  1. cat httpd-install.yml
复制代码

  1. ---
  2. - hosts: web01
  3.   tasks:
  4.     - name: install httpd
  5.       yum:
  6.         name: httpd
  7.         state: present

  8.     - name: start httpd
  9. service: name=httpd state=started enabled=yes
复制代码

一个playbook的文件可以包含多个剧本。你可能有一个首先针对web01,然后是web02。例如:
  1. ---
  2. - hosts: web01
  3.   tasks:
  4.   - name: install httpd
  5.     yum:
  6.       name: httpd
  7.       state: present

  8.   - name: start httpd
  9.     service: name=httpd state=started enabled=yes

  10. - hosts: web02
  11.   tasks:
  12.   - name: install nginx
  13.     yum:
  14.       name: nginx
  15.       state: present

  16.   - name: copy nginx.conf
  17.     copy:
  18.       src: /etc/ansible/nginx.conf
  19.       dest: /etc/nginx/conf/
  20.     notify: restart nginx

  21.   - name: start nginx
  22.     service: name=nginx state=started enabled=yes

  23.   handlers:
  24.   - name: restart nginx
  25.     service: name=nginx state=restarted
复制代码

2.3 控制主机的执行顺序
  1. - hosts: all
  2.   order: sorted
  3.   gather_facts: False
  4.   tasks:
  5.     - debug:
  6.         var: inventory_hostname
复制代码

使用order`关键字来控制主机的执行顺序

order的值可以为:

  1. - inventory: 默认值,执行顺序按照/etc/ansible/hosts文件提供的清单依次执行
  2. - reverse_inventory: 反转默认的执行顺序
  3. - sorted: 按主机名字母顺序排序
  4. - reverse_sorted: 按主机名字母顺序反向排序
  5. - shuffle: 随机排序执行
复制代码

2.4 handlers

handlers是由全局唯一名称引用并由通知程序通知的任务列表,与常规任务实际上没有任何不同。如果没有通知handlers,它将不会运行。无论通知handlers的任务有多少,在特定游戏中完成所有任务后,它只会运行一次。

从Ansible 2.2开始,handlers也可以“listen”通用主题,任务可以通知如下主题:
  1. handlers:
  2.     - name: restart memcached
  3.       service:
  4.         name: memcached
  5.         state: restarted
  6.       listen: "restart web services"
  7.     - name: restart apache
  8.       service:
  9.         name: apache
  10.         state:restarted
  11.       listen: "restart web services"

  12. tasks:
  13.     - name: restart everything
  14.       command: echo "this task will restart the web services"
  15.       notify: "restart web services"
复制代码

这种使用使得触发多个handlers变得更加容易。它还将handlers与其名称分离,从而更容易在playbooks和角色之间共享处理程序。

2.5 注意

通知handlers始终按照定义的顺序运行,而不是以notify-statement中列出的顺序运行。使用listen的handlers也是如此。

handlers名称和listen名称位于全局命名空间中。

如果两个handlers任务具有相同的名称,则只运行一个。

您无法通知在include内定义的处理程序。从Ansible 2.1开始,这确实有效,但是include必须是静态的。

2.6 刷新handlers

如果您想立即刷新所有处理程序命令,可以执行以下操作:
  1. tasks:
  2.    - shell: some tasks go here
  3.    - meta: flush_handlers
  4.    - shell: some other task
复制代码

在上面的示例中,任何排队的处理程序将在meta 到达语句时尽早处理。这是一个简单的案例,但有时可以派上用场。

2.7 提示和技巧

要检查剧本的语法,使用ansible-playbook与--syntax-check标志。这将通过解析器运行playbook文件,以确保其包含的文件,roles等没有语法问题。

要在运行之前查看哪个主机会受到剧本的影响,可以执行以下操作,该操作也能起到检查语法的效果:
  1. ansible-playbook playbook.yml --list-hosts
复制代码

如果你想查看成功模块及不成功模块的详细输出,请使用--verbose或 -vvv -v -vv等。

playbook执行的底部查看了解目标节点及其执行结果的统计。

由于内容体量较大,仅提供以上两部分内容截图,除此之外,分享还包括以下内容:

第3章 Ansible高级用法

  3.1 roles

    3.1.1 roles目录结构

    3.1.2 角色依赖

  3.2 变量

    3.2.1 有效的变量名

    3.2.2 在主机清单文件中定义变量

    3.2.3 在playbook中定义变量

    3.2.4 在yaml中引用变量的坑

    3.2.5 收集系统信息:Facts

    3.2.6 关闭Facts

    3.2.7 访问复杂的变量数据

    3.2.8 如何访问其他主机的变量

    3.2.9 变量文件分离

    3.2.10 在命令行上传递变量

    3.2.11 变量优先级

  3.3模板

    3.3.1测试

  3.4条件判断

    3.4.1 when语句

    3.4.2 将when应用于roles

    3.4.3 变量注册

  3.5 循环

    3.5.1 标准循环

    3.5.2 do-until循环

  3.6 block

    3.6.1 错误处理

    3.7 tags

    3.7.1 标签重用

    3.7.2 标签继承

    3.7.3特殊标签

  3.8 从指定位置开始执行playbook

第四章 Ansible例子

  4.1一个系统初始化剧本

以上是老男孩教育第六期老学员分享内容,更多干货,请关注下一期优秀老学员分享!


回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.