[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CXPGFHH3EEDZ7ZWYRFAQSD":3,"skill-same:01M6CXPGFHH3EEDZ7ZWYRFAQSD":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":50,"install":51,"resources":64},"01M6CXPGFHH3EEDZ7ZWYRFAQSD","automation",null,"Infrastructure automation and configuration management using Ansible, Terraform, and CI\u002FCD pipelines","ffsshhttiikk\u002Fopencode-agents-skills","ffsshhttiikk","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F226346827?v=4","01M6CWD9RR3Y7VRQX3MXYC8FYH","01M6CWD9WVPYAZW0J82G1VKGHY",3,"MIT","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fsystems-administration\u002Fautomation\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[5,26,27,28,29,30,31,32,33,34,35],"infrastructure","terraform","ci","ansible","management","devops","opencode","pipelines","configuration","configuration management","2026-11-10 10:12:30",false,"---\nname: automation\ndescription: Infrastructure automation and configuration management using Ansible, Terraform, and CI\u002FCD pipelines\nlicense: MIT\ncompatibility: opencode\nmetadata:\n  audience: devops-engineers\n  category: systems-administration\n---\n\n## What I do\n- Write Ansible playbooks and roles\n- Create Terraform infrastructure code\n- Design CI\u002FCD pipelines\n- Implement GitOps workflows\n- Automate deployment processes\n- Manage configuration drift\n- Create self-service infrastructure\n- Implement policy as code\n- Automate testing and validation\n- Orchestrate multi-cloud deployments\n\n## When to use me\nWhen automating infrastructure provisioning, configuring systems, or building CI\u002FCD pipelines for deployments.\n\n## Core Concepts\n- Infrastructure as Code (IaC)\n- Configuration management\n- CI\u002FCD pipeline design\n- GitOps workflows\n- Terraform and Ansible fundamentals\n- Secret management\n- Pipeline parallelization\n- Blue-green and canary deployments\n- Feature flags\n- Infrastructure testing\n\n## Code Examples\n\n### Ansible Playbooks\n```yaml\n# site.yml - Main playbook\n---\n- name: Common system configuration\n  hosts: all\n  become: true\n  gather_facts: true\n  vars:\n    common_packages:\n      - vim\n      - curl\n      - wget\n      - htop\n      - net-tools\n      - git\n      - unzip\n    ntp_servers:\n      - 0.pool.ntp.org\n      - 1.pool.ntp.org\n  pre_tasks:\n    - name: Check connection\n      ping:\n    - name: Display facts\n      debug:\n        msg: \"Host {{ ansible_fqdn }} has {{ ansible_memory_mb.real.total }}MB RAM\"\n  roles:\n    - role: common\n    - role: users\n    - role: security\n  handlers:\n    - name: Restart rsyslog\n      service:\n        name: rsyslog\n        state: restarted\n```\n\n```yaml\n# roles\u002Fcommon\u002Ftasks\u002Fmain.yml\n---\n- name: Install common packages\n  apt:\n    name: \"{{ common_packages }}\"\n    state: present\n    update_cache: yes\n    cache_valid_time: 3600\n  notify: Check services\n\n- name: Configure NTP\n  template:\n    src: ntp.conf.j2\n    dest: \u002Fetc\u002Fntp.conf\n    mode: 0644\n    validate: ntpq -p -c config %s\n  notify: Restart NTP\n\n- name: Configure timezone\n  community.general.timezone:\n    name: \"{{ timezone | default('UTC') }}\"\n\n- name: Setup sysctl parameters\n  sysctl:\n    name: \"{{ item.name }}\"\n    value: \"{{ item.value }}\"\n    state: present\n    reload: yes\n  loop:\n    - name: net.ipv4.ip_forward\n      value: '1'\n    - name: vm.swappiness\n      value: '10'\n    - name: fs.file-max\n      value: '2097152'\n\n- name: Ensure log directory exists\n  file:\n    path: \u002Fvar\u002Flog\u002Faudit\n    state: directory\n    mode: '0750'\n```\n\n```yaml\n# roles\u002Fsecurity\u002Ftasks\u002Fmain.yml\n---\n- name: Configure firewall\n  ufw:\n    state: enabled\n    policy: deny\n\n- name: Allow SSH\n  ufw:\n    rule: allow\n    to_port: \"{{ ssh_port | default('22') }}\"\n    proto: tcp\n\n- name: Allow HTTP\u002FHTTPS\n  ufw:\n    rule: allow\n    name: www-full\n\n- name: Install fail2ban\n  apt:\n    name: fail2ban\n    state: present\n\n- name: Configure fail2ban\n  template:\n    src: fail2ban.local.j2\n    dest: \u002Fetc\u002Ffail2ban\u002Fjail.local\n    mode: 0644\n  notify: Restart fail2ban\n\n- name: Disable root SSH login\n  lineinfile:\n    dest: \u002Fetc\u002Fssh\u002Fsshd_config\n    regexp: \"^PermitRootLogin\"\n    line: \"PermitRootLogin no\"\n    state: present\n  notify: Restart SSH\n\n- name: Set SSH password authentication\n  lineinfile:\n    dest: \u002Fetc\u002Fssh\u002Fsshd_config\n    regexp: \"^PasswordAuthentication\"\n    line: \"PasswordAuthentication yes\"\n    state: present\n```\n\n### Terraform Configuration\n```hcl\n# main.tf - Infrastructure provisioning\nterraform {\n  required_version = \">= 1.5.0\"\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 5.0\"\n    }\n    random = {\n      source  = \"hashicorp\u002Frandom\"\n      version = \"~> 3.5\"\n    }\n  }\n  \n  backend \"s3\" {\n    bucket = \"terraform-state-bucket\"\n    key    = \"prod\u002Fterraform.tfstate\"\n    region = \"us-east-1\"\n    encrypt = true\n    dynamodb_table = \"terraform-lock\"\n  }\n}\n\n# Variables\nvariable \"environment\" {\n  type    = string\n  default = \"production\"\n}\n\nvariable \"instance_type\" {\n  type    = string\n  default = \"t3.medium\"\n}\n\nvariable \"desired_capacity\" {\n  type    = number\n  default = 3\n}\n\n# Provider\nprovider \"aws\" {\n  region = var.region\n  default_tags {\n    Environment = var.environment\n    ManagedBy   = \"Terraform\"\n    Project     = \"web-application\"\n  }\n}\n\n# Data sources\ndata \"aws_ami\" \"amazon_linux\" {\n  most_recent = true\n  owners      = [\"amazon\"]\n  \n  filter {\n    name   = \"name\"\n    values = [\"amzn2-ami-hvm-*-x86_64-gp2\"]\n  }\n}\n\ndata \"aws_vpc\" \"default\" {\n  default = true\n}\n\n# Resources\nresource \"aws_security_group\" \"web\" {\n  name        = \"${var.environment}-web-sg\"\n  description = \"Security group for web servers\"\n  vpc_id      = data.aws_vpc.default.id\n  \n  ingress {\n    from_port   = 80\n    to_port     = 80\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n  \n  ingress {\n    from_port   = 443\n    to_port     = 443\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n  \n  ingress {\n    from_port   = 22\n    to_port     = 22\n    protocol    = \"tcp\"\n    cidr_blocks = [\"10.0.0.0\u002F16\"]\n  }\n  \n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n}\n\nresource \"aws_launch_template\" \"web\" {\n  name_prefix   = \"${var.environment}-web-\"\n  image_id      = data.aws_ami.amazon_linux.id\n  instance_type = var.instance_type\n  \n  vpc_security_group_ids = [aws_security_group.web.id]\n  \n  iam_instance_profile {\n    name = aws_iam_instance_profile.web.name\n  }\n  \n  tag_specifications {\n    resource_type = \"instance\"\n    tags = {\n      Name        = \"${var.environment}-web\"\n      Environment = var.environment\n    }\n  }\n  \n  tag_specifications {\n    resource_type = \"volume\"\n    tags = {\n      Environment = var.environment\n    }\n  }\n}\n\nresource \"aws_autoscaling_group\" \"web\" {\n  name                = \"${var.environment}-web-asg\"\n  vpc_zone_identifier = [\"subnet-abc123\", \"subnet-def456\"]\n  target_group_arns   = [aws_lb_target_group.web.arn]\n  \n  launch_template {\n    id      = aws_launch_template.web.id\n    version = \"$Latest\"\n  }\n  \n  min_size         = var.desired_capacity\n  max_size         = var.desired_capacity * 3\n  desired_capacity = var.desired_capacity\n  \n  health_check_type         = \"ELB\"\n  health_check_grace_period = 300\n  \n  lifecycle {\n    create_before_destroy = true\n    ignore_changes        = [desired_capacity]\n  }\n  \n  tag {\n    key                 = \"Name\"\n    value                = \"${var.environment}-web\"\n    propagate_at_launch = true\n  }\n}\n\n# Outputs\noutput \"alb_dns_name\" {\n  description = \"DNS name of the load balancer\"\n  value       = aws_lb.web.dns_name\n}\n```\n\n### CI\u002FCD Pipeline\n```yaml\n# .github\u002Fworkflows\u002Fdeploy.yml\nname: CI\u002FCD Pipeline\n\non:\n  push:\n    branches: [main, develop]\n  pull_request:\n    branches: [main]\n\nenv:\n  AWS_REGION: us-east-1\n  ECR_REPOSITORY: app-repository\n  ECS_SERVICE: app-service\n  ECS_CLUSTER: app-cluster\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Setup Python\n        uses: actions\u002Fsetup-python@v5\n        with:\n          python-version: '3.11'\n      \n      - name: Install dependencies\n        run: |\n          python -m pip install --upgrade pip\n          pip install -r requirements.txt\n      \n      - name: Run linters\n        run: |\n          pip install ruff flake8\n          ruff check .\n          flake8 .\n      \n      - name: Run tests\n        run: |\n          pip install pytest pytest-cov\n          pytest --cov=app --cov-report=xml\n      \n      - name: Upload coverage\n        uses: codecov\u002Fcodecov-action@v3\n        with:\n          files: .\u002Fcoverage.xml\n\n  build:\n    needs: test\n    runs-on: ubuntu-latest\n    outputs:\n      image: ${{ steps.build-image.outputs.image }}\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Configure AWS credentials\n        uses: aws-actions\u002Fconfigure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ env.AWS_REGION }}\n      \n      - name: Login to Amazon ECR\n        id: login-ecr\n        uses: aws-actions\u002Famazon-ecr-login@v2\n      \n      - name: Build, tag, and push image to Amazon ECR\n        id: build-image\n        env:\n          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}\n          IMAGE_TAG: ${{ github.sha }}\n        run: |\n          docker build -t $ECR_REGISTRY\u002F$ECR_REPOSITORY:$IMAGE_TAG .\n          docker push $ECR_REGISTRY\u002F$ECR_REPOSITORY:$IMAGE_TAG\n          echo \"image=$ECR_REGISTRY\u002F$ECR_REPOSITORY:$IMAGE_TAG\" >> $GITHUB_OUTPUT\n\n  deploy-staging:\n    needs: build\n    runs-on: ubuntu-latest\n    environment: staging\n    steps:\n      - name: Checkout\n        uses: actions\u002Fcheckout@v4\n      \n      - name: Configure AWS credentials\n        uses: aws-actions\u002Fconfigure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ env.AWS_REGION }}\n      \n      - name: Update ECS service\n        uses: aws-actions\u002Famazon-ecs-deploy-task-definition@v1\n        with:\n          task-definition: task-definition-staging.json\n          service: ${{ env.ECS_SERVICE }}\n          cluster: ${{ env.ECS_CLUSTER }}\n          wait-for-service-stability: true\n\n  deploy-production:\n    needs: deploy-staging\n    runs-on: ubuntu-latest\n    environment: production\n    steps:\n      - name: Checkout\n        uses: actions\u002Fcheckout@v4\n      \n      - name: Configure AWS credentials\n        uses: aws-actions\u002Fconfigure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ env.AWS_REGION }}\n      \n      - name: Update ECS service (Blue-Green)\n        uses: aws-actions\u002Famazon-ecs-deploy-task-definition@v1\n        with:\n          task-definition: task-definition-production.json\n          service: ${{ env.ECS_SERVICE }}\n          cluster: ${{ env.ECS_CLUSTER }}\n          wait-for-service-stability: true\n          codedeploy-appspec: appspec.yml\n          codedeploy-application: my-ecs-application\n          codedeploy-deployment-group: my-dg\n```\n\n### Ansible Vault for Secrets\n```bash\n#!\u002Fbin\u002Fbash\n# vault_management.sh\n\n# Create encrypted vault file\nansible-vault create group_vars\u002Fall\u002Fvault.yml\n\n# View vault contents\nansible-vault view group_vars\u002Fall\u002Fvault.yml\n\n# Edit vault\nansible-vault edit group_vars\u002Fall\u002Fvault.yml\n\n# Decrypt for editing\nansible-vault decrypt group_vars\u002Fall\u002Fvault.yml --output=vault-decrypted.yml\n\n# Encrypt after editing\nansible-vault encrypt vault-decrypted.yml --output=group_vars\u002Fall\u002Fvault.yml\nrm vault-decrypted.yml\n\n# Run playbook with vault\nansible-playbook site.yml --ask-vault-pass\n\n# Using vault password file\necho \"my_secure_password\" > ~\u002F.vault_pass\nchmod 600 ~\u002F.vault_pass\nansible-playbook site.yml --vault-password-file ~\u002F.vault_pass\n```\n\n## Best Practices\n- Use version control for all infrastructure code\n- Implement state management for Terraform\n- Use modules to promote reuse\n- Implement proper secret management (Vault, SSM)\n- Design pipelines with proper approval gates\n- Use immutable infrastructure patterns\n- Implement proper testing (unit, integration, e2e)\n- Use feature flags for controlled rollouts\n- Maintain documentation alongside code\n- Implement proper rollback mechanisms\n","## What I do\n- Write Ansible playbooks and roles\n- Create Terraform infrastructure code\n- Design CI\u002FCD pipelines\n- Implement GitOps workflows\n- Automate deployment processes\n- Manage configuration drift\n- Create self-service infrastructure\n- Implement policy as code\n- Automate testing and validation\n- Orchestrate multi-cloud deployments\n\n## When to use me\nWhen automating infrastructure provisioning, configuring systems, or building CI\u002FCD pipelines for deployments.\n\n## Core Concepts\n- Infrastructure as Code (IaC)\n- Configuration management\n- CI\u002FCD pipeline design\n- GitOps workflows\n- Terraform and Ansible fundamentals\n- Secret management\n- Pipeline parallelization\n- Blue-green and canary deployments\n- Feature flags\n- Infrastructure testing\n\n## Code Examples\n\n### Ansible Playbooks\n```yaml\n# site.yml - Main playbook\n---\n- name: Common system configuration\n  hosts: all\n  become: true\n  gather_facts: true\n  vars:\n    common_packages:\n      - vim\n      - curl\n      - wget\n      - htop\n      - net-tools\n      - git\n      - unzip\n    ntp_servers:\n      - 0.pool.ntp.org\n      - 1.pool.ntp.org\n  pre_tasks:\n    - name: Check connection\n      ping:\n    - name: Display facts\n      debug:\n        msg: \"Host {{ ansible_fqdn }} has {{ ansible_memory_mb.real.total }}MB RAM\"\n  roles:\n    - role: common\n    - role: users\n    - role: security\n  handlers:\n    - name: Restart rsyslog\n      service:\n        name: rsyslog\n        state: restarted\n```\n\n```yaml\n# roles\u002Fcommon\u002Ftasks\u002Fmain.yml\n---\n- name: Install common packages\n  apt:\n    name: \"{{ common_packages }}\"\n    state: present\n    update_cache: yes\n    cache_valid_time: 3600\n  notify: Check services\n\n- name: Configure NTP\n  template:\n    src: ntp.conf.j2\n    dest: \u002Fetc\u002Fntp.conf\n    mode: 0644\n    validate: ntpq -p -c config %s\n  notify: Restart NTP\n\n- name: Configure timezone\n  community.general.timezone:\n    name: \"{{ timezone | default('UTC') }}\"\n\n- name: Setup sysctl parameters\n  sysctl:\n    name: \"{{ item.name }}\"\n    value: \"{{ item.value }}\"\n    state: present\n    reload: yes\n  loop:\n    - name: net.ipv4.ip_forward\n      value: '1'\n    - name: vm.swappiness\n      value: '10'\n    - name: fs.file-max\n      value: '2097152'\n\n- name: Ensure log directory exists\n  file:\n    path: \u002Fvar\u002Flog\u002Faudit\n    state: directory\n    mode: '0750'\n```\n\n```yaml\n# roles\u002Fsecurity\u002Ftasks\u002Fmain.yml\n---\n- name: Configure firewall\n  ufw:\n    state: enabled\n    policy: deny\n\n- name: Allow SSH\n  ufw:\n    rule: allow\n    to_port: \"{{ ssh_port | default('22') }}\"\n    proto: tcp\n\n- name: Allow HTTP\u002FHTTPS\n  ufw:\n    rule: allow\n    name: www-full\n\n- name: Install fail2ban\n  apt:\n    name: fail2ban\n    state: present\n\n- name: Configure fail2ban\n  template:\n    src: fail2ban.local.j2\n    dest: \u002Fetc\u002Ffail2ban\u002Fjail.local\n    mode: 0644\n  notify: Restart fail2ban\n\n- name: Disable root SSH login\n  lineinfile:\n    dest: \u002Fetc\u002Fssh\u002Fsshd_config\n    regexp: \"^PermitRootLogin\"\n    line: \"PermitRootLogin no\"\n    state: present\n  notify: Restart SSH\n\n- name: Set SSH password authentication\n  lineinfile:\n    dest: \u002Fetc\u002Fssh\u002Fsshd_config\n    regexp: \"^PasswordAuthentication\"\n    line: \"PasswordAuthentication yes\"\n    state: present\n```\n\n### Terraform Configuration\n```hcl\n# main.tf - Infrastructure provisioning\nterraform {\n  required_version = \">= 1.5.0\"\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 5.0\"\n    }\n    random = {\n      source  = \"hashicorp\u002Frandom\"\n      version = \"~> 3.5\"\n    }\n  }\n  \n  backend \"s3\" {\n    bucket = \"terraform-state-bucket\"\n    key    = \"prod\u002Fterraform.tfstate\"\n    region = \"us-east-1\"\n    encrypt = true\n    dynamodb_table = \"terraform-lock\"\n  }\n}\n\n# Variables\nvariable \"environment\" {\n  type    = string\n  default = \"production\"\n}\n\nvariable \"instance_type\" {\n  type    = string\n  default = \"t3.medium\"\n}\n\nvariable \"desired_capacity\" {\n  type    = number\n  default = 3\n}\n\n# Provider\nprovider \"aws\" {\n  region = var.region\n  default_tags {\n    Environment = var.environment\n    ManagedBy   = \"Terraform\"\n    Project     = \"web-application\"\n  }\n}\n\n# Data sources\ndata \"aws_ami\" \"amazon_linux\" {\n  most_recent = true\n  owners      = [\"amazon\"]\n  \n  filter {\n    name   = \"name\"\n    values = [\"amzn2-ami-hvm-*-x86_64-gp2\"]\n  }\n}\n\ndata \"aws_vpc\" \"default\" {\n  default = true\n}\n\n# Resources\nresource \"aws_security_group\" \"web\" {\n  name        = \"${var.environment}-web-sg\"\n  description = \"Security group for web servers\"\n  vpc_id      = data.aws_vpc.default.id\n  \n  ingress {\n    from_port   = 80\n    to_port     = 80\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n  \n  ingress {\n    from_port   = 443\n    to_port     = 443\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n  \n  ingress {\n    from_port   = 22\n    to_port     = 22\n    protocol    = \"tcp\"\n    cidr_blocks = [\"10.0.0.0\u002F16\"]\n  }\n  \n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\u002F0\"]\n  }\n}\n\nresource \"aws_launch_template\" \"web\" {\n  name_prefix   = \"${var.environment}-web-\"\n  image_id      = data.aws_ami.amazon_linux.id\n  instance_type = var.instance_type\n  \n  vpc_security_group_ids = [aws_security_group.web.id]\n  \n  iam_instance_profile {\n    name = aws_iam_instance_profile.web.name\n  }\n  \n  tag_specifications {\n    resource_type = \"instance\"\n    tags = {\n      Name        = \"${var.environment}-web\"\n      Environment = var.environment\n    }\n  }\n  \n  tag_specifications {\n    resource_type = \"volume\"\n    tags = {\n      Environment = var.environment\n    }\n  }\n}\n\nresource \"aws_autoscaling_group\" \"web\" {\n  name                = \"${var.environment}-web-asg\"\n  vpc_zone_identifier = [\"subnet-abc123\", \"subnet-def456\"]\n  target_group_arns   = [aws_lb_target_group.web.arn]\n  \n  launch_template {\n    id      = aws_launch_template.web.id\n    version = \"$Latest\"\n  }\n  \n  min_size         = var.desired_capacity\n  max_size         = var.desired_capacity * 3\n  desired_capacity = var.desired_capacity\n  \n  health_check_type         = \"ELB\"\n  health_check_grace_period = 300\n  \n  lifecycle {\n    create_before_destroy = true\n    ignore_changes        = [desired_capacity]\n  }\n  \n  tag {\n    key                 = \"Name\"\n    value                = \"${var.environment}-web\"\n    propagate_at_launch = true\n  }\n}\n\n# Outputs\noutput \"alb_dns_name\" {\n  description = \"DNS name of the load balancer\"\n  value       = aws_lb.web.dns_name\n}\n```\n\n### CI\u002FCD Pipeline\n```yaml\n# .github\u002Fworkflows\u002Fdeploy.yml\nname: CI\u002FCD Pipeline\n\non:\n  push:\n    branches: [main, develop]\n  pull_request:\n    branches: [main]\n\nenv:\n  AWS_REGION: us-east-1\n  ECR_REPOSITORY: app-repository\n  ECS_SERVICE: app-service\n  ECS_CLUSTER: app-cluster\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Setup Python\n        uses: actions\u002Fsetup-python@v5\n        with:\n          python-version: '3.11'\n      \n      - name: Install dependencies\n        run: |\n          python -m pip install --upgrade pip\n          pip install -r requirements.txt\n      \n      - name: Run linters\n        run: |\n          pip install ruff flake8\n          ruff check .\n          flake8 .\n      \n      - name: Run tests\n        run: |\n          pip install pytest pytest-cov\n          pytest --cov=app --cov-report=xml\n      \n      - name: Upload coverage\n        uses: codecov\u002Fcodecov-action@v3\n        with:\n          files: .\u002Fcoverage.xml\n\n  build:\n    needs: test\n    runs-on: ubuntu-latest\n    outputs:\n      image: ${{ steps.build-image.outputs.image }}\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      \n      - name: Configure AWS credentials\n        uses: aws-actions\u002Fconfigure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ env.AWS_REGION }}\n      \n      - name: Login to Amazon ECR\n        id: login-ecr\n        uses: aws-actions\u002Famazon-ecr-login@v2\n      \n      - name: Build, tag, and push image to Amazon ECR\n        id: build-image\n        env:\n          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}\n          IMAGE_TAG: ${{ github.sha }}\n        run: |\n          docker build -t $ECR_REGISTRY\u002F$ECR_REPOSITORY:$IMAGE_TAG .\n          docker push $ECR_REGISTRY\u002F$ECR_REPOSITORY:$IMAGE_TAG\n          echo \"image=$ECR_REGISTRY\u002F$ECR_REPOSITORY:$IMAGE_TAG\" >> $GITHUB_OUTPUT\n\n  deploy-staging:\n    needs: build\n    runs-on: ubuntu-latest\n    environment: staging\n    steps:\n      - name: Checkout\n        uses: actions\u002Fcheckout@v4\n      \n      - name: Configure AWS credentials\n        uses: aws-actions\u002Fconfigure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ env.AWS_REGION }}\n      \n      - name: Update ECS service\n        uses: aws-actions\u002Famazon-ecs-deploy-task-definition@v1\n        with:\n          task-definition: task-definition-staging.json\n          service: ${{ env.ECS_SERVICE }}\n          cluster: ${{ env.ECS_CLUSTER }}\n          wait-for-service-stability: true\n\n  deploy-production:\n    needs: deploy-staging\n    runs-on: ubuntu-latest\n    environment: production\n    steps:\n      - name: Checkout\n        uses: actions\u002Fcheckout@v4\n      \n      - name: Configure AWS credentials\n        uses: aws-actions\u002Fconfigure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ env.AWS_REGION }}\n      \n      - name: Update ECS service (Blue-Green)\n        uses: aws-actions\u002Famazon-ecs-deploy-task-definition@v1\n        with:\n          task-definition: task-definition-production.json\n          service: ${{ env.ECS_SERVICE }}\n          cluster: ${{ env.ECS_CLUSTER }}\n          wait-for-service-stability: true\n          codedeploy-appspec: appspec.yml\n          codedeploy-application: my-ecs-application\n          codedeploy-deployment-group: my-dg\n```\n\n### Ansible Vault for Secrets\n```bash\n#!\u002Fbin\u002Fbash\n# vault_management.sh\n\n# Create encrypted vault file\nansible-vault create group_vars\u002Fall\u002Fvault.yml\n\n# View vault contents\nansible-vault view group_vars\u002Fall\u002Fvault.yml\n\n# Edit vault\nansible-vault edit group_vars\u002Fall\u002Fvault.yml\n\n# Decrypt for editing\nansible-vault decrypt group_vars\u002Fall\u002Fvault.yml --output=vault-decrypted.yml\n\n# Encrypt after editing\nansible-vault encrypt vault-decrypted.yml --output=group_vars\u002Fall\u002Fvault.yml\nrm vault-decrypted.yml\n\n# Run playbook with vault\nansible-playbook site.yml --ask-vault-pass\n\n# Using vault password file\necho \"my_secure_password\" > ~\u002F.vault_pass\nchmod 600 ~\u002F.vault_pass\nansible-playbook site.yml --vault-password-file ~\u002F.vault_pass\n```\n\n## Best Practices\n- Use version control for all infrastructure code\n- Implement state management for Terraform\n- Use modules to promote reuse\n- Implement proper secret management (Vault, SSM)\n- Design pipelines with proper approval gates\n- Use immutable infrastructure patterns\n- Implement proper testing (unit, integration, e2e)\n- Use feature flags for controlled rollouts\n- Maintain documentation alongside code\n- Implement proper rollback mechanisms\n",{"name":5,"license":14,"metadata":41,"description":7,"compatibility":32},{"audience":42,"category":43},"devops-engineers","systems-administration","main","5f7a3e453c98261f93d19a6a7de44ad8f7b72d41","systems-administration\u002Fautomation",2,"https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk","2026-03-01 06:55:40",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add ffsshhttiikk\u002Fopencode-agents-skills --skill automation",{"tool":57,"command":58},"bunx","bunx skills add ffsshhttiikk\u002Fopencode-agents-skills --skill automation",{"tool":60,"command":61},"pnpm","pnpm dlx skills add ffsshhttiikk\u002Fopencode-agents-skills --skill automation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fsystems-administration\u002Fautomation\u002FSKILL.md",true,[],[66,77,87,96,106,115],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":36},"01M6CXT9TXDF79BWJTMQAPB49G","xamarin","Xamarin cross-platform development","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fxamarin\u002FSKILL.md",[],[68,73,74,75,32,76],"platform","cross-platform","mobile","development",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":36},"01M6CXT8AD04MFYDA32VW3FKAG","wrangling","Data wrangling fundamentals","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwrangling\u002FSKILL.md",[],[79,84,32,85,86],"data wrangling","science","data",{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":36},"01M6CXT717GCN7SRRNPBDP4508","windows","Windows operating system administration and scripting","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwindows\u002FSKILL.md",[],[89,94,32,95],"system","scripting",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":36},"01M6CXT54K794NMEM3XAPZZDKT","wide-column","Wide-column data model","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwide-column\u002FSKILL.md",[],[103,104,32,105,86],"wide column","databases","model",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":36},"01M6CXT28FMT2P4V9GZE67WA8E","wide-column-stores","Wide-column database stores","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwide-column-stores\u002FSKILL.md",[],[113,104,32,114],"wide column stores","database",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":36},"01M6CXT0D0M0Q4T2N7C2RX7DSN","websockets","WebSocket implementation and best practices","https:\u002F\u002Fgithub.com\u002Fffsshhttiikk\u002Fopencode-agents-skills\u002Fblob\u002Fmain\u002Fwebsockets\u002FSKILL.md",[],[117,122,123,124,32,125,126],"websocket","real-time","time","best practices","implementation"]