Ansible:1.简单使用


title: Ansible:1.简单使用
categories: Linux
tags:
- Ansible
timezone: Asia/Shanghai
date: 2019-02-25


Ansible 是什么

Ansible 简单的说是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装agent的方式。你可以将代码部署到任意数量的服务器上!

Ansible能做什么

ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。

  • 比如:同时在100台服务器上安装nginx服务,并在安装后启动它们。
  • 比如:将某个文件一次性拷贝到100台服务器上。
  • 比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。

这些场景中我们都可以使用到ansible。

Ansible特性

  • 模块化:调用特定的模块,完成特定任务

  • 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块

  • 支持自定义模块

  • 基于Python语言实现

  • 部署简单,基于python和SSH(默认已安装),agentless

  • 安全,基于OpenSSH

  • 支持playbook编排任务

  • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况

  • 无需代理不依赖PKI(无需ssl)

  • 可使用任何编程语言写模块

  • YAML格式,编排任务,支持丰富的数据结构

  • 较强大的多层解决方案

  • no agents:不需要在被管控主机上安装任何客户端;

  • no server:无服务器端,使用时直接运行命令即可;

  • modules in any languages:基于模块工作,可使用任意语言开发模块;

  • yaml,not code:使用yaml语言定制剧本playbook;

  • ssh by default:基于SSH工作;

  • strong multi-tier solution:可实现多级指挥。

  • 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

  • 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;

  • 使用python编写,维护更简单,ruby语法过于复杂;

  • 支持sudo。

Ansible主要组成部分功能说明

  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  • INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  • MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义,ansible-doc –l 可查看模块
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口
  • ANSIBLE:组合INVENTORY、 API、 MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具

主控机要求

目前Ansible可以从安装了Python 2(2.7版)或Python 3(3.5及更高版本)的任何机器上运行。控制计算机不支持Windows。

这包括Red Hat,Debian,CentOS,macOS,任何BSD等等。

受管节点要求

在受管节点上,您需要一种通信方式,通常是ssh。默认情况下,这使用sftp。如果没有,你可以切换到scp in ansible.cfg。您还需要Python 2(2.6或更高版本)或Python 3(3.5或更高版本)。

主要文件说明

/etc/ansible/ansible.cfg    主配置文件,配置ansible工作特性
/etc/ansible/hosts  主机清单
/etc/ansible/roles/ 存放角色的目录
/usr/bin/ansible    主程序,临时命令执行工具
/usr/bin/ansible-doc    查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook   定制自动化任务,编排剧本工具
/usr/bin/ansible-pull   远程执行命令的工具
/usr/bin/ansible-vault  文件加密工具
/usr/bin/ansible-console    基于Console界面与用户交互的执行工具

输出结果颜色说明

highlight = white           高亮    = 白色
verbose = blue              蓝色
warn = bright purple        警告    = 亮紫色
error = red                 错误    = 红色
debug = dark gray           debug   = 深灰色
deprecate = purple          紫色
skip = cyan                 跳过    = 青色
unreachable = red           无法到达 = 红色
ok = green                  OK      = 绿色
changed = yellow            目标主机有更新 = 黄色
diff_add = green        绿色
diff_remove = red       红色
diff_lines = cyan       青色

环境

