暂无图片
Ansible 学习系列一
最近更新:2022-03-11 14:21:05

Ansible 学习系列

这一节主要介绍ansible的基本概念,常用模块

一、Ansible 介绍

简介

Ansible是一个配置管理系统configuration management system, ansible 是一个基于python 开发的(集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点)自动化运维工具, 其功能实现基于ssh远程连接服务, ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能, 除了ansible之外,还有salt、chef、puppet 等批量管理工具。

优势

易读的语法:playbook语法基于YAML,YAML是一种以易于人类读写为设计理念的数据格式语言

远程主机无须安装依赖:需要被管理的服务器安装SSH和Python2.5以上版本

基于推送模式:可以直接控制变更在服务器上发生的时间。拉取模式在大规模服务器场景上有较好的扩展性

内置模块:内置大量功能模块,模块具有幂等性的,意味着重复同一个playbook是安全

二、安装ansible及命令文件介绍

Ansible有两种安装方式:yum和pip

Linux环境root用户:

yum install -y ansible

配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/

pip install ansible

ansible程序文件
/usr/bin/ansible: 命令行工具
ansible命令通用格式: ansible <host-pattern> [options] [-m module_name] [-a args]
/usr/bin/ansible-doc: 帮助文档  ** 重要 **
/usr/bin/ansible-playbook: 剧本执行工具
/etc/ansible/ansible.cfg: 主配置文件
/etc/ansible/hosts: 管理的主机清单
/etc/ansible/roles: 角色存放处

ansible配置文件ansible.cfg

默认配置文件存储在/etc/ansible/ansible.cfg

ansible寻找ansible.cfg的顺序

1.ANSIBLE_CONFIG环境变量所指定的文件

2../ansible.cfg当前目录下的ansible.cfg <=======建议和playbook一起,放到当前目录下

3.~/.ansible.cfg 主目录下的.ansible.cfg

4./etc/ansible/ansible.cfg

inventory文件

ansible管理主机的集合称为inventory。inventory文件名称默认为:hosts,也要为以下方式:

存储路径:

/etc/ansible/hosts

/home//playbooks/hosts <=====推荐将inventory文件存储在与playbook同一目录中。

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_{xxxx}_interpreter  与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

例如:

[root@kickstart auto]# cat hosts 
# install python3 etcd patroni
[test2]   <-----组名
192.168.150.190 hostname=pg01 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
192.168.150.191 hostname=pg02 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
192.168.150.192 hostname=pg03 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root

playbook文件

playbook是Ansible中一个术语,指的是用于配置管理的脚本。想要运行playbook脚本,可能需要以下文件入目录的支持,以使配置更加灵活,标准。

一个playbook的目录基本结构:最简单的可以只包含两个文件:hosts 与.yml的playbook文件

[root@kickstart enmo]# tree /playbooks/enmo
/root/playbooks/enmo
├── config_hosts.yml                                 <------主playbook
├── files                                            <------文件存放目录
├── group_vars					     <------组变量目录
├── hosts					     <------inventory文件
├── host_vars					     <------主机变量目录
├── roles					     <------将playbook分为多个文件的机制
└── templates					     <------模板文件,可传入变量

ansible命令

