ansible初级笔记:从在Mac上安装到rbenv,nfs的步骤

这是一个总结了以备忘录为目的发布的博客文章的概述。
ansible | okisanjp@记录有多重要

如果我是以摸索的方式来表达的,所以可能会有一些奇怪的地方。但如果你能提出批评之后,如果有需要修正的部分,我会进行验证,并进行修正。

安装〜简单介绍一下安装过程

使用本地的mac通过ansible查看CentOS6服务器的备忘录。

在Mac上安装Ansible。

はてなブックマーク - Homebrew — OS X 用パッケージマネージャー
$ brew install ansible

创建库存

默认情况下,会查找名为 hosts 的文件。可以通过 ansible.cfg 进行覆盖和修改。

[test]
192.168.xxx.xxx

如果想要从本地机器远程操作,也可以输入全球IP地址。

FQDN可进行注册。还可以使用指定如web[01-10]等以及正则表达式,但由于还没有完全理解,所以先放在后面。

尝试执行指令

在管理目标服务器上执行任意命令。

$ ansible test -i hosts -a 'date'

192.168.xxx.xxx | SUCCESS | rc=0 >>
2016年  4月  8日 金曜日 14:27:27 JST

我认为这是指定要在服务器上执行的模块的方式,使用-m来指定模块,使用-a来指定参数。默认情况下,服务器上的命令执行模块是-m。因此,我理解为只需指定要执行的一行命令(即希望执行的命令),即只需使用-a。到目前为止,我认为还需要更深入地理解这个模块。

$ ansible test -i hosts -a 'cat /etc/redhat-release'
192.168.xxx.xxx | SUCCESS | rc=0 >>
CentOS release 6.7 (Final)

制作Playbook

在目标服务器的命令行上

$ htop
-bash: htop: コマンドが見つかりません

因此,我将尝试编写一个Playbook,在尚未安装htop的服务器上安装htop。

yum-repos.yml 可以使用本地化的方式进行以下句子的释义:

Yum源配置文件.yml

首先,注册htop安装源的yum仓库(EPEL)。

- name: add repos 'EPEL'
  yum: name=http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm state=present

监控工具配置文件.yml

---
- hosts: test
  become: yes
  tasks:
    - name: Install htop
      yum: name=htop state=installed

语法检查

$ ansible-playbook -i hosts yum-repos.yml --syntax-check

playbook: yum-repos.yml

检查任务的内容

$ ansible-playbook -i hosts yum-repos.yml --list-tasks

playbook: yum-repos.yml

  play #1 (test):   TAGS: []
    tasks:
      add repos 'EPEL'  TAGS: []

实习运行

$ ansible-playbook -i hosts yum-repos.yml --check

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.xxx.xxx]

TASK [add repos 'EPEL'] ********************************************************
changed: [192.168.xxx.xxx]

PLAY RECAP *********************************************************************
192.168.xxx.xxx            : ok=2    changed=1    unreachable=0    failed=0

由于此次情况涉及多个Playbook,需要对每个Playbook进行检查。文件名可以使用通配符同时检查多个。

执行Playbook

首先是仓库。

$ ansible-playbook -i hosts yum-repos.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.xxx.xxx]

TASK [add repos 'EPEL'] ********************************************************
changed: [192.168.xxx.xxx]

PLAY RECAP *********************************************************************
192.168.xxx.xxx            : ok=2    changed=1    unreachable=0    failed=0

接下来的工具是监控工具。

$ ansible-playbook -i hosts monitor-tools.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.xxx.xxx]

TASK [Install htop] ***********************************************
changed: [192.168.xxx.xxx]

PLAY RECAP *********************************************************************
192.168.xxx.xxx            : ok=2    changed=1    unreachable=0    failed=0

顺便提一下,-i hosts部分是指定清单(服务器列表)文件的文件名,可以选择使用默认的hosts文件创建,或者在ansible.cfg中指定任意的文件名,如果该文件存在的话,可以省略该部分。

确认

我会尝试登录到实际管理的服务器上,确认是否存在htop。

$ htop

如果安装正确,就是巨大的成功。

创建一个能使用sudo的用户并更新authorized_keys。

请以…为参考

    • Ansibleでユーザを追加 – Qiita

 

    ansible でノーパスログイン(公開鍵認証)設定する – とあるSIerの憂鬱
- hosts: all
  become: True
  tasks:
    - name: add a new user
      user: name=hogeuser state=present
    - name: add a sudo user
      lineinfile: "dest=/etc/sudoers backup=yes state=present regexp='^hogeuser' line='hogeuser ALL=(ALL) NOPASSWD: ALL'"

- hosts: all
  tasks:
    - name: setup authorized_keys
      authorized_key: user=hogeuser
        key="{{ lookup('file', './id_rsa_hogeuser.pub') }}"

禁止使用root用户登录

使用notify和handler重新启动服务。

