ansible命令执行过程

1 . 加载自己的配置文件 默认/etc/ansible/ansible.cfg
2 . 加载自己对应的模块文件,如command
3 . 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4 . 给文件+x执行
5 . 执行并返回结果
6 . 删除临时py文件,sleep 0退出

执行状态

绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
image.png

ansible基本参数

ansible [-m module_name] [-a args]
-a //后面跟参数
—version //显示版本
—m module //指定模块,默认使用command模块
-v //显示详细过程 -vv -vvv 显示更详细
—list-hosts //显示主机列表,可简写-list
-k,—ask-pass //提示连接密码,默认key验证
-K,—ask-become-pass //提示输入sudo
-C,—check //检查命令,并不执行
-T,—timeout=TIMEOUT //执行命令的超时时间,默认10s
-u,—user=REMOTE_USER //执行远程操作的 执行的用户
-b,—become//代替旧版的sudo切换
示例:
ansible all -m command -u yunwei —become-user=root -a ‘ls /root’ -b -k -K
//以yunwei用户 sudo 到root用户 执行 ls /root

常用模块

File 文件模块

Copy 从主控端复制文件到远程主机

  1. src : 源文件 指定拷贝文件的本地路径 (如果有/ 则拷贝目录内容,比拷贝目录本身)<br /> dest: 指定目标路径<br /> mode: 设置权限<br /> backup: 备份源文件<br /> content: 代替src 指定本机文件内容,生成目标主机文件<br />owner: 设置拥有者
- name: copy file
  hosts: all
  gather_facts: no
  become: yes        #设置是否以root用户执行操作
  - name: copy files from local to remote
      copy:    #粘贴文件
        src: /root/test.txt    #当前机器文件路径
        dest: /opt/test/test.txt    #服务器文件路径
        backup: yes    #如果文件同名或者更改内容再粘贴时,创建一个备份
        mode: 600        #设置权限位600

File 设置/创建文件

path:         要管理的文件路径 (强制添加)<br />    recurse:     递归,文件夹要用递归<br />    src:          创建硬链接,软链接时,指定源目标,配合'state=link' 'state=hard' 设置软链接,硬链接<br />    state:         状态<br />    absent:     缺席,删除<br />    owner:        设置拥有者<br />    mode:        设置权限
- name: create file
  hosts: all
  gather_facts: no
  become: yes        #设置是否以root用户执行操作

  tasks:
    - name: create a directory if it does not exits
      file:    #创建文件
        path: /opt/test    #设置路径    
        state: directory    #文件类型为文件夹    touch 是文件
ansible all -m file -a 'path=/app/test.txt state=touch'        #创建文件
ansible all -m file -a 'src=/data/testfile dest=/data/testfile-link state=link' #创建软链接

- name: file module
  hosts: all
  gather_facts: no
  become: yes        #设置是否以root用户执行操作

  tasks:
    - name: create a directory if it does not exits
      file:    #创建文件
        path: /opt/test    #设置路径    
        state: directory    #文件类型为文件夹    touch 是文件
    - name: copy files from local to remote
      copy:    #粘贴文件
        src: /root/test.txt    #当前机器文件路径
        dest: /opt/test/test.txt    #服务器文件路径
        backup: yes    #如果文件同名或者更改内容再粘贴时,创建一个备份
        mode: 600        #设置权限位600

template 创建模板

基础模板

使用的jinja语法

vim site.yml
- name: file module
  hosts: all
  gather_facts: no
  become: yes 

  tasks:
    - name: test template
      template:        #使用模板模块
        src: ../templates/test.j2
        dest: /opt/test/test.cfg

mkdir templates    #创建模板文件夹
vim test.j2    #创建cfg模板

[default]
http_port = {{http_port}}        #取出host文件中的变量

ansible-playbook site.yml        #运行

image.png

vim test.j2    #创建cfg模板

[default]
http_port = {{http_port}}
[demo]
{% for id in range(201,211) %}
{{ host_prefix }}{{ "%02d" | format(id-200) }} = {{ ip_prefix }}{{ id }}
{% endfor %}