[root@kickstart ~]# ansible --version
ansible [core 2.12.1]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/python38/lib/python3.8/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/python38/bin/ansible
  python version = 3.8.11 (default, Dec 29 2021, 23:25:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
  jinja version = 3.0.3
  libyaml = True
  
  [root@kickstart enmo]# ansible test -m ping
192.168.150.190 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.150.192 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.150.191 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

ansible-playbook命令

在目标主机上运行ansible脚本中定义的任务

play示例:

每个play必须包含以下两项:

hosts: 一组主机

tasks: 需要在这组主机上运行的任务

其余,都是可选项配置:

name: play的注释,运行play时将这段文字打印出来

vars: 一系列变理与值

tasks: play 中运行的任务;每个task必须包含一个键值对。键是块的名字,值是传递到模块的参数

- hosts: test
  remote_user: root
  vars_files: /root/auto/group_vars/test
  tasks:
    - debug: msg='{{hostname}}'
 
    - name: copy iso file
      copy: src=/root/CentOS-7-x86_64-Everything-1810.iso dest=/root/CentOS-7-x86_64-Everything-1810.iso

    - name: Mount DVD read-only
      ansible.posix.mount:
        path: /mnt
        src: /root/CentOS-7-x86_64-Everything-1810.iso
        fstype: iso9660
        state: mounted

    - name : Create a directory if it does not exist
      ansible.builtin.file:
        path: /etc/yum.repos.d/bak
        state: directory
        mode: '0755'

    - name: This command will change the working directory to somedir/
      ansible.builtin.shell:
        cmd: mv *.repo bak
        chdir: /etc/yum.repos.d
        removes: /etc/yum.repos.d/*.repo

    - name: scp yum config file
      copy: src=/root/auto/centos7.6.repo dest=/etc/yum.repos.d/centos7.6.repo

    - name: yum postgresql rpm packages
      yum:
        name: "{{ packages }}"
      vars:
        packages:
          - ncurses-devel 
          - gdbm-devel 
          - openssl-devel 
          - readline-devel 
          - zlib-devel 
          - sqlite-devel 
          - tk-devel 
          - xz-devel 
          - gcc
          - python-psycopg2
        state: present
        ansible_python_interpreter: /usr/bin/python2

ansible-config命令

查看ansible配置信息

[root@kickstart enmo]# ansible-config  -h
usage: ansible-config [-h] [--version] [-v] {list,dump,view,init} ...

View ansible configuration.

positional arguments:
  {list,dump,view,init}
    list                Print all config options
    dump                Dump configuration
    view                View configuration file
    init                Create initial configuration

optional arguments:
  --version             show program's version number, config file location, configured module
                        search path, module location, executable location and exit
  -h, --help            show this help message and exit
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable connection debugging)

ansible-inventory命令

查看inventory配置信息

[root@kickstart enmo]# ansible-inventory --list
{
    "_meta": {
        "hostvars": {
            "192.168.150.190": {
                "ansible_ssh_pass": "root",
                "ansible_ssh_port": 22,
                "ansible_ssh_user": "root",
                "hostname": "pg05"
            },
            "192.168.150.191": {
                "ansible_ssh_pass": "root",
                "ansible_ssh_port": 22,
                "ansible_ssh_user": "root",
                "hostname": "pg05"
            },
            "192.168.150.192": {
                "ansible_ssh_pass": "root",
                "ansible_ssh_port": 22,
                "ansible_ssh_user": "root",
                "hostname": "pg06"
            }
        }
    },
    "all": {
        "children": [
            "test",
            "ungrouped"
        ]
    },
    "test": {
        "hosts": [
            "192.168.150.190",
            "192.168.150.191",
            "192.168.150.192"
        ]
    }
}

ansible-galaxy命令

ansible-galaxy命令用来从ansible社区下载分享的role及生成与role相关的初始文件与目录

[root@kickstart playbooks]# ansible-galaxy init --init-path=/root/playbooks/roles postgresql
- Role postgresql was created successfully
[root@kickstart roles]# ls
postgresql
[root@kickstart roles]# tree postgresql/
postgresql/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

三、ansible常用模块及使用方法

模块名功能
file设置文件、链接文件、目录的属性;删除文件、链接文件、目录
lineinfile编辑文件单行内容
replace编辑文件多行内容
blockinfile编辑文件块内容:插入、更新、删除
copy将文件从本地或远程复制到远程
fetch将文件从远程复制到本地
template向远程复制模板文件把变量写入
synchronize向远程复制文件,适合比较大的文件
pip管理Python lib库文件
yumRedhat和Centos管理操作系统rpm包
aptUbuntu Debian软件包管理工具
yum_repository配置yum源
archive归档或压缩文件
unarchive解压文件
hostname设置主机名
user管理操作系统账号
group管理用户组
shell运行被控端系统命令,支持变量与特殊符号
command运行被控端系统命令,不支持变理与特殊符号 ,推荐用shell
raw和shell 类似,用于没有安装python的环境
script传输后在远程节点上运行本地脚本
service管理远程节点服务
mount挂载文件系统,NFS,ISO等
stat查看远程文件的状态
get_url用于从http ftp https服务器下载文件
fail失败模块,一般与stat模块一块用
debug用于脚本调试
ping查看到目标端是否连通
......