[root@centos181001 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

[root@centos181001 ~]# ansible --version
ansible 2.7.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.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, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

第一步:Ansible主控端安装

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install ansible

第二步:/etc/ansible/hosts主机列表文件格式说明

# This is the default ansible 'hosts' file. 这是 一个默认``hosts``的示例文件
# 
# It should live in /etc/ansible/hosts  他应该位于 /etc/ansible/hosts
# 
#   - Comments begin with the '#' character     # 开头的是注释
#   - Blank lines are ignored                   空行会被忽略
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses   你可以使用hostname或者ip地址
#   - A hostname/ip can be a member of multiple groups  一个主机名或者IP地址可以属于多个组

# Ex 1: Ungrouped hosts, specify before any group headers.
# 示例1:未分组的主机,在任何组头之前指定。

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group
# 示例2:属于``webservers``组的主机列表

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:
# 如果你的多个主机遵循一定的规律,可以使用以下方式定义

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group
# 示例3:``[dbservers]``组示例
## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

第三步:配置基于key的免密登录

由于Ansible是基于ssh连接的,我们不用每次执行命令的时候都手动输入密码,显然这样效率太低,所以设置让主控端可以免密登录到被控端,方便管理。

ssh-keygen
ssh-copy-id 11.11.11.62
ssh-copy-id 11.11.11.63

第四步:常用命令演示

常用参数

--list-host     只输出符合条件的主机列表,而并不执行命令
-vvv            显示详细信息

1.第一条命令

Try to connect to host, verify a usable python and return `pong' on success

尝试连接到主机,验证可用的python并在成功时返回“pong”

ansible 11.11.11.62 -m ping
ansible db -m ping
    
    [root@centos181001 ~]# ansible 11.11.11.62 -m ping
    11.11.11.62 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }

    [root@centos181001 ~]# ansible db -m ping
    11.11.11.62 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    11.11.11.63 | SUCCESS => {
        "changed": false, 
        "ping": "pong"

2.copy模块:将文件从本地或远程计算机复制到远程主机

  • src :指定源路径(源路径如果是目录的话,最后是否已/结尾在很多时候会有区别,自己体会)
  • dest :指定目标主机的目标路径
  • content :当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
  • force : 是否强制覆盖已有文件,可选值有yes和no,默认值为yes,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
    -backup : 是否对远程主机的已有文件进行备份,可选值有yes和no
  • owner : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
  • group : 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
  • mode : 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r--r--“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。

示例:将本地/home/1 copy 到远程/home/目录,指定组为:db

ansible db -m copy -a 'src=/home/1 dest=/home/'
ansible db -m copy -a 'src=/home/1 dest=/home/ backup=yes'
ansible db -m copy -a 'src=/home/1 dest=/home/ backup=yes force=no'

playbook示例:

cat <copy.yml 
- hosts: db
  tasks:
  - name: example copying file with owner and permissions
    copy:
      src: /home/1/
      dest: /home/
      backup: yes
EOF

ansible-playbook copy.yml

3.FETCH模块:从远程主机复制文件到本地

此模块只支持复制文件,而不支持复制目录

  • src 远程源路径
  • dest 本地目标路径

示例:

ansible db -m fetch -a 'src=/home/1.txt dest=/home/'
ansible db -m fetch -a 'src=/var/log/messages dest=/home/'

playbook示例:

cat <fetch.yml 
- hosts: db
  tasks:
  - name: test fetch
    fetch:
      src: /var/log/messages
      dest: /home/
EOF

ansible-playbook fetch.yml

4.yum模块

only works on Python 2.

  • state 用于描述安装包最终状态,present/latest用于安装包,absent用于remove安装包
  • list 列出软件包

示例:安装httpd

ansible db -m yum -a 'name=httpd'

示例:卸载httpd

ansible db -m yum -a 'name=httpd state=absent'

示例:列出某包 = yum list

ansible db -m yum -a 'list=wget'

playbook示例:安装httpd和vim

cat <httpd_install.yml 
- hosts: db
  tasks:
  - name: install httpd
    yum:
      name: httpd,vim
EOF

ansible-playbook httpd_install.yml

playbook示例:卸载httpd

cat <httpd_remove.yml 
- hosts: db
  tasks:
  - name: install httpd
    yum:
      name: httpd
      state: absent
EOF

ansible-playbook httpd_remove.yml

5.shell模块:

  • chdir 在运行命令之前进入此目录
  • creates 一个文件名,如果这个文件存在的话,就不执行
  • removes 一个文件名,如果这个文件不存在的话,就不执行
  • executable 可执行文件的绝对路径
  • somescript.sh >> somelog.txt 将执行结果重定向到某文件

playbook示例:copy文件到远程主机并执行

cat <shell.yml 
- hosts: db
  tasks:
  - name: copy docker install file
    copy:
      src: /home/Docker18.09_CentOS7.6/
      dest: /home/Docker18.09_CentOS7.6/
      mode: u+x

  - name: install docker
    shell: 
      chdir: /home/Docker18.09_CentOS7.6/
      cmd: /home/Docker18.09_CentOS7.6/1_install_docker.sh
EOF

ansible-playbook shell.yml

附录:命令帮助

[root@centos181001 ~]# ansible --help
Usage: ansible  [options]

Define and run a single task 'playbook' against a set of hosts
针对一组主机定义并运行单个任务“playbook”

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS
                        module arguments
                        模块参数

  --ask-vault-pass      ask for vault password
                        询问保管库密码

  -B SECONDS, --background=SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
                        异步运行,X秒后失败

  -C, --check           don't make any changes; instead, try to predict some
                        of the changes that may occur
                        不做任何改变; 相反,尝试预测可能发生的一些变化

  -D, --diff            when changing (small) files and templates, show the
                        differences in those files; works great with --check
                        105/5000
                        更改(小)文件和模板时,显示这些文件的差异; 与--check一起使用效果很好

  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
                        set additional variables as key=value or YAML/JSON, if
                        filename prepend with @
                        将其他变量设置为key = value或YAML / JSON,如果filename前缀为@
  -f FORKS, --forks=FORKS
                        specify number of parallel processes to use
                        (default=5)
                        指定要使用的并行进程数

  -h, --help            show this help message and exit
                        显示帮助信息并退出

  -i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY
                        specify inventory host path or comma separated host
                        list. --inventory-file is deprecated
                        指定库存主机路径或逗号分隔的主机列表。 --inventory-file已弃用

  -l SUBSET, --limit=SUBSET
                        further limit selected hosts to an additional pattern
                        进一步将所选主机限制为其他模式

  --list-hosts          outputs a list of matching hosts; does not execute
                        anything else
                        输出匹配主机列表; 不会执行任何其他操作

  -m MODULE_NAME, --module-name=MODULE_NAME
                        module name to execute (default=command)
                        要执行的模块名称(default = command)

  -M MODULE_PATH, --module-path=MODULE_PATH
                        prepend colon-separated path(s) to module library
                        (default=[u'/root/.ansible/plugins/modules',
                        u'/usr/share/ansible/plugins/modules'])
                        将冒号分隔的路径预先添加到模块库

  -o, --one-line        condense output
                        浓缩输出

  --playbook-dir=BASEDIR
                        Since this tool does not use playbooks, use this as a
                        subsitute playbook directory.This sets the relative
                        path for many features including roles/ group_vars/
                        etc.
                        手动指定playbook目录

  -P POLL_INTERVAL, --poll=POLL_INTERVAL
                        set the poll interval if using -B (default=15)
                        如果使用-B(默认值= 15),则设置轮询间隔

  --syntax-check        perform a syntax check on the playbook, but do not
                        execute it
                        对playbook执行语法检查,但不执行它

  -t TREE, --tree=TREE  log output to this directory
                        将输出记录到此目录

  --vault-id=VAULT_IDS  the vault identity to use
                        要使用的保管库标识

  --vault-password-file=VAULT_PASSWORD_FILES
                        vault password file
                        保管库密码文件

  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)
                        详细模式(-vvv表示更多,-vvvv表示启用连接调试)

  --version             show program's version number and exit
                        显示程序的版本号并退出

  Connection Options:连接选项
    control as whom and how to connect to hosts
    控制谁以及如何连接到主机

    -k, --ask-pass      ask for connection password
                        询问连接密码

    --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
                        use this file to authenticate the connection
                        使用此文件来验证连接

    -u REMOTE_USER, --user=REMOTE_USER
                        connect as this user (default=None)
                        以此用户身份连接(默认=无)

    -c CONNECTION, --connection=CONNECTION
                        connection type to use (default=smart)
                        要使用的连接类型(默认=智能)

    -T TIMEOUT, --timeout=TIMEOUT
                        override the connection timeout in seconds
                        (default=10)
                        以秒为单位覆盖连接超时

    --ssh-common-args=SSH_COMMON_ARGS
                        specify common arguments to pass to sftp/scp/ssh (e.g.
                        ProxyCommand)
                        指定传递给sftp / scp / ssh的公共参数(例如ProxyCommand)

    --sftp-extra-args=SFTP_EXTRA_ARGS
                        specify extra arguments to pass to sftp only (e.g. -f,
                        -l)
                        指定仅传递给sftp的额外参数(例如-f,-l)

    --scp-extra-args=SCP_EXTRA_ARGS
                        specify extra arguments to pass to scp only (e.g. -l)
                        指定仅传递给scp的额外参数(例如-l)
    --ssh-extra-args=SSH_EXTRA_ARGS
                        specify extra arguments to pass to ssh only (e.g. -R)
                        指定仅传递给ssh的额外参数(例如-R)

  Privilege Escalation Options:特权升级选项:
    control how and which user you become as on target hosts
    控制您在目标主机上的身份和方式

    -s, --sudo          run operations with sudo (nopasswd) (deprecated, use
                        become)
    -U SUDO_USER, --sudo-user=SUDO_USER
                        desired sudo user (default=root) (deprecated, use
                        become)
    -S, --su            run operations with su (deprecated, use become)
    -R SU_USER, --su-user=SU_USER
                        run operations with su as this user (default=None)
                        (deprecated, use become)
    -b, --become        run operations with become (does not imply password
                        prompting)
                        用run运行操作(不暗示密码提示)

    --become-method=BECOME_METHOD
                        privilege escalation method to use (default=sudo),
                        valid choices: [ sudo | su | pbrun | pfexec | doas |
                        dzdo | ksu | runas | pmrun ]
                        要使用的权限升级方法(默认= sudo),有效选择:
    --become-user=BECOME_USER
                        run operations as this user (default=root)
                        以此用户身份运行操作(默认= root)

    --ask-sudo-pass     ask for sudo password (deprecated, use become)
                        请求sudo密码(不推荐使用,使用成为)

    --ask-su-pass       ask for su password (deprecated, use become)
                        请求su密码(不建议使用,使用成为)

    -K, --ask-become-pass
                        ask for privilege escalation password
                        要求提供权限提升密码

Some modules do not make sense in Ad-Hoc (include, meta, etc)
Ad-Hoc中的某些模块没有意义(include,meta等)

你可能感兴趣的:(Ansible:1.简单使用)