ユーザ用ツール

サイト用ツール


サイドバー

Index

はじめてのおつかい





DokuWiki整形記法


PlayGround



serverapps:configmgmt:ansible:like-a-tutorial

チュートリアルのようなもの

多分、一般的にはこれをチュートリアルとは言わないと思います。m(
ほぼ素の仮想マシンを用意して、その環境設定を一から行っていきます。
ansible以前の条件は以下の通り1)

管理側
  ホスト名  master
  OS        CentOS
  ansible   インストール済み
  User
            root      pass:ansible    自身(127.0.0.1)をKnown_hostsに追加しておく
                                       ssh-keygen -R 127.0.0.1
                                       ssh-keyscan -H 127.0.0.1>>~/.ssh/known_hosts
            

被管理側
  ホスト名  client1,2
  OS        CentOS
  User
            root      pass:ansible

管理側ホストの設定

rootでログイン
事前準備として以下のファイルを作成

ansible_hosts_mine
[mine]
127.0.0.1
 
[mine:vars]
ansible_ssh_port=22
ansible_ssh_user=root
#ansible_ssh_pass=ansible
#ansible_sudo_pass=ansible

以下のコマンドで、設定するパスワードハッシュを作成
作成したハッシュは、Playbookで使用します

# python -c 'import crypt; print crypt.crypt("NewUserPa$$w0rd", "$6$SaltSALT$")'

以下の処理をこなうPlaybookを作成

  1. rootパスワード変更
  2. ansibleユーザを追加
    1. ansibleユーザが被管理ホストにアクセスする為のssh keyを作成
  3. ansibleユーザがsudo可能に設定
  4. ansibleユーザにsshアクセス用PublicKeyを設定
  5. Best Practicesに沿ったディレクトリを作成するPlaybookをダウンロード
  6. sshの設定
    1. rootのsshアクセスを禁止
    2. 公開鍵によるsshアクセスを許可
    3. パスワード認証禁止
init_ansible_master.yml
---
- hosts: mine                # 対象を指定。all は全ホスト
  #sudo: yes                 # sudo を行う
  vars:                     # 変数指定
    username: ansible
    userpassword: $6$aBcD9876$q5X0jkld4QdBZSAqpHAejIRDf6fHbr73CWq9Ka0iwMiqh2UoXxsMIWFJcvYWq2D.PUFYTF84MnZpUip/DfWYw0
    userhome: /home/ansible
    rootpassword: $6$aBcD9876$znTv96hIRWiETfoOUgZ9lpqhpfY5NuyKB01Hf9ayZxvw4AYTXgtaRXDBKhknS3HHDVi4B053MITTuPtfP2xrH.
    ansible_dir_yml_url: https://raw.githubusercontent.com/hnakamur/ansible-playbooks/master/ansible-directories.yml
    sshuser:
      - name: ansible
        key: path/to/ansibleuser.id_rsa.pub

  tasks:                    # 実行するtask の指定を開始
    - name: rootパスワード変更  # task の名前
      user: name=root password={{ rootpassword}}

    - name: ansibleユーザーを追加しsshkeyを作成
      user: name={{ username }} password={{ userpassword }} generate_ssh_key=yes ssh_key_bits=4096

    - name: ansibleユーザーをsudoersに追加
      ## NOPASSWD: ALLの「:」でエラーが出るので以下のようにネスト
      ## または NOPASSWD:ALL とスペースをなくす
      ## または - lineinfile: "regexp='^%wheel' line='%wheel ALL=(ALL) NOPASSWD: ALL' dest=/etc/sudoers"
      ## のように全体を"でくくる
      lineinfile: 
        dest: '/etc/sudoers'
        backup: yes
        state: present
        regexp: '^ansible'
        line: 'ansible ALL=(ALL) NOPASSWD: ALL'

    - name: ansibleユーザにsshアクセス用PublicKeyを設定
      authorized_key: user={{ item['name'] }} 
        key="{{ lookup('file', item['key']) }}"
      with_items: sshuser

    - name: ansibleディレクトリを作成
      file: path={{userhome}}/ansible state=directory owner=ansible group=ansible

    - name: Best Practicesに沿ったディレクトリを作成するPlaybookをダウンロード
      get_url: url={{ansible_dir_yml_url}} dest={{userhome}}/ansible/ansible-directories.yml owner=ansible group=ansible

    - name: configure sshd_config
      lineinfile: dest='/etc/ssh/sshd_config'
        backup=yes
        state=present
        regexp="{{item.regexp}}"
        insertafter="{{item.insertafter}}"
        line="{{item.line}}"
      with_items:
        # Root ログイン禁止
        - regexp: '^PermitRootLogin'
          line: 'PermitRootLogin no'
          insertafter: '#PermitRootLogin'
        # 公開鍵認証を許可
        - regexp: '^PubkeyAuthentication'
          line: 'PubkeyAuthentication yes'
          insertafter: '#PubkeyAuthentication'
        # 公開鍵認証を許可
        - regexp: '^AuthorizedKeysFile'
          line: 'AuthorizedKeysFile       .ssh/authorized_keys'
          insertafter: '#AuthorizedKeysFile'
        # パスワード認証禁止
        - regexp: '^PasswordAuthentication'
          line: 'PasswordAuthentication no'
          insertafter: '#PasswordAuthentication'
        # パスワード認証禁止
        - regexp: '^UsePAM'
          line: 'UsePAM no'
          insertafter: '#UsePAM'
        # パスワード認証禁止
        - regexp: '^ChallengeResponseAuthentication'
          line: 'ChallengeResponseAuthentication no'
          insertafter: '#ChallengeResponseAuthentication'

ansibleでログイン

  1. Best Practicesに沿ったディレクトリをansibleユーザhomeに作成
$ cd ~/ansible
$ ansible-playbook --extra-vars '{"roles":["common", "mysql", "webserver"]}' ansible-directories.yml
  OR
$ ansible-playbook --extra-vars 'roles=apache' ansible-directories.yml

構成は以下のとおりです。

root
 │ hosts
 │ site.yml
 ├─ group_vars
 │    {group name}
 └─ roles
     └─ {role name}
         ├─ files
         │    {file name}
         ├─ handlers
         │    main.yml
         ├─ tasks
         │    main.yml
         └─ templates
              {template name}
ディレクトリ/ファイル説明
hosts実行対象サーバーの定義ファイル。複数のマシンをグループにわけて定義。
site.ymlサーバーに実行させるroleを定義
group_varsグループ変数の定義ファイルの格納ディレクトリ。hosts内で定義されたグループごとに別々の変数を定義。
roles/handlers起動コマンドなどを定義するファイルの格納ディレクトリ。例えばMySQLのrestartコマンドなどはここで定義
roles/tasksメインタスクを定義するファイルの格納ディレクトリ。
roles/filesシステムで使用される静的なファイルの格納ディレクトリ。packageのrepファイルやconfigのファイルを格納。
roles/templatesシステムで使用される動的に更新するファイルの格納ディレクトリ。taskの実行結果やgroup_varsの値によってconfigを書き換える必要がある場合に利用。

被管理側ホストの設定

参考

1)
お仕事の成果を流用してるので、TargetがCentOSです
serverapps/configmgmt/ansible/like-a-tutorial.txt · 最終更新: 2017/04/14 14:21 (外部編集)