概念

https://blog.51cto.com/u_15048360/3202204
ansible是由python开发的自动化运维工具,是极限了了批量部署、命令执行等功能,ansible是基于模块工作的,本身只提供一个框架

核心组件:
ansible:核心程序
modules:核心模块及自定义模块
plugins:补充插件,如邮箱插件
playbooks:剧本,定义多任务配置文件,由ansible自动执行
inventory:定义管理的主机清单
connection plugins:负责和被监控端实现通信

特点:
无需再被监控端上安装agent
无服务器端
基于模块工作
使用yaml
基于ssh

执行过程:
加载配置文件,默认为/etc/ansible/ansible.cfg
加载模块文件
通过ansible将模块或命令生成对应的临时python文件并将文件传输至远程服务器
执行用户家目录的.ansible/tmp/.py文件
给文件+x
执行并返回结果,删除临时python文件,退出

使用

基础

安装

yum install epel-release.noarch -y
yum install ansible -y

配置免密

ssh-keygen
cat ~/.ssh/id_rsa.pub
在被操作机上
vi /root/.ssh/authorized_keys

配置文件

ls /etc/ansible/
ansible.cfg  hosts  roles

cat ansible.cfg
[defaults]

# some basic default values...

#主机清单
#inventory      = /etc/ansible/hosts
#文件存放位置
#library        = /usr/share/my_modules/
#module_utils   = /usr/share/my_module_utils/
#临时生成的文件在远程主机上的目录
#remote_tmp     = ~/.ansible/tmp
#临时生成的文件在本地主机的目录
#local_tmp      = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#默认并发数
#forks          = 5
#默认线程数
#poll_interval  = 15
#sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False

vi hosts
# This is the default ansible 'hosts' file.
#
# It should live in /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
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

## 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

## [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

## [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

常用参数

-a :指定模块的参数
-m :指定模块
-C :坚持执行结果
-e :指明变量名
-f :指定并发进程数
-i :指定主机清单文件
--syntax-check:检查执行命令是否存在语法错误

ansible-doc -l 列出所有模块
ansible-doc [-s]  xx 查看指定模块的用法,-s为列出简单信息
ansible <host-pattern> [-m module_name] [-a args] 执行
ansible-playbook 执行剧本
ansible-console 交互执行

ansible localhost -m 本地执行

playbook

playbook使用yaml编写
https://ansible-tran.readthedocs.io/en/latest/docs/playbooks_intro.html
每一个play包含一个task列表,task会根据你配置的hosts\remote_user等使用指定的模块去运行设定的命名,运行时是自上向下的,每个task必须有一个名称以用于区分
比如这样的,使用shell模块运行命令

tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand || /bin/true

我们用个完整点的例子来演示下
安装nginx并配置文件

第一步,准备文件存放目录
[root@master ~]# mkdir -p /root/ansible/{conf,bin}
第二步,书写YAML文件
[root@master bin]# cat nginx.yaml
- hosts: server2 #目标主机
  remote_user: root #在目标机上使用的账户
  vars: #变量
    hello: Ansible
  tasks: #第一个任务
  - name: Install epel #任务名
    yum:  #yum模块
      name: epel-release.noarch
      state: latest
  - name: Install nginx
    yum:
      name: nginx
      state: present
  - name: Copy nginx configure file
    copy: #copy模块
      src: /root/ansible/conf/site.conf
      dest: /etc/nginx/conf.d/site.conf
  - name: Start nginx
    service: #设置开机启动
      name: nginx
      state: restarted
  - name: Create index.html
    shell: echo "nginx1" > /usr/share/nginx/html/index.html

第三步,书写conf文件
[root@master bin]# cat site.conf
server {
listen 8080;
server_name 192.168.80.50:8080;
location / {
index index.html;
}
}
第四步,检查语法错误,没有错误则继续执行
[root@master bin]# ansible-playbook nginx.yaml --syntax-check
[root@master bin]# ansible-playbook nginx.yaml

当然,比起这种key: value,你也可以写成key=value的形式,不过注意并不是所有的模块都支持这种写法,比如说shell

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

常用模块

ping:测试连通

[root@master ~]# vi /etc/ansible/hosts 
[root@master ~]# ansible -m ping test
172.17.120.142 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"

shell:远程执行指令
https://bingostack.com/2021/03/ansible-shell-command/
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html

ansible-doc -s shell
- name: Execute shell commands on targets
  shell:
      chdir:                 # Change into this directory before running the command.
      cmd:                   # The command to run followed by optional arguments.
      creates:               # A filename, when it already exists, this step will *not* be run.
      executable:            # Change the shell used to execute the command. This expects an absolute path to the executable.
      free_form:             # The shell module takes a free form command to run, as a string. There is no actual parameter named 'free form'. See the
                               examples on how to use this module.
      removes:               # A filename, when it does not exist, this step will *not* be run.
      stdin:                 # Set the stdin of the command directly to the specified value.
      stdin_add_newline:     # Whether to append a newline to stdin data.
      warn:                  # Whether to enable task warnings.
[root@master ~]# cat test-pwd.yaml 
- hosts: test
  tasks: 
  - name: ls tmp
    shell: cd /tmp && pwd && ls -l > ./log

[root@master ~]# ansible-playbook test-pwd.yaml --syntax-check

playbook: test-pwd.yaml
[root@master ~]# ansible-playbook test-pwd.yaml

[root@node01 ~]# cat /tmp/log 
total 8
srwxr-xr-x 1 root root    0 Feb  9 23:06 aliyun_assist_service.sock
drwx------ 2 root root 4096 Feb 23 17:01 ansible_command_payload_geujPy
-rw-r--r-- 1 root root    0 Feb 23 17:01 log
drwx------ 3 root root 4096 Feb  7 10:06 systemd-private-7cbd598af444427b8714fcd64c669e47-chronyd.service-Z4rJtW

service:配置开机自启

service:
      arguments:             # Additional arguments provided on the command line.
      enabled:               # Whether the service should start on boot. *At least one of state and enabled are required.*
      name:                  # (required) Name of the service.
      pattern:               # If the service does not respond to the status command, name a substring to look for as would be found in the output of the
                               `ps' command as a stand-in for a status result. If the string is found, the service will be
                               assumed to be started.
      runlevel:              # For OpenRC init scripts (e.g. Gentoo) only. The runlevel that this service belongs to.
      sleep:                 # If the service is being `restarted' then sleep this many seconds between the stop and start command. This helps to work
                               around badly-behaving init scripts that exit immediately after signaling a process to stop.
                               Not all service managers support sleep, i.e when using systemd this setting will be
                               ignored.
      state:                 # `started'/`stopped' are idempotent actions that will not run commands unless necessary. `restarted' will always bounce the
                               service. `reloaded' will always reload. *At least one of state and enabled are required.*
                               Note that reloaded will start the service if it is not already started, even if your chosen
                               init system wouldn't normally.
      use:                   # The service module actually uses system specific modules, normally through auto detection, this setting can force a
                               specific module. Normally it uses the value of the 'ansible_service_mgr' fact and falls

copy

  copy:
      backup:   覆盖文件前先备份
      content:  src
      dest:     目的目录

标签: none

评论已关闭