serverapps:configmgmt:ansible:like-a-tutorial
チュートリアルのようなもの
多分、一般的にはこれをチュートリアルとは言わないと思います。
ほぼ素の仮想マシンを用意して、その環境設定を一から行っていきます。
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を作成
- rootパスワード変更
- ansibleユーザを追加
- ansibleユーザが被管理ホストにアクセスする為のssh keyを作成
- ansibleユーザがsudo可能に設定
- ansibleユーザにsshアクセス用PublicKeyを設定
- Best Practicesに沿ったディレクトリを作成するPlaybookをダウンロード
- sshの設定
- rootのsshアクセスを禁止
- 公開鍵によるsshアクセスを許可
- パスワード認証禁止
- 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でログイン
- 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 05:21 by 127.0.0.1