Unarchive 文件解压

1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes.<br />    2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no<br />**copy=yes 当前主机压缩包到远程,copy=no 远程主机解压到远程**

    copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,<br />              如果设置为copy=no,会在远程主机上寻找src源文件<br />        src: 源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,<br />              如果是远程主机上的路径,则需要设置copy=no<br />        dest:远程主机上的目标路径<br />        mode:设置解压缩后的文件权限
    - name:
      unarchive:    #根据后缀进行解压
        src: /root/Python-3.10.4.tgz    #文件路径
        dest: /usr/local/        #解压位置
        remote_src: yes            #是否使用的是服务器目录,默认是no,no就是使用本地路径文件,用本地就无须下载。

Fetch 远程拉取文件

- name: fetch
  hosts: all
  become: yes

  tasks:
    - name: fetch a file
      fetch:        #调用远程拉取模块
        src: /etc/passwd    #服务器的路径
        dest: ./tmp/            #当前路径
        flat: yes                    #是否创建文件夹

Archive 打包压缩

将远程主机目录打包 <br />        path:   指定路径<br />        dest:   指定目标文件<br />        format: 指定打包格式<br />        owner:  指定所属者<br />        mode:   设置权限
- name: archive
  hosts: all
  gather_facts: no
  tasks:
    - name: archive
      archive:        #设置打包压缩
        path: /etc/passwd        #设置文件/设置文件夹
        dest: /opt/test.tar.bz2        #压缩包位置
        format: bz2        #设置压缩格式

System 系统模块

ping和get_facts

ping 上面演示过,这里就不错演示

ansible all -m gather_facts     #获取机器中的全部参数,API。其中包含的参数非常多

ansible all -m gather_facts --tree ./facts        #创建一个文件夹,会将打印的参数,添加到文件中。文件名就是设置的hosts名称
#其中的变量,也是无需我们创建,能够直接访问的变量,此时我们来调用一下

vim site.yml

- name: file module
  hosts: all
  #gather_facts no    #一定不要写这个,否则这些参数就无法使用了。
  become: yes

  tasks:
    - name: print facts
      debug:
        msg: "{{ ansible_date_time }}"
    - name: print ipv4
      debug:
        msg: "{{ ansible_default_ipv4 }}"

User的添加与删除

home       指定家目录路径<br />    system     指定系统账号<br />    group      指定组<br />    remove     清除账户<br />    shell          指定shell类型
ansible all -m user -a 'name=liao comment="创建liao" uid=2048 home=/home/liao1 group=root'
#创建用户为liao 设置注释 uid设置为2048 home目录为/home/liao1 组为root
tasks:
  - name: create system user
    user:
      name:    sysuser1
      state: yes        #指定是否为系统账号
      home: /app/sysuser1
  - name: create users
    user:
      name: app
      uid:    88
      system:    yes    #是否为系统用户
      home: /home/app
      groups: root
      shell: /sbin/nologin        #设置为nologin
      passwd: "{{ 'appuser1' | password_hash('sha512') }}"        #设置密码
  - name: remove user
      user:
        name: liao
        state: absent
        remove: yes
安装mkpasswd <br />    yum insatll expect <br />    mkpasswd 生成口令<br />    openssl passwd -1  生成加密口令

Group的创建与删除

- name: group manager
  hosts: all
  become: yes

  tasks:
    - name: create group
      group:    #调用组模块
        name: liao118235    #组名称
        state: present        #状态为创建
    - name: delete group
      group: #调用组模块
        name: liao118235    #组名称
        state: absent        #状态为删除
ansible-playbook site.yml        #执行
ansible all -m shell -a "tail /etc/passwd"    #查看用户        
ansible all -m shell -a "tail /etc/group"        #查看组

Service 服务的启动与关闭