- hosts: all
  become: True
  tasks:
    - name: stop root login via ssh
      lineinfile:
        dest: /etc/ssh/sshd_config
        state: present
        regexp: "^PermitRootLogin without-password"
        line: "PermitRootLogin no"
        backup: yes
        backrefs: yes
        validate: "sshd -T -f %s"
      notify: restart sshd

  handlers:
    - name: restart sshd
      service: name=sshd state=restarted

如果使用notify时填写的名称与设置的handler名称相同,它将在最后执行处理。

无论”notify”出现多少次,只会在最后执行一次。

    1. ansible.cfg是Ansible的配置文件,其存放位置有优先级。优先级顺序如下:

 

    1. 1. 环境变量ANSIBLE_CONFIG指定的路径

 

    1. 2. 当前目录下的ansible.cfg(./ansible.cfg)

 

    1. 3. 用户HOME目录下的.ansible.cfg(~/.ansible.cfg)

 

    4. /etc/ansible/ansible.cfg

安装 rbenv 和 Ruby

建立一个app角色,并安装rbenv和ruby,以便能够使用。

主持人

[app]
app01 ansible_host=xxx.xxx.xxx.xxx

应用程序.yml

---
  - hosts: app 
    roles:
      - app

角色/应用/任务/main.yml

---
  - name: 開発ツールをインストール
    become: True
    yum: name={{ item }} state=latest
    with_items:
      - git
      - openssl-devel
      - readline-devel
      - "@Development tools"

  - name: rbenvをインストール
    git: repo=https://github.com/sstephenson/rbenv.git dest=~/.rbenv

  - name: .bash_profileにパスを追加
    lineinfile: >
      dest="~/.bash_profile"
      line="export PATH=$HOME/.rbenv/bin:$PATH"

  - name: .bash_prifileにrbenv initを追加
    lineinfile: >
      dest="~/.bash_profile"
      line='eval "$(rbenv init -)"'

  - name: rbenv-buildのインストール
    git: repo=https://github.com/sstephenson/ruby-build.git dest=~/.rbenv/plugins/ruby-build

  - name: rubyのインストール
    shell: bash -lc "CONFIGURE_OPTS="--disable-install-rdoc" rbenv install -s {{ ruby_version }}"

  - name: globalで使用するバージョンを指定
    shell: bash -lc "rbenv global {{ ruby_version }} && rbenv rehash"

角色/应用程序/默认/主要.yml

由于在tasks的main.yml中使用了变量,需要在这里进行定义。

---
  ruby_version: 2.1.8

试一试

$ ansible-playbook app.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [app01]

TASK [app : 開発ツールをインストール] ******************************************************
changed: [app01] => (item=[u'git', u'openssl-devel', u'readline-devel', u'@Development tools'])

TASK [app : Install htop] ******************************************************
ok: [app01]

TASK [app : rbenvをインストール] ******************************************************
ok: [app01]

TASK [app : .bash_profileにパスを追加] ***********************************************
ok: [app01]

TASK [app : .bash_prifileにrbenv initを追加] ***************************************
ok: [app01]

TASK [app : rbenv-buildのインストール] ************************************************
ok: [app01]

TASK [app : rubyのインストール] *******************************************************
changed: [app01]

TASK [app : globalで使用するバージョンを指定] ***********************************************
changed: [app01]

实施前的检查

文法检查

$ ansible-playbook app.yml --syntax-check

干跑

$ ansible-playbook app.yml -C

详细的进展情况

$ ansible-playbook app.yml -vvv

NFS客户端编辑

安装NFS相关的中间件,并将任意的NFS挂载。

CentOS 6.5。

角色/应用程序/默认/main.yml

---
  file_mountpoint: /path_to_mountpoint
  file_server: xxx.xxx.xxx.xxx

角色/应用/任务/main.yml

  - name: NFSクライアントをインストール
    become: True
    yum: name={{ item }} state=latest
    with_items:
      - nfs-utils
  - name: NFS関連:rpcbind
    become: True
    service: name=rpcbind state=started enabled=yes
  - name: NFS関連:rpcidmapd
    become: True
    service: name=rpcidmapd state=started enabled=yes
  - name: NFS関連:nfslock
    become: True
    service: name=nfslock state=started enabled=yes
  - name: NFS関連:netfs
    become: True
    service: name=netfs state=started enabled=yes
  - name: マウントポイントを作る
    become: True
    file: path={{ file_mountpoint }} state=directory owner=root group=root mode=0755
  - name: fileサーバーをNFSマウントする
    become: True
    mount: name={{ file_mountpoint }} src={{ file_server }}:{{ file_mountpoint }} fstype=nfs state=mounted

我們在需要進行根操作的部分指定了 become: True,但根據環境和情況需要靈活適應。

  - name: fileサーバーをNFSマウントする
    become: True
    mount: name={{ file_mountpoint }} src={{ file_server }}:{{ file_mountpoint }} fstype=nfs state=mounted

在这段描述中,进行了将挂载和添加到/etc/fstab一起的操作。

无论执行多少次,都不会导致fstab文件中出现重复的行。

广告
将在 10 秒后关闭
bannerAds