如何使用Ansible自动执行简单的重复任务

时间:2020-02-23 14:29:38  来源:igfitidea点击:

介绍

我们将使用ASSIBE进行一些简单的重复任务,例如创建新的Linux用户和复制文件。

示例1 - 使用Ansible的远程系统上安装/删除软件包

要在远程系统上安装软件包,请使用适用于Ansible支持的所有系统的包模块。
此模块实际上调用了每个系统(APT,YUM等)的相关包模块。
也可以使用OS的特定模块,APT也可以使用。

--- 
- hosts: all 
  remote_user: tech
  become: true
  become_method: sudo
  tasks: 
    - name: Install Single Package using package module 
      package:
        name: vim
        state: present
    - name: Install Multiple packages using package module
      package:
        name: ['vim','wget','bash-completion','curl']
        state: present
    - name: Install package for Specific distro - apache on Debian or Ubuntu
      package:
        name: apache2
        state: present
      when: ansible_os_family == "Debian"
    - name: Install package for Specific distro - apache on CentOS/RHEL/Fedora
      package:
        name: httpd
        state: present
      when: ansible_os_family == "RedHat"

要删除包,应将状态值设置为不存在。

示例2 - 使用Ansible的远程系统上启动/停止服务

对于服务管理,我们将使用服务模块。
我们在步骤1中安装了Apache Web服务器,我们将在此处启动该服务并将其设置为在启动时启动。

由于Debian和Redhat系列的服务名称不一样,因此我们必须存在缺陷状态。

--- 
- hosts: all 
  remote_user: tech
  become: true
  become_method: sudo
  tasks: 
    - name: Install Single Package using package module 
      package:
        name: vim
        state: present
    - name: Start apache service on Debian or Ubuntu
      service:
        name: apache2
        state: started
        enabled: yes
      when: ansible_os_family == "Debian"
    - name: Start apache service on CentOS/RHEL/Fedora
      service:
        name: httpd
        state: started
        enabled: yes
      when: ansible_os_family == "RedHat"

请参阅Ansible Service Module文档页面上的所有支持的参数。

示例3 - 使用Ansible执行shell命令/脚本

此示例将演示如何在远程系统上执行shell命令和shell脚本。

--- 
- hosts: all 
  remote_user: tech
  become: true
  become_method: sudo
  tasks: 
    - name: Get Top 5 CPU consuming processes
      shell: ps aux | sort -nrk 3,3 | head -n 5
      register: top
    - name: Get Disk partitioning
      shell: df -hT
      register: df
    - debug: var=top.stdout_lines
    - debug: var=df.stdout_lines

我们还可以将本地脚本复制到服务器并执行它。

--
- name: Copy and execute a script.
  hosts: web-servers
  remote_user: user1
  become: yes
  become_method: sudo
  tasks:
     - name: Copy local script to remote systems
       copy:
         src: myscript.sh
         dest: /home/user1/myscript.sh
         mode: 0777
     - name: Execute a script on remote server
       command: sh /home/user1/myscript.sh

请参阅下面的输出。

示例4:将多个目录与远程Linux系统同步到本地计算机

为此工作,由于Ansible模块同步使用它,请在远程服务器中安装Rsync。
如果我们敏锐,我们会注意到我们使用的"拉"模块的"拉动"模式来实现这一目标。

--- 
- hosts: portal 
  remote_user: tech
  become: true
  become_method: sudo
  tasks: 
    - name: Fetch Log Files from portal server and save them to local       
      synchronize:   
        src: "{{ item.source }}" 
        dest: "{{ item.dest }}" 
        mode: pull 
      with_items: 
        - { source: '/var/log/apps/Database/2019-08-07', dest: '/home/jtech/Documents/test3/Database' }
        - { source: '/var/log/apps/Exceptions/2019-08-07', dest: '/home/jtech/Documentss/test3/Exceptions' }

主机:门户是我们希望从源中拉出文件的远程服务器是我们打算将Andest的远程服务器的目录是本地目录,它将从远程服务器接收资源。

示例5:使用Ansible添加用户到远程服务器

以下是将用户添加到许多远程系统的YAML Playbook,将用户添加到相应的sudoers文件并将用户的公钥复制到远程服务器。
在过去,如果我们想要将新用户添加到几个服务器中,所有这些都将涉及许多痛苦的键盘冲压以获得完成的工作。
要使用此PlayBook,我们假设以下内容:在客户端CarmineAnother用户(Tech在此示例中)上安装的Ansible已在远程系统中使用来自客户端计算机的公钥,并且可以有效地与远程服务器进行通信。