- name: install nginx and start nginx
  hosts: all
  become: yes

  tasks:
    - name: install package
      yum:
        name:
          - epel*    #安装epel工具包
        state: present
    - name: install nginx
      yum:
        name:
          - nginx    #安装nginx
        state: present 
    - name: start nginx
      service:    #使用service模块
        name: nginx
        enabled: yes    #是否设置开机自启
        state: started    #启动nginx
    - name:
      service:
        name: nginx
        state:    stopped
  • 重载 reloaded
  • 重新启动 restarted
  • 启动 started
  • 停止 stopped

Hostname 管理主机名

ansible appsrvs -m hostname -a "name=app.adong.com"                  #更改一组的主机名
ansible 192.168.38.103 -m hostname -a "name=app2.adong.com" #更改单个主机名

Cron 计划任务

支持时间:minute,hour,day,month,weekday

name: 任务计划名称
cron_file: 替换客户端该用户的任务计划的文件
minute: 分(0-59, /2)
hour: 时(0-23, /2)
day: 日(1-31, /2)
month: 月(1-12, /2)
weekday: 周(0-6或1-7, *)
job: 任何计划执行的命令,state要等于present
backup: 是否备份之前的任务计划
user: 新建任务计划的用户
state: 指定任务计划present、absent

ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime"    #创建任务
ansible all -m cron -a 'state=absent name=Synctime'        #删除任务
ansible all -m cron -a 'minute=*/10 job='/usr/sbin/ntpdate 172.30.0.100" name=synctime disabled=yes"
#注释任务,不在生效

Package 包模块

Yum安装工具

- name: yum Install
  hosts: all
  become: yes

  tasks:
    - name: yum install
      yum:    #调用yum模块
        name: git    #安装单个包git
        state: present    #状态为创建
    - name: yum unstall
      yum:
        name: git
        state: absent        #状态为删除
    - name: yum install more
      yum:
        name: {{packages}}
        vars:    #安装多个包
          packages:    #配置一个变量,方便管理
            - httpd
            - http-tools
    - name: rpm install url
      yum:    
        name: https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-x86_64.rpm    #以网站的形式下载并安装rpm包
        stats: present
    - name: rpm install path
      yum:
        name: /root/kibana-6.0.0-x86_64.rpm        #从路径查询包并安装
        stats: present
    - name: upgrade all packages
      yum: 
        name: '*'        #更新所有的包
        state: latest

apt安装工具

用法其实和yum差不多,我们只看当服务器有centos和ubuntu时,需要分开使用命令的情况

- name: yum Install
  hosts: all
  become: yes

  tasks:
    - name: yum install
      yum:    #调用yum模块
        name: git    #安装单个包git
        state: present    #状态为创建
        when: ansible_faces["distribution"] == 'CentOS'        #判定是否为Centos
    - name: apt get
      apt:
        name: git
        state: present    #状态为创建
        when: ansible_faces["distribution"] == 'Ubuntu'        #判定是否为Ubuntu

package 自动选择合适的安装命令

模块会自动识别服务器的发行版版本,进行不同的命令安装。
但是,部分包名称并不是一样的,所以还是需要进行上面的单独写。

- name: package module
  hosts: all
  become: yes

  tasks:
    - name: yum install
      package:
        name: git
        state: present
        force_apt_get: yes        #强制使用apt get

pip安装

- name: install python3
  hosts: all
  become: yes

  tasks:
    - name: yum install python
      package:
        name:     #安装python3和一些工具包
          - python3
          - python3-devel
          - python3-pip
          - python-setuptools
        state: present
    - name: yum install python
      pip:
        name: flask    #需要安装的包
        #requirements: ~/flask-ansible-demo/requirements.txt        #设置以文件-r 拉取pip包
        virtualenv: /root/vir/    #虚拟环境路径
        virtualenv_command: /usr/bin/python3 -m venv    #进入虚拟路径的命令

git

拉取

    - name: get git
      git:
        repo: 'https://github.com/xiaopeng163/flask-ansible-demo'        #填写git仓库的网址
        dest: ~/flask-ansible-demo    #拉取到后 存放位置

Net tools 模块

get_url 通过url下载文件

