Ansible学习入门

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2021/12/ansible-xue-xi-ru.html

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible 安装

$ yum install ansible
# 或
$ apt-get install software-properties-common
$ apt-add-repository ppa:ansible/ansible
$ apt-get update
$ apt-get install ansible

服务器如果无法连接到互联网,则需要下载ansible以及依赖的rpm包,再使用rpm -ivh <package_name>.rpm命令安装。

先安装依赖,提示缺什么包就安装什么包。

ansible-2.9.18-1.el7.noarch.rpm              
python-babel-0.9.6-8.el7.noarch.rpm  
python-markupsafe-0.11-10.el7.x86_64.rpm
python2-cryptography-1.7.2-2.el7.x86_64.rpm  
python-cffi-1.6.0-5.el7.x86_64.rpm    
python-paramiko-2.1.1-9.el7.noarch.rpm
python2-httplib2-0.18.1-3.el7.noarch.rpm    
python-enum34-1.0.4-1.el7.noarch.rpm  
python-ply-3.4-11.el7.noarch.rpm
python2-jmespath-0.9.4-2.el7.noarch.rpm      
python-idna-2.4-1.el7.noarch.rpm      
python-pycparser-2.14-1.el7.noarch.rpm
python2-pyasn1-0.1.9-7.el7.noarch.rpm        
python-jinja2-2.7.2-4.el7.noarch.rpm  
sshpass-1.06-2.el7.x86_64.rpm

配置远程主机

编辑 /etc/ansible/hosts 并在其中加入一个或多个主机,你的 public SSH key 必须在这些系统的 authorized_keys 中。如果这些主机将你的 public SSH key 加入自己的 authorized_keys 中,表示这些主机信任你登录,即需要配置免密登录。

/etc/ansible/hosts 文件的配置如下:

mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

中括号中是组的名称,表示将服务器分组管理,后面的任务可以分组执行。

配置好hosts主机目录之后,可以使用以下命令测试主机连通性和ssh的配置:

# ping 所有的主机
$ ansible all -m ping

编写 playbook 剧本

playbook 里面就描述了要执行的任务,例如下面的playbook,表示使用yourname用户对webservers组的所有主机执行启动nginx的任务:

---
- hosts: webservers
remote_user: yourname
tasks:
  - service: name=nginx state=started
    sudo: yes

下面是一个修改webservers组主机root密码的playbook:

---
- hosts: webservers
remote_user: root
tasks:
- user: name=root group=root password="{{'12345678'|password_hash('sha512')}}" update_password=always

Ansible 的 tasks 和 handlers

tasks 列表 和 handlers 描述了要执的任务,一般使用<key>=<value>的格式调用已写好的modudle,如上面举例的任务。

比较特别的两个 modudle 是 command 和 shell ,它们不使用 key=value 格式的参数,而是这样:

# command
tasks:
- name: disable selinux
  command: /sbin/setenforce 0
# shell
tasks:
- name: run this command and ignore the result
  shell: /usr/bin/somecommand || /bin/true
# 或者
tasks:
- name: run this command and ignore the result
  shell: /usr/bin/somecommand
  ignore_errors: True

Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作。除此以外很少用到了。

Handlers 会在 ‘pre_tasks’, ‘roles’, ‘tasks’, 和 ‘post_tasks’ 之间自动执行。如果你想立即执行所有的 handler 命令,在1.2及以后的版本,可以这样做:

tasks:
  - shell: some tasks go here
  - meta: flush_handlers
  - shell: some other tasks

在以上的例子中,任何在排队等候的 handlers 会在执行到 ‘meta’ 部分时,优先执行。这个技巧在有些时候也能派上用场。

执行playbook

以下命令表示使用10个线程同时执行playbook:

$ ansible-playbook playbook.yml -f 10

发表评论