打开/etc/ansible/hosts文件,并在文件末尾添加远程服务器的列表。
一个例子如下所示。
如果默认情况下,远程系统上的SSH端口不是22,请使用完整的冒号和SSH端口号,如图所示。

生成加密的用户密码:

$mkpasswd --method=SHA-512 StrongUserPassword
$w4LFQ39hZz5$l9Uv3rMCJGqHuU1MbXFpJohY/zuDXNxQJhI3Y5wKvgxnaXnnQ/HnqHWhbgwr1w.7Xo.1yOAZ4AJuKAhUNvqhi.
$mkpasswd --method=SHA-512
Password: 
$rz9Cx4SvxntT7pQp$VyWqxxkp4GNYml3t8Jlfo/DUXP4ELtfnLGq42GkhAIHq7VWuPRoFSl795rF1JOMycHmmYFTaYSRVO4/nZpWWm.
# With python passlib module
$sudo pip install passlib
$python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('StrongUserPassword')"

PlayBook:Users.yml

vim /etc/ansible/hosts
 [web-servers]
 192.168.10.20
 192.168.10.31:2023
 192.168.10.50

创建PlayBook。

--
- hosts: "web-servers"
  remote_user: tech
  become: true
  become_method: sudo
  vars:
    users:
    - "harry"
  tasks:
    - name: "Create user Harry in the remote web-servers"
      user:
        name: "{{ item }}"
        password: <encrypted-password>
        groups: "wheel"
        update_password: always
      register: user_created
      with_items: "{{ users }}"
    - name: "Add authorized keys"
      authorized_key:
      user: "{{ item }}"
        key: "{{ lookup('file', '/home/harry/.ssh/id_rsa.pub') }}"
        # key: "{{ lookup('file', 'files/'+ item + '.key.pub') }}"
      with_items: "{{ users }}"
    - name: Add user "harry" to sudo
      lineinfile:
        path: /etc/sudoers.d/harry
        line: 'harry ALL=(ALL) NOPASSWD: ALL'
        state: present
        mode: 0440
        create: yes
        validate: 'visudo -cf %s' 
    - name: Force user to change password
      shell: chage -d 0 {{ item }}
      when: user_created.changed

将此文件保存在我们选择的目录中,然后运行:

# ansible-playbook  users.yml -u tech -K

它会要求我们成为密码。
输入系统中远程用户的密码。

示例6:自动创建本地计算机上的目录,并从远程服务器复制其中文件。

假设我们经常需要将文件从远程服务器复制到本地计算机,我们终于厌倦了手动复制它们,现在我们希望使用Ansible的效率。
可以位于远程服务器中的文件:

/var/log/applications/web/20-08-08/, 
/var/log/applications/frontend/20-08-08/, 
/var/log/applications/backend/20-08-08/, 
/var/log/applications/frontend1/20-08-08/and 
/var/log/applications/sockets/20-08-08/
/var/log/applications/others/20-08-08/

要在整理本地计算机上的相应目录中的20-08-08子目录中复制文件,我们需要创建相应的目录以匹配远程服务器上存在的内容。
一个例子是创建文件,例如:

/home/tech/logs/web/20-08-08/, 
/home/tech/logs/frontend/20-08-08/, 
/home/tech/logs/backend/20-08-08/, 
/home/tech/logs/frontend1/20-08-08/and 
/home/tech/logs/sockets/20-08-08/
/home/tech/logs/others/20-08-08/

除了手动创建这些分配器时,Ansible可以在本教程中描述为我们提供。

首先,Ansible将自动创建/home/tech/logs/parent目录,然后自动创建各种子目录(Web,Frontend,beftend,Frontend1,套接字)。
最后,20-08-08子目录将与远程服务器的子目录同步。
我们将找到20-08-08目录和其所有文件在本地计算机上整齐地复制。
让我们创建戏剧来完成这项工作。

步骤一:在任何目录中创建变量文件并输入所有变量。

vim vars.yml
--
LOCAL_PROJECT_DIRECTORY:  "/home/tech/logs"
REMOTE_PROJECT_DIRECTORY: "/var/log/applications"

第二步:将远程服务器添加到主机文件。这可以在默认文件中或者我们创建的任何主机文件中。