- name: download tar.gz
  hosts: all
  become: yes

  tasks:
    - name: download python
      get_url:
        url: https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz        #填写下载地址
        dest: /root/    #下载路径
        checksum: md5:7011fa5e61dc467ac9a98c3d62cfe2be    #检查md5
    - name:
      unarchive:    #根据后缀进行解压
        src: /root/Python-3.10.4.tgz    #文件路径
        dest: /usr/local/        #解压位置
        remote_src: yes            #是否使用的是服务器目录,默认是no,no就是使用本地路径文件,用本地就无须下载。

uri 查看访问网页参数

- name: curl web
  hosts: all
  become: yes

  tasks:
    - name: check 
      uri:        #调用uri
        url: http://www.example.com        #设置访问网页
        return_content: yes        #设置是否返回网页内容
      register: result                #注册返回值
    - debug:
        var: result                    #输出返回值

Command 命令模块

Command 命令模块

前面演示了shell命令的使用,shell模块与command模块的区别是,shell模块可以引用变量和使用一些比较符号。command模块建议使用一些单行命令

- name: use command
  hosts: all
  become: yes

  tasks:
    - name:
      command: cat /etc/passwd    #执行的命令
      register: passwd_list    #注册返回值,将命令的输入赋值到该变量中,此时变量就可以被引用了。
    - debug:
        msg: "{{passwd_list}}"        #打印出返回值

Shell 命令模块

ansible all -m shell  -a 'getenforce'            #查看SELINUX状态
ansible all -m shell  -a "sed -i 's/SELINUX=.*/SELINUX=disabled' /etc/selinux/config"        #修改SELINUX


vim /etc/ansible/ansible.cfg
module_name = shell        #修改配置文件,使shell作为默认模块

ansible all  -a 'cat /etc/passwd'

调用bash执行命令,可能依然出现错误,所以建议写到脚本时,copy到远程执行,再把需要的结果拉回执行命令的机器

vim /etc/ansible/ansible.cfg
module_name = shell        #修改配置文件,使shell作为默认模块

Script 脚本模块

在远程主机上运行ansible服务器上的脚本

ansible all -m script -a /tmp/data.sh        #将当前服务器data.sh脚本咋在其他服务器上运行

Ansible Vault 加密

对文件进行加密解密

  • encrypt 加密
  • decrypt 解密
  • view 查看
  • edit 编辑
ansible-vault encrypt /root/inventory/group_vars/all.yml        #加密文件,设置密码
ansible-vault decrypt /root/inventory/group_vars/all.yml        #解密文件,输入密码解密

image.png

ansible-vault view /root/inventory/group_vars/all.yml        #输入密码,查看加密文件
ansible-vault edit /root/inventory/group_vars/all.yml        #输入密码,修改加密文件

ansible-playbook site.yml --ask-vault-pass        #执行加密的playbook

image.png

对变量进行加密

ansible-vault encrypt_string "mly118235" --name "ansible_password"

ansible_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          35626230313763323934623130636436666661396338616664303962383733663861656432316662
          3631633730303232326138643162316364306239303238620a336637313737353732323138633866
          33323665393036316138353633336234636132616238646137633263376462393965393538336462
          6632373263333938360a313564666539346437363634373239363966383639306632353538383530
          3962

#只需将这段代码覆盖掉 ansible_password: mly118235 即可!
#加密了执行时,需要输入密码

set_fact 模块

自定义

自定义变量,或者将获取的参数设置为变量。

- name: file module
  hosts: all
  become: yes

  tasks:
    - name: set facts    
      set_fact:    #创建fact
        LiAo_Name: 'LiAo'        #创建key
    - debug:
        var:    LiAo_Name            #打印输出key

image.png

设置系统变量

- name: file module
  hosts: all
  become: yes

  tasks:
    - name: command get hosts
      command: cat /etc/hosts    #执行命令
      register: host_results    #注册返回值
    - name: set facts
      set_fact:    #创建fact
        Ip_Host: "{{host_results['stdout_lines']}}"        #创建key,设置值
    - debug:
        var:    Ip_Host        #打印值

image.png