vim /etc/ansible/hosts
#Add your host
[remoteserver]
192.168.20.23

第三步:创建PlayBook以为我们复制目录和文件

vim playbook.yml
--
- hosts: 127.0.0.1    # Create directories and sub-directories in local machine in this play
  vars_files:
  ./variables1/vars.yaml
  tasks:
    - name: Auto-Create Local parent project directory {{ LOCAL_PROJECT_DIRECTORY }} and sub-directories
      file: path={{ LOCAL_PROJECT_DIRECTORY }}/{{ item }} state=directory
      with_items:
          - web
          - frontend
          - backend
          - Database
          - frontend1
          - sockets
          - others
- hosts: remoteserver      # Copy directories and files in local machine from remoteserver in this play
  vars_files:
  ./variables1/vars.yaml
  become: true
  
  tasks:
    - name: Fetch stuff from your remote server and save to locally autocreated directorie
      become: yes
      synchronize:   
        src: "{{ REMOTE_PROJECT_DIRECTORY }}/{{ item }}/20-08-08" 
        dest: "{{ LOCAL_PROJECT_DIRECTORY }}/{{ item }}/" 
        mode: pull 
      with_items: web
          - frontend
          - backend
          - Database
          - frontend1
          - sockets
          - others

完成此操作后,是时候运行剧本了,

# ansible-playbook playbook.yaml -u tech -K

在远程服务器上输入Sudo密码并按Enter键。

示例7:删除系统中的旧用户

--
- hosts: servers
  remote_user: tech
  become: true
  become_method: sudo
  vars:
    users:
    - "Hyman"
    - "tom"
    - "sharon"
    - "tech"
    - "pench"
  tasks:
    name: "Remove old users out of the system"
    user:
      name: "{{ item }}"
      state: "absent"
    with_items: "{{ users }}"

示例8:从SVN服务器结帐文件并将它们复制到远程服务器

如果我们希望从Subversion Server中提取文件,并且可以将它们复制到远程服务器上的其他位置,其中包含一个ansible命令,然后本教程显示它是如何完成的。
请跟进。

步骤一:在任何目录中创建变量文件并输入所有变量。

$vim vars.yml
--
LOCAL_PROJECT:  "/home/tech/svn"
REMOTE_PROJECT: "/var/log/applications"

第二步:将远程服务器添加到主机文件。这可以在默认文件中或者我们创建的任何主机文件中。

vim /etc/ansible/hosts
[remoteserver]
192.168.20.27

第三步:创建一个PlayBook以将文件从Subversion Server签出到本地计算机,并自动将它们复制到远程服务器。

$vim playbook.yml
--
- hosts: 127.0.0.1
  vars_files:
    - ./variables1/vars.yaml
  tasks:
   - name: Auto-Create Local project directory
     file: path={{ LOCAL_PROJECT }}/{{ item }} state=directory
     with_items:
         - App
   - name: Checkout subversion repository to the created directory/folder
     subversion:
       repo: https://path/to/your/subversion/
       username: user1
       password: strongpassword
       checkout: yes
       update: yes
       in_place: yes
       dest: "{{ LOCAL_PROJECT }}/{{ item }}"
     with_items:
         - App
- hosts: worker1
  vars_files:
    - ./variables1/vars.yaml
  tasks:
   - name: Auto-Create Remote project directory 
     become: yes 
     file: path={{ REMOTE_PROJECT }}/{{ item }} state=directory 
    with_items:
        - Application
   - name: Copy the checked-out files to remote server via Synchronize
     become: yes
     synchronize:
       src: "{{ LOCAL_PROJECT }}/{{ item.local }}/" 
       dest: "{{ REMOTE_PROJECT }}/{{ item.remote }}" 
     with_items:
         - { local: 'App', remote: 'Application' }

第四步:由于Playbook具有敏感的数据,即用户名和密码,让我们使用Ansible-Vault加密它,以便没有人可以查看东西。

加密PlayBook文件,如下所示。
输入密码,我们将很好。

$ansible-vault encrypt playbook.yml
New Vault password:
Confirm New Vault password:
Encryption successful

完成后,继续使用所示选项运行PlayBook。
它将提示user1的sudo密码和我们刚刚输入的ansible-vault密码。

$ansible-playbook playbook.yml --ask-vault-pass -u user1 -K
BECOME password:
Vault password:
PLAY [127.0.0.1] 
** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
TASK [Gathering Facts] 
** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [127.0.0.1]